Chào các bạn.Mình cũng mớii học avr. Đang gặp khó khăn về timer, các bác có thể giúp em về cái này được chứ?
Đầu tiên ban nên nhớ đặc tính cơ bản của 3 timer như sau:
timer0 8bit, đếm ngoài
timer1 16bit, đếm ngoài, PWM
timer2 8bit, PWM
Cài đặt cho các timer vào thanh ghi TCCR0/ 1(A/B)/ 2
timer0/1 vừa là timer vừa là bộ đếm, nếu là bộ đếm thì lấy xung từ chân T0/1. Nếu là timer thì lấy tần số dao động, qua một bộ chia tần (prescaler). Để dễ chọn mức chia tần phù hợp, tặng bạn một file exel có gì dễ tra cứu, chỉ cần thay đổi mục "freq" thì các tần số qua prescaler ra kết quả tự động. Nói thêm một tí là mình học được cách làm này ở một tay chơi dân kế toán, rất hiệu quả mà nhẹ nhàng.
Cài đặt cho 1 timer tương đối phức tạp, nếu làm quen bạn nên chọn chế độ normal, đơn giản thì 5 bit đầu của TCCR0/1A/2 để 0; 3 bit còn lại chọn chia tần hoặc ngõ vào
Cứ mỗi lần có xung, hoặc prescaler xuất 1 xung thì thanh ghi TCNT0/1/2 tăng lên 1. Đến khi tràn thì các cờ tràn TOV0/1/2 trong thanh ghi TIFR set từ 0 lên 1. Điều khá củ chuối ở đây là muốn xóa cờ tràn thì bạn phải chép đè bit 1 lên nó!!!
Nguyên văn datasheet của ATMega8, trong phần nói về timer1, thanh ghi TIFR:
"...In normal and CTC modes, the TOV1 Flag is set when the timer overflows...
... TOV1 can be cleared by writing a logic one to its bit location"
Hơi rắc rối vậy nếu bạn muốn xóa cờ thì phải kiểm tra xem nó đang ở mức nào, nếu là 1 thì chép đè 1 lên còn nếu là 0 thì cứ để nguyên đấy.
Cách dùng 1 timer hiệu quả là dùng ngắt hoặc giải thuật sau:
...
kiểm tra cờ tràn;
khởi động timer;
while(timer chưa tràn)
{
thực hiện;
}
...
Comment