[HỌC AVR] Bài 3: TIMER – COUNTER TRÊN AVR
XIN CHÀO CÁC BẠN !
Trong bài viết này tôi xin hướng dẫn các bạn cách điều khiển các bộ định thời, đếm (Timer – Counter ) trong họ AVR, cụ thể là vi điều khiển Atmega8.
I.TIMER – COUNTER TRÊN ATMEGA8.
-Vi điều khiển Atmega8 gồm có 3 bộ Timer – Counter:
Ø 2 bộ Timer – Counter 8 bit: TIMER0, TIMER2.
Ø1 bộ Timer – Counter 16 bit: TIMER1.
-Timer – Counter có các chế độ hoạt động chính :
ØChế độ định thời.
ØChế độ đếm sự kiện.
ØChế độ tạo xung điều rộng PWM (chỉ có trong bộ TIMER1 và TIMER2).
ØChế độ Input Capture (trong bộ TIMER1).
-Các thanh ghi dùng để điều khiển các bộ TIMER: TCNTx, TCCRx, TIMSK…
(các bạn tham khảo thêm ở datasheet của Atmega8 để biết về các chế độ và thanh ghi của các bộ TIMER).
Trên đây là khái quát chung về các bộ Timer trong vi điều khiển Atmega8, để hiểu rõ cách điều khiển và sử dụng chúng, ta sẽ đi vào các bài toán cụ thể.
II.CÁC CHẾ ĐỘ HOẠT ĐỘNG CỦA TIMER – COUNTER.
Ở đây, tôi sẽ nói rõ với các bạn 2 chế độ: định thời và đếm sự kiện của các bộ Timer (cụ thể với TIMER1). Chế độ tạo PWM và Input Capture tôi xin viết vào 2 bài riêng biệt để giúp các bạn nắm rõ, qua đó áp dụng vào các bài toán điều khiển thực tế.
1.CHẾ ĐỘ ĐỊNH THỜI.
-Ở chế độ này, TIMER1 hoạt động như sau: khi có tín hiệu kích, thanh ghi đếm TCNT1 sẽ tăng từ 0 đến 65535 tức là 0xFFFF (TCNT0 tăng từ 0 đến 0xFF), khi xảy ra tràn TCNT1 quay về 0. Dựa vào cơ chế này chúng ta sẽ tạo ra được những khoảng thời gian mong muốn.
–Bài toán đặt ra: điều khiển nhấp nháy LED với khoảng thời gian 1s được tạo bởi TIMER1.
Để thực hiện bài toán này chúng ta phải:
ØThiết lập chế độ thường (normal) cho TIMER1 bằng 2 thanh ghi TCCR1A, TCCR1B.
ØThiết lập bộ chia tần số hoạt động cho TIMER1 (chính là tín hiệu kích) bằng các bit CS1x trên thanh ghi TCCR1B.
ØTính toán giá trị cho thanh ghi TCNT1:
Giá trị TCNT1 được thiết lập: TCNT1 = 65535 – T*(F/n).
Trong đó:
·65535 là giá trị lớn nhất mà thanh ghi TCNT1 có được (TCNT0 là 255).
·F: tần số của vi điều khiển.
·N: bộ chia tần số cho Timer.
·T: thời gian cần định thời.
(các bạn tính toán tương tự đối với TIMER0)
Như vậy, TCNT1 sẽ tăng từ giá trị khởi tạo đến 0xFFFF và tràn về 0, khoảng thời gian đó chính là thời gian định thời mà các bạn cần. Khi bộ đếm Timer tràn, 1 ngắt tràn sẽ xảy ra (khi đã được kích hoạt), tại trình phục vụ ngắt các bạn cho trạng thái LED thay đổi.
Code mẫu:
#include <main.h> // TRINH PHUC VU NGAT TRAN TIMER1 interrupt [TIM1_OVF] void timer1_ovf_isr(void) { TCNT1H=0x85ED >> 8; // Khoi tao lai gia tri cho TCNT1 TCNT1L=0x85ED & 0xff; LED=~LED; // Thay doi trang thai cua LED khi TIMER1 tran(sau 1s) // Place your code here } // Declare your global variables here void main(void) { // Declare your local variables here // Ket noi LED voi PORTB.0 // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=1 PORTB=0x00; DDRB=0x01; // KHOI TAO TIMER1 TCCR1A=0x00; TCCR1B=0x04; // Chia tan so cho 256 TCNT1H=0x85; // Khoi tao gia tri cho thanh ghi TCNT1, tao khoang thoi gian 1s TCNT1L=0xED; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x04; // Kich hoat ngat tran TIMER1 // Global enable interrupts #asm("sei") // Kich hoat ngat toan cuc while (1) { // Place your code here } } |
Cách thiết lập chế độ định thời của TIMER1 với CodeVisionAVR:
Tạo Project mới à chọn CodewizardAVR à chọn Timers à chọn Timer1
Các bạn chọn:
-Tần số chia ở Clock Value.
-Chế độ ở Mode.
-Kích hoạt ngắt tràn ở Interrupt on.
-Giá trị khởi tạo cho TCNT1 ở Value.
2.CHẾ ĐỘ ĐẾM SỰ KIỆN.
Như đã nói ở trên, các bộ Timer còn được sử dụng để đếm “sự kiện”, tức là khi có sự thay đổi của tín hiệu ngoài trên chân T1 đối với TIMER1 (T0 đối với TIMER0), thanh ghi TCNT1 sẽ tăng lên 1 đơn vị.
Để sử dụng chế độ này, các bạn phải thiết lập sử dụng nguồn xung bên ngoài với các bit CS1x trên thanh ghi TCCR1B (bảng trên).
Bài toán: Đếm sản phẩm trên một dây chuyền sản xuất, hiển thị lên 4 LED 7 thanh.
Các bạn có thể tham khảo Code mẫu để hiểu rõ hơn chế độ đếm sự kiện của bộ TIMER.
CHÚC CÁC BẠN THÀNH CÔNG!
Các bạn có thể xem Code mẫu và mô phỏng Tại đây: