Thông báo

Collapse
No announcement yet.

xin hỏi về cách tính giá trị trong timer/couter cho avr!

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • xin hỏi về cách tính giá trị trong timer/couter cho avr!

    các bác cho em hỏi: nếu mạch ứng dụng có nguồn dao động là 12MHz, có phải 12 nhịp hết 1us không ạ?
    vậy nếu em chọn nguồn xung nhịp cho T/C0 là 1024 thì 1 nhịp bây giờ là hết bao nhiêu thời gian vậy ạ?
    em xin cảm ơn!

  • #2
    Hi hi chúng ta lại gặp nhau, xin lỗi vì bận nên đã ko kịp trả lời cho bạn trong bài trước, OK giờ mình xin khẳng định trước là bạn phải tìm hiểu thêm nhiều đấy, cụ thể là nên coi và hiểu cho kỹ cái datasheet tiếng Anh của nó đi. Chuyện đó là của bạn giờ mình vào vấn đề chính.
    _Mình gần như đã cày nát 70% ứng dụng cùng hàng tá tài liệu về AVR và xin khẳng định là ko 1 tài liệu nào nói về bao nhiêu chu kì xung thạch anh thì tạo ra 1 nhịp trong AVR, và cũng ko hề nói là bao nhiêu nhịp thì AVR xử lý hết 1us (trừ các ứng dụng đặc biệt), khác với họ 89 nói toẹt ra hết mà ko bít có chính xác ko?? Thậm chí còn có tài liệu nói là trong AVR có bộ khuếch đại xung 4x (cái này mình kiểm chứng datasheet có nói), do đó có thằng hô là giả sử thạch anh 8Mhz thì bộ xử lý sẽ chạy với tần số 32Mhz (cái này mình nghi lũ nào đó chém bão), bù lại cho sự mập mờ đó thì nhà sx quy chuẩn hóa các tần số hoạt động cố định và chính xác cho các bộ timer tiện cho người dùng ko cần quan tâm nhiều đến cái xung nhịp thạch anh của họ.
    _Việc bạn chọn Prescaler = 1024 là quá rõ ràng rồi, bạn ko tính được thời gian timer hoạt động do ko đọc kĩ datasheet thôi, giả sử thạch anh mình dùng là 16Mhz thì với prescaler =1024 thì 1 tần số đếm của timer (nhớ là của timer chứ ko phải của MCU nha) hết 16Mhz/1024 = 15625Hz=15.625Mhz -> 1 nhịp đếm của timer hết 1/15625=6.4x10 mũ -5 s = 64us. Nếu là timer 8 bit thì khi tràn timer đếm đến 255 tức là hết 64x255=16320us=16.320ms.
    _Từ đó bạn có thể hiểu ra chọn prescaler càng nhỏ thì tần số đếm của timer càng cao, theo công thức trên bạn cũng tính ra 1 nhịp đếm của timer hết bao nhiêu thời gian.
    Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
    Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

    Comment


    • #3
      Nguyên văn bởi hoahauvn2 Xem bài viết
      Hi hi chúng ta lại gặp nhau, xin lỗi vì bận nên đã ko kịp trả lời cho bạn trong bài trước, OK giờ mình xin khẳng định trước là bạn phải tìm hiểu thêm nhiều đấy, cụ thể là nên coi và hiểu cho kỹ cái datasheet tiếng Anh của nó đi. Chuyện đó là của bạn giờ mình vào vấn đề chính.
      _Mình gần như đã cày nát 70% ứng dụng cùng hàng tá tài liệu về AVR và xin khẳng định là ko 1 tài liệu nào nói về bao nhiêu chu kì xung thạch anh thì tạo ra 1 nhịp trong AVR, và cũng ko hề nói là bao nhiêu nhịp thì AVR xử lý hết 1us (trừ các ứng dụng đặc biệt), khác với họ 89 nói toẹt ra hết mà ko bít có chính xác ko?? Thậm chí còn có tài liệu nói là trong AVR có bộ khuếch đại xung 4x (cái này mình kiểm chứng datasheet có nói), do đó có thằng hô là giả sử thạch anh 8Mhz thì bộ xử lý sẽ chạy với tần số 32Mhz (cái này mình nghi lũ nào đó chém bão), bù lại cho sự mập mờ đó thì nhà sx quy chuẩn hóa các tần số hoạt động cố định và chính xác cho các bộ timer tiện cho người dùng ko cần quan tâm nhiều đến cái xung nhịp thạch anh của họ.
      _Việc bạn chọn Prescaler = 1024 là quá rõ ràng rồi, bạn ko tính được thời gian timer hoạt động do ko đọc kĩ datasheet thôi, giả sử thạch anh mình dùng là 16Mhz thì với prescaler =1024 thì 1 tần số đếm của timer (nhớ là của timer chứ ko phải của MCU nha) hết 16Mhz/1024 = 15625Hz=15.625Mhz -> 1 nhịp đếm của timer hết 1/15625=6.4x10 mũ -5 s = 64us. Nếu là timer 8 bit thì khi tràn timer đếm đến 255 tức là hết 64x255=16320us=16.320ms.
      _Từ đó bạn có thể hiểu ra chọn prescaler càng nhỏ thì tần số đếm của timer càng cao, theo công thức trên bạn cũng tính ra 1 nhịp đếm của timer hết bao nhiêu thời gian.
      sao ko có bạn, thường thì AVR đa số là loại 16MIPS chạy thạch anh 16MHz, 16 triệu lệnh trên giây vậy thì 1 xung chạy 1 lệnh.

      Comment


      • #4
        Nguyên văn bởi chung1608 Xem bài viết
        sao ko có bạn, thường thì AVR đa số là loại 16MIPS chạy thạch anh 16MHz, 16 triệu lệnh trên giây vậy thì 1 xung chạy 1 lệnh.
        Uh thông thường đúng là như thế, nhưng mình đọc datasheet thì ko thấy đề cập và cũng đặt câu hỏi cho chính nhà sx thì họ từ chối trả lời, còn hỏi các thầy thì các thầy nói chưa từng nghe về cái vụ 1 xung 1 lện đối với AVR.
        Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
        Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

        Comment


        • #5
          Nguyên văn bởi hoahauvn2 Xem bài viết
          Hi hi chúng ta lại gặp nhau, xin lỗi vì bận nên đã ko kịp trả lời cho bạn trong bài trước, OK giờ mình xin khẳng định trước là bạn phải tìm hiểu thêm nhiều đấy, cụ thể là nên coi và hiểu cho kỹ cái datasheet tiếng Anh của nó đi. Chuyện đó là của bạn giờ mình vào vấn đề chính.
          _Mình gần như đã cày nát 70% ứng dụng cùng hàng tá tài liệu về AVR và xin khẳng định là ko 1 tài liệu nào nói về bao nhiêu chu kì xung thạch anh thì tạo ra 1 nhịp trong AVR, và cũng ko hề nói là bao nhiêu nhịp thì AVR xử lý hết 1us (trừ các ứng dụng đặc biệt), khác với họ 89 nói toẹt ra hết mà ko bít có chính xác ko?? Thậm chí còn có tài liệu nói là trong AVR có bộ khuếch đại xung 4x (cái này mình kiểm chứng datasheet có nói), do đó có thằng hô là giả sử thạch anh 8Mhz thì bộ xử lý sẽ chạy với tần số 32Mhz (cái này mình nghi lũ nào đó chém bão), bù lại cho sự mập mờ đó thì nhà sx quy chuẩn hóa các tần số hoạt động cố định và chính xác cho các bộ timer tiện cho người dùng ko cần quan tâm nhiều đến cái xung nhịp thạch anh của họ.
          _Việc bạn chọn Prescaler = 1024 là quá rõ ràng rồi, bạn ko tính được thời gian timer hoạt động do ko đọc kĩ datasheet thôi, giả sử thạch anh mình dùng là 16Mhz thì với prescaler =1024 thì 1 tần số đếm của timer (nhớ là của timer chứ ko phải của MCU nha) hết 16Mhz/1024 = 15625Hz=15.625Mhz -> 1 nhịp đếm của timer hết 1/15625=6.4x10 mũ -5 s = 64us. Nếu là timer 8 bit thì khi tràn timer đếm đến 255 tức là hết 64x255=16320us=16.320ms.
          _Từ đó bạn có thể hiểu ra chọn prescaler càng nhỏ thì tần số đếm của timer càng cao, theo công thức trên bạn cũng tính ra 1 nhịp đếm của timer hết bao nhiêu thời gian.
          bla bla bla! bác thật tuyệt vời đó! bác lại giúp em một khoản rất quan trọng với em! cảm ơn bác thế nào cho đủ đây nhỉ? hi
          bác cho em làm quen đi, em thấy khoái bác rồi đó! bác giờ đi làm hay vẫn học vậy? cho em biết chút thông tin về bác đi! ^^

          Comment


          • #6
            Nguyên văn bởi hoahauvn2 Xem bài viết
            Hi hi chúng ta lại gặp nhau, xin lỗi vì bận nên đã ko kịp trả lời cho bạn trong bài trước, OK giờ mình xin khẳng định trước là bạn phải tìm hiểu thêm nhiều đấy, cụ thể là nên coi và hiểu cho kỹ cái datasheet tiếng Anh của nó đi. Chuyện đó là của bạn giờ mình vào vấn đề chính.
            _Mình gần như đã cày nát 70% ứng dụng cùng hàng tá tài liệu về AVR và xin khẳng định là ko 1 tài liệu nào nói về bao nhiêu chu kì xung thạch anh thì tạo ra 1 nhịp trong AVR, và cũng ko hề nói là bao nhiêu nhịp thì AVR xử lý hết 1us (trừ các ứng dụng đặc biệt), khác với họ 89 nói toẹt ra hết mà ko bít có chính xác ko?? Thậm chí còn có tài liệu nói là trong AVR có bộ khuếch đại xung 4x (cái này mình kiểm chứng datasheet có nói), do đó có thằng hô là giả sử thạch anh 8Mhz thì bộ xử lý sẽ chạy với tần số 32Mhz (cái này mình nghi lũ nào đó chém bão), bù lại cho sự mập mờ đó thì nhà sx quy chuẩn hóa các tần số hoạt động cố định và chính xác cho các bộ timer tiện cho người dùng ko cần quan tâm nhiều đến cái xung nhịp thạch anh của họ.
            _Việc bạn chọn Prescaler = 1024 là quá rõ ràng rồi, bạn ko tính được thời gian timer hoạt động do ko đọc kĩ datasheet thôi, giả sử thạch anh mình dùng là 16Mhz thì với prescaler =1024 thì 1 tần số đếm của timer (nhớ là của timer chứ ko phải của MCU nha) hết 16Mhz/1024 = 15625Hz=15.625Mhz -> 1 nhịp đếm của timer hết 1/15625=6.4x10 mũ -5 s = 64us. Nếu là timer 8 bit thì khi tràn timer đếm đến 255 tức là hết 64x255=16320us=16.320ms.
            _Từ đó bạn có thể hiểu ra chọn prescaler càng nhỏ thì tần số đếm của timer càng cao, theo công thức trên bạn cũng tính ra 1 nhịp đếm của timer hết bao nhiêu thời gian.
            bác ơi! bác giúp em về cái thuật toán này với ạ:
            em có tất cả 5 bóng đèn (4 nhỏ, 1 to), mỗi bóng được điều khiển bởi 1 bit của portc, nếu 4 bóng đèn nhỏ mà cùng tắt, thì điều khiển bóng đèn to mở.
            còn nếu không, thì bóng đèn to tắt!
            vậy cấu trúc câu lệnh là gì vậy ạ?
            em thanks thanks tiếp nhá!hi

            Comment


            • #7
              Nguyên văn bởi ninh_bk_1991 Xem bài viết
              bác ơi! bác giúp em về cái thuật toán này với ạ:
              em có tất cả 5 bóng đèn (4 nhỏ, 1 to), mỗi bóng được điều khiển bởi 1 bit của portc, nếu 4 bóng đèn nhỏ mà cùng tắt, thì điều khiển bóng đèn to mở.
              còn nếu không, thì bóng đèn to tắt!
              vậy cấu trúc câu lệnh là gì vậy ạ?
              em thanks thanks tiếp nhá!hi
              Uhh theo cái đề bài bạn đưa ra thì mình hiểu thế này: 4 bóng đèn nhỏ sẽ được điều khiển bằng các lệnh đơn xuất PORT trực tiếp, riêng bóng đèn lớn sẽ phải bật tắt hoàn toàn tự động dựa trên trạng thái của 4 bóng đèn nhỏ.
              Nếu đúng như mình nghĩ thì mình sẽ giúp bạn 1 code nho nhỏ để minh họa cho bạn.
              Mình lấy ví dụ PORTC.0; C.1; C.2; C.3 là 4 Port dùng điều khiển 4 đèn nhỏ (Mức logic 0 là ON, mức logic 1 là OFF). PORTC.4 điều khiển đèn to (0 ON, 1 OFF).
              Đầu tiên bạn sẽ thiết lập trạng thái cho 4 bóng đèn nhỏ trước (mình ví dụ 2 sáng 2 tắt)
              PORTC.0=1;
              PORTC.1=1;
              PORTC.2=0;
              PORTC.3=0;

              Xong phần đơn giản giờ đến phần ít đơn giản hơn nhưng cũng khá đơn giản là điều khiển cái bóng đèn lớn theo trạng thái 4 bóng đèn nhỏ (4 bóng nhỏ cùng tắt thì bật bóng to, còn nếu chỉ cần 1 bóng đèn nhỏ bất kì sáng thì tắt đèn to)
              If (PINC.0==1&&PINC.1==1&&PINC.2==1&&PINC.3==1)
              {
              PORTC.4=0;
              }
              Else
              {
              PORTC.4=1;
              };

              Đó chỉ đơn giản thế thôi nhưng có lẽ mình nên giải thích chút cho dễ hiểu
              _Cái câu điều kiện dài dài trong hàm if (PIN…..) có nghĩa là nếu giá trị logic tại chân C.0=1 và C.1=1 và C.2=1 và C.3=1 thì sẽ xuất tín hiệu 0 ra chân C.4 (bật đèn lớn), lưu ý là khi xét đọc giá trị logic tại 1 chân port thì phải dùng lện PIN chứ ko phải PORT
              _Cái đoạn else có nghĩa là nếu ko thỏa điều kiện của if bên trên có nghĩa là chỉ cần 1 đèn nhỏ bất kì nào đó được bật thì sẽ xuất tín hiệu mức 1 ra chân C.4 (tắt đèn lớn).
              Rồi đó bạn có thể theo đó viết 1 code hoàn chỉnh rồi cho chạy mô phỏng kiểm chứng.
              Còn về bản thân mình thì thật sự mình là 1 sv điện tử - tự động tốt nghiệp được 1 năm rồi, sau 1 năm lăn lộn ngoài đời thấy còn kém quá, đồng thời cũng ko mặn mà cái việc ngày ngồi 8 tiếng (phí thời gian) nên bay về trường tu lên tiếp, cái nick của bạn có chữ bk bạn học Bách Khoa àh ??? nếu là BKtpHCM thì mình gặp nhau được đấy.
              Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
              Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

              Comment


              • #8
                Nguyên văn bởi hoahauvn2 Xem bài viết
                Uhh theo cái đề bài bạn đưa ra thì mình hiểu thế này: 4 bóng đèn nhỏ sẽ được điều khiển bằng các lệnh đơn xuất PORT trực tiếp, riêng bóng đèn lớn sẽ phải bật tắt hoàn toàn tự động dựa trên trạng thái của 4 bóng đèn nhỏ.
                Nếu đúng như mình nghĩ thì mình sẽ giúp bạn 1 code nho nhỏ để minh họa cho bạn.
                Mình lấy ví dụ PORTC.0; C.1; C.2; C.3 là 4 Port dùng điều khiển 4 đèn nhỏ (Mức logic 0 là ON, mức logic 1 là OFF). PORTC.4 điều khiển đèn to (0 ON, 1 OFF).
                Đầu tiên bạn sẽ thiết lập trạng thái cho 4 bóng đèn nhỏ trước (mình ví dụ 2 sáng 2 tắt)
                PORTC.0=1;
                PORTC.1=1;
                PORTC.2=0;
                PORTC.3=0;

                Xong phần đơn giản giờ đến phần ít đơn giản hơn nhưng cũng khá đơn giản là điều khiển cái bóng đèn lớn theo trạng thái 4 bóng đèn nhỏ (4 bóng nhỏ cùng tắt thì bật bóng to, còn nếu chỉ cần 1 bóng đèn nhỏ bất kì sáng thì tắt đèn to)
                If (PINC.0==1&&PINC.1==1&&PINC.2==1&&PINC.3==1)
                {
                PORTC.4=0;
                }
                Else
                {
                PORTC.4=1;
                };

                Đó chỉ đơn giản thế thôi nhưng có lẽ mình nên giải thích chút cho dễ hiểu
                _Cái câu điều kiện dài dài trong hàm if (PIN…..) có nghĩa là nếu giá trị logic tại chân C.0=1 và C.1=1 và C.2=1 và C.3=1 thì sẽ xuất tín hiệu 0 ra chân C.4 (bật đèn lớn), lưu ý là khi xét đọc giá trị logic tại 1 chân port thì phải dùng lện PIN chứ ko phải PORT
                _Cái đoạn else có nghĩa là nếu ko thỏa điều kiện của if bên trên có nghĩa là chỉ cần 1 đèn nhỏ bất kì nào đó được bật thì sẽ xuất tín hiệu mức 1 ra chân C.4 (tắt đèn lớn).
                Rồi đó bạn có thể theo đó viết 1 code hoàn chỉnh rồi cho chạy mô phỏng kiểm chứng.
                Còn về bản thân mình thì thật sự mình là 1 sv điện tử - tự động tốt nghiệp được 1 năm rồi, sau 1 năm lăn lộn ngoài đời thấy còn kém quá, đồng thời cũng ko mặn mà cái việc ngày ngồi 8 tiếng (phí thời gian) nên bay về trường tu lên tiếp, cái nick của bạn có chữ bk bạn học Bách Khoa àh ??? nếu là BKtpHCM thì mình gặp nhau được đấy.
                em không biết sao, những bài viết của bác cho em đó, nếu có bao nhiêu nút thanks em sẽ nhấn hết!^^
                em là sinh viên cơ điện tử năm 4 của bách khoa hà nội! tiếc quá là em và bác ở xa nhau! có dịp nào, em mong muốn được chiêm ngưỡng dung nhan của bác! hihi
                bác ra trường 1 năm mà em nghe uyên thâm quá!vậy mà bác kêu vậy, thế này chắc em chết rồi! giờ chẳng biết gì cả!
                bác có face chứ! cho em xin đi, thỉnh thoảng anh em mình chém gió tí! hihi
                một lần nữa cảm ơn bác nha! (mấu chốt của em là cái PIN đó) ^^

                Comment


                • #9
                  Nguyên văn bởi ninh_bk_1991 Xem bài viết
                  em không biết sao, những bài viết của bác cho em đó, nếu có bao nhiêu nút thanks em sẽ nhấn hết!^^
                  em là sinh viên cơ điện tử năm 4 của bách khoa hà nội! tiếc quá là em và bác ở xa nhau! có dịp nào, em mong muốn được chiêm ngưỡng dung nhan của bác! hihi
                  bác ra trường 1 năm mà em nghe uyên thâm quá!vậy mà bác kêu vậy, thế này chắc em chết rồi! giờ chẳng biết gì cả!
                  bác có face chứ! cho em xin đi, thỉnh thoảng anh em mình chém gió tí! hihi
                  một lần nữa cảm ơn bác nha! (mấu chốt của em là cái PIN đó) ^^
                  có yahoo: xcibax@yahoo.com có gì chat với nhau cho vui, còn về cái con AVR này ngày xưa mình cũng khổ với nó nhiều lắm, với lại lúc đó nó mới ra ít tài liệu, cũng phải nhờ các tiền bối khác trên diễn đàn này giúp, nay có tí kiến thức thì đi giúp lại các đàn em cho họ đỡ khổ để họ tập trung vào phát triển các ứng dụng mà hồi xưa mình còn chưa làm được.
                  Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
                  Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

                  Comment


                  • #10
                    Nguyên văn bởi hoahauvn2 Xem bài viết
                    có yahoo: xcibax@yahoo.com có gì chat với nhau cho vui, còn về cái con AVR này ngày xưa mình cũng khổ với nó nhiều lắm, với lại lúc đó nó mới ra ít tài liệu, cũng phải nhờ các tiền bối khác trên diễn đàn này giúp, nay có tí kiến thức thì đi giúp lại các đàn em cho họ đỡ khổ để họ tập trung vào phát triển các ứng dụng mà hồi xưa mình còn chưa làm được.
                    vâng! yahoo của em là ninh_bk_1991
                    em viết code bằng winavr, nhưng khi viết PINC.0,... thì nó báo lỗi, hay trong winavr cấu trúc nó khác bác nhỉ?

                    Comment


                    • #11
                      Nguyên văn bởi ninh_bk_1991 Xem bài viết
                      vâng! yahoo của em là ninh_bk_1991
                      em viết code bằng winavr, nhưng khi viết PINC.0,... thì nó báo lỗi, hay trong winavr cấu trúc nó khác bác nhỉ?
                      Uh chắc thế, còn mình chỉ dùng độc codevisionAVR vì quen nên ko biết các chưng trình khác ra sao nữa.
                      Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
                      Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

                      Comment


                      • #12
                        Nguyên văn bởi hoahauvn2 Xem bài viết
                        Uh chắc thế, còn mình chỉ dùng độc codevisionAVR vì quen nên ko biết các chưng trình khác ra sao nữa.
                        căng nhỉ? vâng! em sẽ tìm hiểu tiếp xem winavr viết về cái này như thế nào! chào bác nhé!

                        Comment


                        • #13
                          Nguyên văn bởi hoahauvn2 Xem bài viết
                          Uh thông thường đúng là như thế, nhưng mình đọc datasheet thì ko thấy đề cập và cũng đặt câu hỏi cho chính nhà sx thì họ từ chối trả lời, còn hỏi các thầy thì các thầy nói chưa từng nghe về cái vụ 1 xung 1 lện đối với AVR.
                          Muốn biết 1 lệnh avr chạy hết bao nhiêu Chu kỳ máy thì hỏi Anh Gúc. Key "avr instruction". Về cơ bản avr đa số là các lệnh 1 chu kỳ máy. Cái đấy mà cũng hỏi nsx nó ko trả lời là đúng rồi.
                          AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                          Xem thêm tại Online Store ---> Click here
                          Mob: 0982.083.106

                          Comment

                          Về tác giả

                          Collapse

                          ninh_bk_1991 Tìm hiểu thêm về ninh_bk_1991

                          Bài viết mới nhất

                          Collapse

                          Đang tải...
                          X