Thông báo

Collapse
No announcement yet.

Các vấn đề Timer của Atmega8...

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

  • Các vấn đề Timer của Atmega8...

    chào các pác.
    em mới nhập môn AVR không lâu và chọn Atmega8 làm điểm xuất phát. Trong quá trình học tập trên diễn đàn em đã học được nhiều từ các anh đi trước. Nhưng em vần thấy trong Box này vẫn thiếu cái Thread gì đó.

    Nếu nhìn ngay bên anh em PIC thì chúng ta có thể thấy ngay họ có những Thread rất hay,các Thread đó đánh đúng vào 1 vấn đề gì đó của con VĐK mà mình đang sở hữu như: ADC, UART, PWM, Timer ... nên em dám mở luồng này vì em thấy có 1 số điểm như sau:
    1. Để các bạn vào đây cùng thảo luận về 1 vấn đề gì đó mà chúng ta quan tâm để chúng ta học tập và trao đổi kĩ về 1 vấn đề gì đó và luồng này chúng ra sẽ thảo luận về Timer của AVR.
    2. Thuận tiện trong quá trình quản lí của MOD để những câu hỏi của chúng ta không phải trùng lặp lại hay ở đâu đó có những câu hỏi tương tự.
    3. Tập trung giải quyết các vấn đề liên quan, các vướng mắc...

    Với những gì mình đã nói ở trên mình muốn đưa ra 1 số câu hỏi mở màn như sau mong anh em giúp đỡ và cũng là cho các bạn mới học AVR có những cái nhìn tổng quan hơn khi tiếp xúc với bất kì 1 loại AVR nào dù nó là Atmega hay bất kì loại nào ...
    1. Các chế độ hoạt động của các Timer0,1,2 ?
    2. các chế độ PWM trong Timer1,2 ???cách sử dụng các Mode trong các ứng dụng thực tế ...
    3. Chế độ InputCapature, ứng dụng?
    4. Timer định thời như thế nào? Tần số? Khi nào bộ định thời làm việc như 1 bộ đếm, nó đếm như thế nào?

    Mình hỏi vậy không là phải hỏi cho mình mà là vấn đề chung cho những ai mới học AVR.
    Hy vọng Topic này sẽ được nhiều người ủng hộ.
    Rất mong các cao thủ như Sphinx, NVT2, QD... hạ sơn giảng giải giúp cho chúng em được thỏa lòng với "nàng tiên AVR" xinh đẹp.

    Chúc cho Box AVR ngày càng lớn mạnh.
    Last edited by gtvt45; 28-09-2007, 23:59.

  • #2
    Tại hạ thấy gtvt45 nói đúng đấy. Với AVR thì hình như Timer là vấn đề phức tạp nhất. Xin được nhờ các tiền bối hướng dẫn cho những kẻ hậu sinh như tại hạ đây. Tại hạ thấy các vấn đề gtvt45 nêu ra là khá đầy đủ rồi, nhưng sẽ dễ hiểu vấn đề hơn nếu với từng vấn đề, có bài mẫu, trong đó có cả chỉ dẫn về cách chọn thông số trong codewinzar của code vision(Vì đa số mọi người đều dùng CodeVision để lập trình, tại hạ cũng thế )
    Mong chỉ giáo.

    Comment


    • #3
      mình bắt đầu từ đâu đây chú hùng. Cái timer này thì mình cũng biết đc vài đường cơ bản.
      -Timer nào thì cũng có hai chức năng là đếm xung và đếm thời gian. Việc mà bạn chọn đếm xugn hay đếm thời gian thì vào trong thanh ghi TCCRn (n là chỉ số của timer -- timer 0 thì n=0), giá trị đếm được thì được ghi vào thanh ghi TCNTn (Lưu ý là nếu thanh ghi TCNTn được ghi giá trị nào đó !=0 trước khi khởi động thì sau khi khởi động T/C (timer/counter) sẽ bắt đầu đếm từ giá trị đó lên. Sau khi tràn thì lại đếm từ 0). Có vài bít trong thanh ghi này qui định, nếu là đếm thời gian thì đem tần số thạch anh chia cho bao nhiêu để dc tần số đếm. Còn với đếm xung thì bạn đưa xung vào chân Tn, đặt cấu hình là chân vào bằng phần mềm. Sau đó dùng mấy cái bít trên xác định xem đếm sườn lên hay xuống. Thế là xong.
      -Việc ngắt timer hay counter được cho phép qua thanh ghi TIMSK (thanh ghi dùng riêng cho bộ định thời và bộ đếm).Cái này để xem bít nào cho phép thì bạn phải vào datasheet của từng con AVR thì mới rõ. Đây mình chỉ nói chung chung vậy thôi. Dĩ nhiên là lúc này bít I ở trong thanh ghi SREG được cho phép đấy nhé.
      -Đó là hai mấy thứ cơ bản mà cái timer và counter nào cũng có. Ở AVR thì timer còn có thêm vài chức năng nữa mình xin nói thêm một tí về nó:
      + Về cái PWM để điều khiển động cơ thì timer vẫn đếm như bình thường. Có điều khi nó đếm nó vác cái giá trị của TCNTn ra đem so sánh với cái giá trị đặt ở tại thanh ghi OCRn để quyết định độ rộng xung ở chân đầu ra (chân đầu ra ở đây được cấu hình cứng ở trên chip và bạn phải tra datasheet. hình như nó có tên là OC..gì đó). Có hai chế độ của PWM là FAST và phase correct. Ở cái FAST thì nếu mà giá trị TCNTn<OCRn sẽ cho đầu ra là 0 hoặc 1 tùy chọn ở phần mềm. Còn khi TCNTn>OCRn sẽ cho đầu ra ngược lại 1 hoặc 0. Như vậy thì trong một chu kì đếm của timer thì trong khoảng thời gian timer đếm từ 0-->OCRn thì đầu ra là mức i, còn từ OCR--tràn thì đầu ra là mức đảo của i, vậy là có một chú PWM. Đối với chế độ Phase..thì các bạn về tam khảo thêm nhé. nói ở đây dài lắm, còn nếu bạn nào muốn thì mail cho mình cũng dc. Trong chế độ này thì ngắt sẽ xảy ra khi đc cho phép và tại các thời điểm timer tràn và hoặc có thể ngắt tại thời điểm TCNTn=OCRn cũng được.
      +Nếu như bạn có một ứng dụng nào đó muốn timer đếm từ 0 đến một giá trị nào đó thì bị reset về 0 (giá trị này dĩ nhiên có thể khác giá trị tràn) thì có thể sử dụng chế độ CTC mode. Bạn đặt giá trị reset vào cái thằng ICR sau đó thì timer đếm từ 0 đến ICR thì về 0 luôn. VÀ nếu như bạn cho phép ngắt thì tại đây sẽ có một ngắt cho bạn ứng dụng.
      + 2 chế độ ở trên có thể kết hợp với nhau để có được một bộ pwm rất linh hoạt. tùy theo nhu cầu của bạn.
      + Về cái input capture thì nó làm việc cũng đơn giản thôi. Tai cái chân ICP, nếu được cho phép thì mỗi lần có sự thay đổi sườn xung ở trên ICP thì nó làm công việc là copy thằng TCNTn vào ICRn, chỉ có vậy thôi. Dĩ nhiên nó cũng có ngắt cho bạn lập trình dễ dàng hơn. Ví dụ bạn định đo độ rộng xugn dương chẳng hạn. Bạn bắt tại sườn lên một phát, lưu giá trị lại. Bắt tại sườn xuống ngay sau đó. Sau đó lấy giá trị mới trừ đi cái cũ và sử lý thêm cái ngắt tràn timer nữa. Tiếp đến nhân giá trị thu đc với tần số timer là xong. Được ngay cái độ rộng xung....
      + Watch dog thì nó làm đơn giản hơn. Nếu vì một lý do gì đó mà chíp bị rơi vào vòng lặp vô hạn không thể tiếp tục công việc của mình được (kiểu như là bị treo ấy) thì lúc này WDog sẽ làm việc. Nó sẽ kiểm tra khi chíp bị treo, nó sẽ tính ra một khoảng thời gian nào đó mà ko thoát ra dc thì nó sẽ tự độgn reset chip. Cái duy nhất bạn phải làm là chọn xem sau bao lâu thì reset thôi. Vào datasheet xem thanh ghi nào qui định thời gian này nếu bạn lập trình dùng ASM. Còn codevision thì cứ tick vào phát là xong. chả cần biết nó tên tuổi gì.
      + Trong bộ timer và conter của nó có nhiều chế độ lắm, nói ra đây không hết được đâu. Bạn nào có vấn đề gì ở chỗ nào thì hỏi trực tiếp. Anh em ở đây giải quyết cho.
      -------------------------------
      Em nói chắc sẽ có nhiều chỗ sai lắm. Mong mọi người góp ý làm sửa chữa làm cho luồng này tốt hơn.
      Nếu tôi chết đi, hãy chôn tôi với R,L,C...

      Bùi Đức Thọ
      (ductho0409@gmail.com)

      Comment


      • #4
        đang định đi ngủ thấy chú atmega8 mon mem đến đây GTVT lại ko muốn ngủ nữa. hi hi....
        Trước tiên cảm ơn độ nhiệt tình của chú Thọ (anh hơi akay câu của chú đấy).
        Cát hạ đã nói rất tỉ mỉ và chi tiết nhưng hình như vẫn thiều cái gì đó, đó chính là 1 ví dụ cụ thể vào những project cụ thể để cho những người mới học họ có những kiến thức nền tảng vững vàng.

        @Atmega8: bạn nên nói rõ từng phần và nên đưa ra ngay những ví dụ minh họa nhé. Khi đó chúng ta mới có 1 luồng thực sự bổ ích.


        Thôi đi ngủ ...alê alế....alêhấp....GO TO BED !!!

        Comment


        • #5
          ví dụ hả, nhiều lắm, các project không chỉ của timer mà còn của hầu hết các modul khác trong con AVR. Các bác copy về xem quá nhé. giờ mà giở ra chỉ ra chỗ nào chỗ nào thì cũng hơi mệt. có điều bên trong đã có tên tuổi rồi. Cố tìm nhé.
          Attached Files
          Nếu tôi chết đi, hãy chôn tôi với R,L,C...

          Bùi Đức Thọ
          (ductho0409@gmail.com)

          Comment


          • #6
            chào anh em trong cộng đồng AVR.
            vẫn chưa thấy pác cao thủ nào hạ sơn giúp cho các đàn em học tập thêm kinh nghiệm nhỉ?
            @all: các bạn có thể download những ví dụ trên do bạn atemaga8 đã upload lên nhé. Trong đó cũng có nhiều ví dụ hay rất có ích cho những bạn mới tiếp xúc với AVR.

            @To MOD(hoang_csa, sphinx): các pác cho ý kiến đi. Nếu thấy ko cần thiết nhờ các pác delete giùm nhé.

            Working !!!

            Comment


            • #7
              Các bác có thể giải thích qua cho mọi người thêm về các thông số lựa chọn timer trong codewizard của CodeVision không? Cái này tôi thấy cũng tương đối quan trọng đấy. Nếu ta dùng CodeVision thì rất ít khi phải tác động vào các thanh ghi vì cái codewizard nó tự config cho mình khi mình lựa chọn các thông số phù hợp với chương trình.

              Comment


              • #8
                Để em nói qua một chút về Timer vậy
                Uhm hum nay vừa đọc lại xem cái timer của AVR, cái Timer0 là timer 8-bit, nói chung theo datasheet nó được sử dụng vào các ứng dụng là bộ đếm, bộ tạo dao động, đếm sự kiện ngoài.
                Timer0 gồm 4 thanh ghi là TCCR0, TCNT0, TIMSK, TIFR.
                TCCR0 - thanh ghi cho phép lựa chọn nguồn clock của Timer, thông qua việc đặt cho các bit của nó là CS00, CS01, CS02. Cụ thể đặt như thế nào thì đọc thêm Datasheet sẽ biết. Nếu là sử dụng Timer/Counter0 như một Timer thì trong CodeVision có phần Clock Value trong tab Timers-Timer0 nó đặt sẵn cho rùi , phần Clock Source chọn là System clock, ko phải lo config Timer0 nữa cứ chọn là xong. Hoặc nếu làm bộ Counter thì chọn Clock Source là T0 pin Falling Edge (sườn xuống) hoặc T0 pin Raising Edge (sườn lên) để làm bộ Counter với sự kiện ngoài.
                TCNT0 - thanh ghi cho phép đọc và ghi giá trị của Timer0, nó là thanh ghi 8-bit.
                TIMSK - bit 0 TOIE0 là bit cho phép tràn Timer0, khi bit này đc set là 1 và bit I trong SREG dc set thì lúc đó ngắt Tràn Timer0 mới được thực hiện.
                TIFR - bit 0 TOV0 đc set khi xảy ra tràn Timer/Counter0.

                Nói chung là phần Timer/Counter0 thì Codevision đã config hộ mình gần hết, chỉ việc viết code của mình làm tác vụ gì vào phần interrupt của nó thôi.

                Comment


                • #9
                  em cũng mới học cái mảng AVR này thôi các anh ah!!!
                  Mong các anh giúp đỡ em nhiều.
                  Riêng về Timer thì em cũng mới chỉ hiểu dc chút nhưng mới chỉ là về phần cơ chế làm việc của nó, còn làm thế nào thì thực sự em cũng chưa làm...Ngày trước em cũng dc học con 89 nhưng chưa dc hướng dẫn chi tiết lắm...

                  Mong các anh tiếp tục với bài viết trên.

                  Comment


                  • #10
                    Chu minh co gì thì đến cho anh 206A6 anh chỉ cho từ A đến Z. cái này nó cũng không khó.
                    Nếu tôi chết đi, hãy chôn tôi với R,L,C...

                    Bùi Đức Thọ
                    (ductho0409@gmail.com)

                    Comment


                    • #11
                      Timer off mega8

                      Báo cáo các bác! Em vừa mới học AVR và bắt đầu với mega. Em đang muốn tìm hiệu về timer và ADC, có bác nào chỉ giúp em. Cảm on các bác
                      |

                      Comment


                      • #12
                        Nguyên văn bởi Hoangtuananh Xem bài viết
                        Báo cáo các bác! Em vừa mới học AVR và bắt đầu với mega. Em đang muốn tìm hiệu về timer và ADC, có bác nào chỉ giúp em. Cảm on các bác
                        Welcome! Chúc mừng chú em bước vào chỗ "đốt tiền". Đừng nghe mấy chú trên kia nói mà sợ, việc đầu tiên cực kì dễ làm và hiệu quả về sau đó là load cái datasheet con mega16 về đọc cho thật kỹ, đọc càng nhiều thì càng đỡ tốn tiền và càng mất ít thời gian lên mạng để hỏi.
                        Chúc thành công!
                        Nỏ biết chữ mần răng ký được??!! Thôi nhé.

                        Comment


                        • #13
                          Hình như box này lâu không hoạt động thì phải???
                          Nếu có cao thủ nào vô tình đi qua thì cho em hỏi 1 câu nhé: Em đang lập trình 1 cái Timer trên ATmega8, hình thức biểu thị là dạng đồng hồ nhị phân, nghĩa là em có 1 thanh 6 bóng LED (5 xanh, 1 đỏ), khi Timer đếm thì đến giây nào thì ký tự 1 ở giây đó sẽ sáng, em ví dụ nhé : giây 8=1000 thì nghĩa là bóng số 4 của em sẽ sáng....
                          Nhưng em gặp phải 2 vấn đề như sau:
                          1) Là đồng hồ của em chạy qua giây thứ 59 mà em không sao bắt nó dừng và đếm lại từ đầu được
                          2) Là em có ý tưởng là làm 3 cái công tắc, cái 1 có nhiệm vụ Start cái Timer của em (con này ngon rồi), cái 2 là tắt Timer của em (con này cũng gần xong rồi), cái 3 là có nhiệm vụ làm cho Timer tiếp tục hoạt động sau khi em ấn cái 2 (sau khi em ấn 2, Timer dừng ở giây thứ 12, em tiếp tục ấn cái 3 thì Timer đếm tiếp từ 13..) cái này thì em chịu hẳn!!!
                          Có bác cao thủ nào vô tình đi qua đây đọc được bài của em thì giúp em với, em đang rất cần bài này để làm báo cáo cuối kỳ! T_T

                          Comment


                          • #14
                            Các0 bác cho e hỏi nhờ tí!
                            E mới đụng phần pwm này có vài chỗ chưa hiểu lắm:
                            Ví dụ như: Với atmega8 e muốn điều khiển tốc độ 4 động cơ DC có cổ góp dùng pwm thì làm thế nào: Dùng 1 bộ timer có thể điều khiển cả 4 động cơ hoạt động độc lập hay phải dùng cả 3 bộ timer xuất ra 4 đường( 4 channel) pwm mới điều khiển được 4 động cơ này.
                            E hỏi ngu tí mong các bác nhẹ tay. Không hỏi thì mãi dốt mà hỏi thì...!

                            Comment


                            • #15
                              AVR tài liệu rất là nhiều rồi, còn hỏi gì nữa, lên google là có mấy trang hướng dẫn học cơ bản rồi,
                              Tư vấn thiết kế hệ thống điện-điện tử theo yêu cầu.
                              Tel: 0903 702 417. Email: web:

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X