Thông báo

Collapse
No announcement yet.

Timer/Counter

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

  • #16
    Ý Bắc hiệp sâu xa quá, làm em ko thể nào hiểu nối. Vậy em xin trình bày cách hiểu của em:
    Khi C/T = 1, nghĩa là xung clock cho bộ định thời ko phải là xung nhịp của hệ thống mà là từ chân 1 chân ở ngoài. Khi có 1 xung, thì bộ định thời tăng lên 1 đơn vị. Ví dụ:
    Timer 0 thì chân ở ngoài là chân T0. Timer 1 thì là chân T1.
    Nói túm lại, C/T la bít để chọn nguồn clk cho timer thôi.

    Nêu C/T=0, đếm thời gian.
    Nếu C/T=1, đếm sự kiện.
    Vậy thôi, sao mà Bác hiệp nói khó hiểu wá trời
    -------------------

    Comment


    • #17
      Nói túm lại:

      -Chế độ 0: 2 timer 0 và 1 giống nhau, là chế độ 13 bit.
      -Chế độ 1: 2 timer 0 và 1 giống nhau, là chế độ 16 bit.
      -Chế độ 2: 2 timer 0 và 1 giống nhau, là chế độ 8 bit tự nạp lại.

      Nếu phân tích kỹ:
      +Chế độ 0 rất ít khi dùng vì ko mấy ý nghĩa. Vì chế độ 1 làm thay thế hoàn toàn được chế độ 2 mà ko tốn thêm bất cứ tài nguyên nào cả. Thậm chí có còn tối ưu về độ dài thanh ghi. Bon Atmel sao lại sinh ra cái chế độ này làm gì cơ chứ??? ko tài nào hiểu được.
      +Chế độ 1 hay dùng nhất bởi thanh ghi timer 16 bit, có thể thay thế chế độ 0 hoặc 2.
      +Chế độ 2 thì thanh ghi thời gian 8 bit, nó chỉ có 1 ưu thế duy nhất là ko phải nạp lại. Tiết kiệm được mấy dòng lệnh như: TRx=0;THx=*;TLx=*;TRx=1. Hết.

      +Chế độ 3 thì hơi khó hiểu, hẹn thời gian ngắn nữa. Nếu cao thủ nào biết thì post lên cho bà con đi. Nó dùng để làm gì, có ưu việt gì ko? hay vớ vẩn như chế độ 0(13 bít)? và dùng ntn?
      -------------------

      Comment


      • #18
        ĐẾM SỰ KIỆN

        Nguyên văn bởi CHIBANG
        Ý Bắc hiệp sâu xa quá, làm em ko thể nào hiểu nối. Vậy em xin trình bày cách hiểu của em:
        Khi C/T = 1, nghĩa là xung clock cho bộ định thời ko phải là xung nhịp của hệ thống mà là từ chân 1 chân ở ngoài. Khi có 1 xung, thì bộ định thời tăng lên 1 đơn vị. Ví dụ:
        Timer 0 thì chân ở ngoài là chân T0. Timer 1 thì là chân T1.
        Nói túm lại, C/T la bít để chọn nguồn clk cho timer thôi.

        Nêu C/T=0, đếm thời gian.
        Nếu C/T=1, đếm sự kiện.
        Vậy thôi, sao mà Bác hiệp nói khó hiểu wá trời
        Đúng là dùng C/T để chọn nguồn clock cho timer, tức là chọn chế độ hoạt động theo kiểu timer hay counter. Nhưng tại hạ muốn nói ở đây là hai cái đó nên chăng phân biệt rõ ràng một chút. Ví dụ nên nói rằng "chế độ 0 là chế độ timer/counter 13bit" thay vì chỉ nói "chế độ 0 là chế độ timer 13bit". Như vậy sẽ rõ ràng rằng chế độ này có thể dùng để đếm sự kiện ngoài cũng như để đếm thời gian. Tại hạ nghĩ cần phải như thế bởi vì không phải chế độ nào cũng có thể cấu hình C/T = 1 (tức là chọn kiểu counter) được. Đó chính là trường hợp chế độ 3, khi timer 1 không chạy, còn timer0 chia làm 2, một cái có thể là timer/counter 8bit dùng TL0 và một cái chỉ là timer 8bit dùng TH0.
        Sử dụng Timer trong 8051 nói riêng và trong kỹ thuật vi xử lý nói chung là một trong những kỹ năng rất quan trọng vì ứng dụng của nó rất phổ biến và đa dạng, dù bản chất vẫn là đếm thời gian và sự kiện. Tại hạ tuyệt nhiên không có ý bắt bẻ hay múa rìu, chỉ muốn các thiếu hiệp trẻ tuổi khi mới học hiểu rõ thêm một chút, mong ATYLA tiền bối và các đại hiệp hiểu giúp nỗi lòng.

        Comment


        • #19
          sử dụng bộ định thời đếm sự kiện là một ứng dụng khá hay , nhất là trong việc làm robocon
          Chẳng hạn bạn có thể sử dụng 2 bộ encoder nối với 2 chân T0 ,T1 của vdk để đếm xung
          điều này cho phép bạn xác định được số vòng quay của động cơ .
          Rất thuận lợi trong trường hợp robot của bạn chạy mù không sensor hay quay các góc khác
          nhau (30 ,60 ,90 ,270 .vv..vv)
          Pót lên một đoạn code về dùng timẻr đếm sự kiện các bác thamkhảo
          void ngat0(void) interrupt 1 // ngat bo dinh thoi 0
          {

          if (kt0==0) // bit nay set de dung trong luc quay va di lap ma
          {
          P1_2=1;
          P1_3=1;
          P1_0=1;
          P1_1=1;
          }

          if (kt0==1) // bit nay xoa de bam xung dinh thoi new
          {
          TR0=0;
          if (dem_trai==tocdo_trai)
          { P1_2=~P1_2;tocdo_trai=10-tocdo_trai;dem_trai=0;}
          dem_trai++;
          TR0=1;
          }

          if (kt0==2) // dung cho bamxung quay
          {
          TR0=0;
          TH0=0xFF;
          TL0=0x47;
          d2++;
          TR0=1;
          }

          }

          void quayphai(unsigned char bytecao,unsigned char bytethap)
          {
          TMOD=0x55;// dem su kien
          P1_2=1;
          P1_3=0;
          P1_0=0;
          P1_1=1;
          delay(500);
          P1_0=1;
          kt0=0;// bit nay set de chuong trinh ngat kiem tra lua chon
          TH0=bytecao;
          TL0=bytethap; // 230 XUNG
          TR0=1;
          while(1)
          {
          if (P1_3==1) break;

          }
          }
          void quaytrai(unsigned char bytecao,unsigned char bytethap)
          {
          TMOD=0x55; //khoi dong bo dinh thoi dem su kien
          kt1=0;
          P1_0=1;
          P1_1=0;
          P1_2=0;
          P1_3=1;
          delay(500);
          P1_2=1;
          TH1=bytecao;
          TL1=bytethap;
          TR1=1;
          while(1)
          {
          if (P1_1==1) break;
          }
          }



          void quay(unsigned char status ,unsigned char bytecao ,unsigned char bytethap)
          {

          if (status==turn_right)
          quayphai(bytecao,bytethap);
          if (status==turn_left)
          quaytrai(bytecao,bytethap);
          }void ngat1(void) interrupt 3 // ngat bo dinh thoi 1
          {
          if (kt1==0) // dung de di lap ma
          {
          P1_0=1;
          P1_1=1;
          P1_2=1;
          P1_3=1;
          }
          if (kt1==1) // bam xung dinh thoi
          {
          TR1=0;
          if (dem_phai==tocdo_phai)
          { P1_0=~P1_0;tocdo_phai=10-tocdo_phai;dem_phai=0;}
          dem_phai++;
          TR1=1;
          }
          }
          SHARE KHO PHIM LỚN

          Comment


          • #20
            Tiện thể post luôn cái hình lên đây, cái hình này có ở link trên.
            Nhưng lạ thật, tại sao lại bộ chia xung nhịp hệ thống cho timer 6 mà ko phải 12 nhỉ? các tài liệu thường thấy là 12, còn tài liệu chuẩn của Atmel lại là 6?

            Như Bắc hiệp ra ám hiệu từ trước:Chế độ 3 sử dụng cho timer/couter 0 thôi. Ko sử dụng cho timer 1. Nếu sử dụng timer/counter 0 chế độ 3 thì timer/counter1 ko được sử dụng các chế độ 0,1,2 nữa mà chỉ sử dụng chế độ đặc biệt.
            Attached Files
            -------------------

            Comment


            • #21
              Chế độ 3 là chế độ định thời chia sẻ .Bộ định thời 0 ở chế độ 3 có hoạt động khác nhau cho bộ
              định thời .Bộ định thời 0 ở chế độ 3 được chia thành 2 bộ định thời 8 bit hoạt động riêng rẽ TL0,TH0
              Chế độ 3 cung cấp thêm một bộ định thời 8 bit nữa .Khi bộ định thời 0 ở chế độ 3
              bộ định thời 1 có thể hoạt động hay dừng băng cách chuyển bộ này ra hày vào chế độ 3

              Thật ra ứng dụng về timer,counter có thể chơi con PLC .
              với con PLC s7-300 có tới 5 loại timer khác nhau với các độ phân giải ms ,10ms,100ms ,1s,và
              10s hơn hẳn con VĐK .
              SHARE KHO PHIM LỚN

              Comment


              • #22
                Nguyên văn bởi CHIBANG
                Như Bắc hiệp ra ám hiệu từ trước:Chế độ 3 sử dụng cho timer/couter 0 thôi. Ko sử dụng cho timer 1. Nếu sử dụng timer/counter 0 chế độ 3 thì timer/counter1 ko được sử dụng các chế độ 0,1,2 nữa mà chỉ sử dụng chế độ đặc biệt.
                Tại hạ nghĩ là khi sử dụng timer/counter0 ở chế độ 3 thì timer/counter1 dừng, tức là không chạy được ở chế độ nào cả. Không biết cái chế độ đặc biệt của CHIBANG đại hiệp nó chạy ra làm sao?

                Comment


                • #23
                  Nguyên văn bởi CHIBANG
                  Nếu phân tích kỹ:
                  +Chế độ 0 rất ít khi dùng vì ko mấy ý nghĩa. Vì chế độ 1 làm thay thế hoàn toàn được chế độ 2 mà ko tốn thêm bất cứ tài nguyên nào cả. Thậm chí có còn tối ưu về độ dài thanh ghi. Bon Atmel sao lại sinh ra cái chế độ này làm gì cơ chứ??? ko tài nào hiểu được.
                  +Chế độ 3 thì hơi khó hiểu, hẹn thời gian ngắn nữa. Nếu cao thủ nào biết thì post lên cho bà con đi. Nó dùng để làm gì, có ưu việt gì ko? hay vớ vẩn như chế độ 0(13 bít)? và dùng ntn?
                  Hey, bọn Atmel không nghĩ ra cái chế độ 0 hay các chế độ còn lại đâu. Chủ nhân của kiến trúc kinh điển của họ 8051 là Intel. Bọn này mới nghĩ ra mấy cái chế độ đó. Kiếm ý sâu xa của cái chế độ 0 "dở hơi" là ... trước MCS51, Intel đã luyện được MCS48 tuyệt kỹ! MCS51 đại pháp sau này được luyện có đưa thêm vào chế độ 0 cho timer (chế độ 13bit) là để tương thích với MCS48 đó!!!
                  Chế độ 3 thì có chi mà khó luyện? Khẩu quyết như sau:
                  - ở chế độ này thì timer1 không chạy, tức là nó không đếm, không hoạt động được.
                  - timer0 thì chia làm 2 phần độc lập. Thứ nhất là một cái timer/counter 8bit dùng thanh ghi TL0 để đếm. Thứ hai là một cái timer (nhớ rằng chỉ là timer thôi không làm counter được!) cũng 8bit dùng thanh ghi TH0 để đếm. Vì là độc lập nên chúng phải có các bit quy định chế độ, điều khiển, báo trạng thái riêng rẽ. Thằng TL0 thì dùng các bit của Timer0 (4 bit thấp của TMOD và các bit TR0, TF0), thằng TH0 thì may quá do thằng Timer1 chịu chết không chạy được ở chế độ này nên không dùng đến các bit chế độ của nó, vì thế TH0 dùng luôn các bit của Timer1 (4bit cao của TMOD và các bit TR1, TF1). Tức là trong trường hợp này, setb TR1 sẽ làm TH0 chạy thay vì timer1 chạy.
                  Chế độ 3 cũng rất ít khi được sử dụng.

                  Comment


                  • #24
                    Nguyên văn bởi blackmoon
                    Tại hạ nghĩ là khi sử dụng timer/counter0 ở chế độ 3 thì timer/counter1 dừng, tức là không chạy được ở chế độ nào cả. Không biết cái chế độ đặc biệt của CHIBANG đại hiệp nó chạy ra làm sao?
                    Tại hạ nhìn vào cái hình tại hạ vừa thần tốc đưa lên. Thì nó chia thành 2 phần, nhãn quang tại hạ đang hướng vào phần dưới.
                    Tại vì tại hạ ko biết gọi nó là gì? timer0 cũng ko phải(vi có liên quan đến các bit TR1,TF1), timer 1 cũng ko phải vì nó liên quan tới TH0. Cứ luẩn quẩn dẽ dễ tẩu hỏa nhập ma nên tại hạ vung tay đánh bừa một chưởng như vây để giải tỏa nỗi lòng.
                    -------------------

                    Comment


                    • #25
                      HÃY VẬN KHÍ TỤ ĐAN ĐIỀN!

                      Nguyên văn bởi CHIBANG
                      Nguyên văn bởi blackmoon
                      Tại hạ nghĩ là khi sử dụng timer/counter0 ở chế độ 3 thì timer/counter1 dừng, tức là không chạy được ở chế độ nào cả. Không biết cái chế độ đặc biệt của CHIBANG đại hiệp nó chạy ra làm sao?
                      Tại hạ nhìn vào cái hình tại hạ vừa thần tốc đưa lên. Thì nó chia thành 2 phần, nhãn quang tại hạ đang hướng vào phần dưới.
                      Tại vì tại hạ ko biết gọi nó là gì? timer0 cũng ko phải(vi có liên quan đến các bit TR1,TF1), timer 1 cũng ko phải vì nó liên quan tới TH0. Cứ luẩn quẩn dẽ dễ tẩu hỏa nhập ma nên tại hạ vung tay đánh bừa một chưởng như vây để giải tỏa nỗi lòng.
                      Hy vọng sau khi vận công để khí tụ đan điền, bây giờ đại hiệp đã có thể nhìn thấu bản chất vấn đề bằng tâm nhãn.

                      Comment


                      • #26
                        Chào tất cả các bác. Tôi đang thiết kế , giải quyết đề bài về cái encoder và decoder mà chưa biết xoay sở ra sao , Post sơ đồ lên đây mong các
                        cao thủ Firmware trợ giúp .
                        --- Đề bài : Thiết kế một encoder và decoder cho điều khiển gồm 10 phím bấm và 4 công tắc địa chỉ code.
                        + Khi phím số 1 nhấn lên mức cao thì đèn led số 1 của phần thu sẽ sáng nếu 4 công tắc địa chỉ phát và thu giống nhau.
                        + Khi bấm đồng thời 2 phím hoặc n phím (n <=10) cùng 1 lúc thì các đèn led ở phần thu cũng phải sáng lên ( tất nhiên phải đúng mã code địa chỉ ) (Ví dụ : Bấm đồng thời 2 phím 1 và 2 thì 2 đèn led của phần thu đồng loạt sáng lên.)
                        //////////////
                        Tôi đã tham khảo ý kiến của bác BinhAnh là truyền cả chuỗi bit hay truyền cả byte , mỗi bit trong bite đó được gán cho một đầu ra , nếu trong chuỗi hoặc byte đó bit nào là 1 thì chân tương ứng được gán bởi bit đó sẽ sáng lên. Nhưng khó một nỗi là thêm 4 cái
                        địa chỉ để xác lập code kia không biết làm sao để cài nó vào khi phát???
                        + Để đèn sáng cần có 2 điều kiện sau : Đây là bàn về cách giải thuật ( ai đó đừng vặn vẹo tôi về vật lý nha : cấp nguồn..,led tốt...)
                        điều kiện 1 : địa chỉ code của bên phát và bên thu sau khi mình set code phải giống nhau
                        ( ví dụ ở phần phát A1 nối lên 5 vôn thì ở phần thu A1 cũng phải nối lên 5 von tương ứng , nếu khác --> sai code , không sáng đèn)
                        điều kiện 2 : Phải bấm phím phát của bộ mã hoá ( encoder) thì chân tương ứng của bộ giải mã (decoder) mới có logic 0 và làm led
                        sáng lên.
                        Các cao thủ có cao kiến gì về cái này không ???
                        (lưu ý : Phần output của encoder sẽ được nối trực tiếp vào đầu input của decoder và một dây chung nữa là GND )
                        Last edited by queduong; 11-05-2009, 10:13.
                        Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                        Comment


                        • #27
                          mạch giải mã
                          Last edited by queduong; 11-05-2009, 10:13.
                          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                          Comment


                          • #28
                            Có vẻ như bác định dùng cặp này để thay các cặpPT,BL hay HT rồi
                            Tui đóng góp một ý kiến:
                            +89C2051 có 15 I/O: 13 chân có trở treo lên ở trong(bởi vậy nếu để hở đọc cổng sẽ là 1), 2 chân thì chưa có trở treo ở trong. Bởi vậy bác tiết kiệm được 13x2 con điện trở(để hở thì đọc = 1, nối xuống GND thì đọc = 0).
                            +Về mặt lâp trình, bác khai 1 mảng Code[14] kiểu bit: 4 phần tử đầu là mã địa chỉ, 10 phần tử sau là lệnh(ấn phím). Khi truyền chỉ cần một vòng for i=0;i<14;i++ và truyền thì OK. Dùng 1 timer để làm thời gian của mỗi bit.
                            for (i=0;i<14;i++)
                            {
                            Out=Code[i];
                            Delay(1ms);//Mỗi bit 1 ms
                            } hoặc dùng ngắt để truyền...
                            Bên thu nhận được 14 bit này, công việc đầu tiên là so sánh 4 bit đầu với mã của nó, nếu trùng nhau thì sẽ xem mã lệnh ntn để sáng tắt các LED.
                            Tuy nhiên để nâng cao chất lượng và độ tin cậy thì phải chèn thêm phần Header(mã nhận dạng) ở đầu khung truyền, các bít truyền đi nên mã hóa kiểu Mans, độ rộng xung....và có phần kêt thúc.
                            Phần thu thì dùng 1 ngắt ngoài+ timer để xử lý.
                            +Có thể dùng kiểu quét matrix để tăng số lượng nút ấn nếu thấy cần thiết.

                            Comment


                            • #29
                              Tôi hiểu ý bác Bình anh rồi. có lẽ tôi phải sửa lại phần cứng một chút để dễ dàng hơn ( cho nhận tín hiệu vào đầu ngắt )
                              Xin hỏi nếu tín hiệu đưa vào ( không đưa vào đầu ngắt ) có thể đếm xung được không ? hay nhất thiết phải đưa vào ngắt mới đếm được ???
                              Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                              Comment


                              • #30
                                Nguyên văn bởi queduong
                                Xin hỏi nếu tín hiệu đưa vào ( không đưa vào đầu ngắt ) có thể đếm xung được không ? hay nhất thiết phải đưa vào ngắt mới đếm được ???
                                Chưa hiểu nhiều về việc thu/phát của bác, nhưng thông thường thì người ta thường nối vào chân Int(nối ko sử dụng chức năng ngăt thì hỏi vòng cũng được). Việc nối này để phát hiện suờn dương, sau đó dùng timer để đọc bít, làm thế nào để dùng timer để đọc chính giữa bit để xác định đó là bit 0 hay 1. Thường làm vậy sẽ dễ hơn cho lập trình. Bác đăng nhập vào đây để tham khảo thêm, phía cuối có nói sơ lược về giải mã:
                                http://www.dientuvietnam.net/viewtopic.php?t=5&postdays=0&postorder=asc &start=0

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X