Basics
Chúng ta đã trình bày những kiến thức cơ bản về Lập trình bộ định thời AVR, trong ví dụ về Timer 1, chúng ta đã thấy rằng chúng ta phải theo dõi các Flags để kiểm tra xem Timer có bị tràn xuống hay không, điều này làm cho chương trình chính phụ thuộc vào trạng thái của các cờ. Bộ hẹn giờ là đơn vị độc lập bên trong bộ điều khiển vi mô và để sử dụng đầy đủ chúng, chúng tôi sẽ cấu hình và sử dụng chúng với Ngắt. Điều này làm cho CPU không bị bỏ qua các cờ và bộ hẹn giờ có thể tự hoạt động. Khi tác vụ định thời kết thúc, nó sẽ ngắt và thông báo cho CPU.
Đối với bộ đếm thời gian TIMER 0, số đếm đi từ 0 đến 255 và cuộn qua. Cùng với đó cờ hẹn giờ vượt dòng được thiết lập và nó có thể được sử dụng để kích hoạt ngắt.
Chúng ta hãy lặp lại cùng một ví dụ về nhấp nháy đèn LED được kết nối với PD4 ở độ trễ 100ms với Bộ hẹn giờ 1 (timer 1) sử dụng Ngắt.
chúng ta đang sử dụng cờ Timer OverFlow, giá trị 65536 - 1562 = 63974 được tải trong TCNT1.
Các bước để định cấu hình Ngắt bộ hẹn giờ (TIMER).
-Load the TCNT1 register with the value calculated above.
-Set CS10 and CS12 bits to configure pre-scalar of 1024
-Enable timer1 overflow interrupt(TOIE1), the register is shown below
-Enable global interrupts by setting global interrupt enable bit in SREG
-Toggle the LED in the ISR and reload the TCNT value.
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
- | - | TICIE1 | OCIE1A | OCIE1B | TOIE1 | - | - |
Code
#include<avr/io.h> #include<avr/interrupt.h> #define LED PD4 ISR (TIMER1_OVF_vect) // Timer1 ISR { PORTD ^= (1 << LED); TCNT1 = 63974; // for 1 sec at 16 MHz } int main() { DDRD = (0x01 << LED); //Configure the PORTD4 as output TCNT1 = 63974; // for 1 sec at 16 MHz TCCR1A = 0x00; TCCR1B = (1<<CS10) | (1<<CS12);; // Timer mode with 1024 prescler TIMSK = (1 << TOIE1) ; // Enable timer1 overflow interrupt(TOIE1) sei(); // Enable global interrupts by setting global interrupt enable bit in SREG while(1) { } }