Tổng quan các bộ Timer/Counter trên chip AVR
Vi điều khiển AVR được thiết kế với 3 bộ Timer/Counter theo thứ tự Timer 0, Timer 1, Timer 2: Có chức năng định thời, đếm sự kiện, tạo xung điều rộng PWM, căn chỉnh thời gian như một bộ RTC - Thời gian thực (chỉ có ở Timer 2)... Ta sẽ xét từng bộ timer một xem sự khác nhau và giống nhau của chúng để các bạn có thể chọn bộ timer tương thích với ứng dụng của bạn:
Ta sẽ thay định nghĩa Timer/Counter gọi chung là Timer.
1. Timer 0:
Đây là một bộ định thời có độ dài 8bit, nó hoạt động tương tự như chế độ timer 8bit của 8051 tức đếm từ 0-255 và tràn khi đạt 256 lúc này bộ đếm trở về 00H và cờ tràn TOV0 được set lên 1, có thể xảy ra 1 ngắt nếu có khai báo ngắt timer này.
Các thanh ghi phụ trách điều khiển Timer0: Khi set bit ta chỉ set những bit nào có giá trị bằng 1 và chỉ set bằng 0 khi bit đang ở mức 1 .
TCCR0 (Timer/Counter Control Register): Là thanh ghi điều khiển quá trình hoạt động của bộ timer0
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | - | - | - | - | CS02 | CS01 | CS00 |
Mặc dù là thanh ghi 8bit nhưng chỉ có 3bit được sử dụng, có tác dụng chọn xung clock cho bộ timer0, cứ mỗi xung clock là bộ đếm được tăng lên 1 đơn vị
Ta có bảng Set bit như sau
CS02 | CS01 | CS00 | Miêu tả chức năng |
0 | 0 | 0 | Không có xung clock - Timer0 Stop |
0 | 0 | 1 | Fosc/1 - Bằng xung nhịp đưa vào chip |
0 | 1 | 0 | Fosc/8 - Tần số thạch anh chia 8 |
0 | 1 | 1 | Fosc/64 - Tần số thạch anh chia 64 |
1 | 0 | 0 | Fosc/256 - Tần số thạch anh chia 256 |
1 | 0 | 1 | Fosc/1024 - Tần số thạch anh chia 1024 |
1 | 1 | 0 | Đếm sự kiện bên ngoài ở chân T0 cạnh xuống |
1 | 1 | 1 | Đếm sự kiện bên ngoài ở chân T0 cạnh lên |
TIMSK (Timer/Counter Interrupt Mask Register): Là thanh ghi mặt nạ ngắt ta chỉ quan tâm tới bit TOIE0, nếu set bit này lên 1 thì sẽ có ngắt tràn xảy ra khi bộ đếm tràn
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
OCIE2 | TOIE2 | TICIE1 | OCIE1A | OCIE1B | TOIE1 | - | TOIE0 |
TIFR (Timer/Counter Interrupt Flag Register): Là thanh ghi lưu trạng thái cờ tràn của tất cả các timer, ở timer 0 chỉ có bit TOV0 là cờ tràn và cũng là cờ chỉ thị ngắt
TCNT0: Là thanh ghi chứa giá trị đếm của timer0, ta sẽ ghi dữ liệu khởi tạo timer vào đây, mặc định là 00H. Cách tính giá trị dựa vào giá trị tràn trừ đi giá trị cần đặt. thời gian trễ phụ thuộc vào nguồn xung clock đưa vào timer cài đặt ở thanh ghi TCCR0
Code mẫu cách khởi tạo timer0:
TCCR0=(1<<CS02)|(1<<CS00); //CS02=1, CS01=0, CS00=1: xung clock bằng Fosc/1024
TCNT0=100; //Khởi tạo giá trị bằng 100
TIMSK=(1<<TOIE0); //Cho phép ngắt timer0
#asm("sei") //Set bit I cho phép ngắt toàn cục
...........
Về chương trình ngắt chúng ta sẽ xét trong bài sau.
2. Timer 1:
Đây là bộ timer có độ phân giải 16bit đa chức năng, có thể tạo 2 kênh PWM từ bộ timer này, InputCapture...
Bản chất là bộ timer 16bit nhưng do VDK lõi 8bit lên nó sẽ phải sử dụng 2 thanh ghi 8bit ghép lại thành 16bit là TCNT1H và TCNT1L: TCNT1H chứa giá trị Byte cao 15-8, TCNT1L chứa Byte thấp 7-0. Hai thanh ghi này độc lập nhau cho phép đọc và ghi vào nó hoàn toàn độc lập không chung đụng :)
TCCR1A và TCCR1B (Timer/Counter Control Register): Là 2 thanh ghi điều khiển quá trình hoạt động của timer1:
TCCR1A:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | FOC1A | FOC1B | WGM11 | WGM10 |
TCCR1B:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Cũng tương tự timer0 ở trên 3 bit CS12, CS11, CS10 của thanh ghi TCCR1B là 3 bit chọn xung clock cho timer:
CS12 | CS11 | CS10 | Miêu tả chức năng |
0 | 0 | 0 | Không có xung clock - Timer1 Stop |
0 | 0 | 1 | Fosc/1 - Bằng xung nhịp đưa vào chip |
0 | 1 | 0 | Fosc/8 - Tần số thạch anh chia 8 |
0 | 1 | 1 | Fosc/64 - Tần số thạch anh chia 64 |
1 | 0 | 0 | Fosc/256 - Tần số thạch anh chia 256 |
1 | 0 | 1 | Fosc/1024 - Tần số thạch anh chia 1024 |
1 | 1 | 0 | Đếm sự kiện bên ngoài ở chân T1 cạnh xuống |
1 | 1 | 1 | Đếm sự kiện bên ngoài ở chân T1 cạnh lên |
OCR1A và OCR1B (Ouput Compare Register A và B): Ở timer này xuất hiện thêm 2 thanh ghi 16bit mới, hiểu đơn giản đây là 2 thanh ghi chứa giá trị so sánh với giá trị của thanh ghi TCNT1 nếu xảy ra quá trình TCNT1 đếm lên và bằng với OCR1A hoặc OCR1B thì sẽ xảy ra một ngắt hoặc 1 sự thay đổi trạng thái trên chân OC1A (hoặc chân OC1B) xảy ra (đây là cách tạo PWM bởi Timer1). OCR1A và OCR1B có cấu tạo tương tự TCNT1, sử dụng 2 thanh ghi 8bit ghép thành OCR1AH, OCR1AL và OCR1BH, OCR1BL đây là cách mà ta có thể tạo 2 kênh PWM độc lập với nhau.
Kỹ thuật điều chế xung PWM sẽ được nói ở bài khác, bài viết này chỉ giới thiệu về các bộ timer của AVR
ICR1 (InputCapture Register 1): Là thanh ghi 16bit bao gồm ICR1H và ICR1L. Khi có 1 sự kiện trên chân ICP1, thanh ghi ICR1 sẽ sao chép (Capture - Chụp) giá trị của thanh ghi đếm TCNT1. Một ngắt có thể xảy ra trong trường hợp này, vì thế Input Capture có thể được dùng để cập nhật giá trị TOP của Timer1. Tính năng này có thể biến con VDK thành một máy đo tần số đơn giản.
TIMSK (Timer/Counter Interrupt Mask Register):Là thanh ghi mặt nạ ngắt ta quan tâm tới các bit sau:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
OCIE2 | TOIE2 | TICIE1 | OCIE1A | OCIE1B | TOIE1 | - | TOIE0 |
- TOIE1 bit quy định ngắt tràn Timer1 (tương tự trường hợp của Timer0).
- OCIE1B là bit cho phép ngắt khi xảy ra trong việc so sánh TCNT1 với OCR1B.
- OCIE1A là bit cho phép ngắt khi xảy ra trong việc so sánh TCNT1 với OCR1A.
- TICIE1 là bit cho phép ngắt trong trường hợp Input Capture được dùng.
TIFR (Timer/Counter Interrupt Flag Register): Là thanh ghi cờ ngắt ta không quan tâm nhiều về thanh ghi này chỉ biết là trong thanh ghi này có các bit cờ TOV1, OCF1A, OCF1B, ICF1.
3. Timer 2:
Là bộ timer có độ phân giải 8bit tương tự như timer0 nhưng với bộ timer này có thêm tính năng mới đó là căn chỉnh thời gian do được thiết kế đặc biệt với chân OSC riêng không dùng chung nguồn dao động của chip như timer0 và timer1, có thể điều chế xung điều rộng PWM
TCNT2: Thanh ghi chứa giá trị đếm của timer 2
TCCR2 (Timer/Counter Control Register): Là thanh ghi điều khiển hoạt động của timer 2
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
FOC2 | WGM20 | COM21 | COM20 | WGM21 | CS22 | CS21 | CS20 |
Ta có bảng sau: FoscT2 là xung nhịp đưa vào 2 chân OSC của bộ timer 2
CS22 | CS21 | CS20 | Miêu tả chức năng |
0 | 0 | 0 | Không có xung clock - Timer 2 Stop |
0 | 0 | 1 | FoscT2/1 - Bằng xung nhịp đưa vào timer 2 |
0 | 1 | 0 | FoscT2/8 - Tần số thạch anh chia 8 |
0 | 1 | 1 | FoscT2/32 - Tần số thạch anh chia 32 |
1 | 0 | 0 | FoscT2/64 - Tần số thạch anh chia 64 |
1 | 0 | 1 | FoscT2/128 - Tần số thạch anh chia 128 |
1 | 1 | 0 | FoscT2/256 - Tần số thạch anh chia 256 |
1 | 1 | 1 | FoscT2/1024 - Tần số thạch anh chia 1024 |
OCR2 (Ouput Compare Register): Thanh ghi chứa giá trị so sánh với TCNT2 tương tự như timer 1
TIMSK (Timer/Counter Interrupt Mask Register): Là thanh ghi mặt nạ ngắt ta quan tâm tới các bit sau:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
OCIE2 | TOIE2 | TICIE1 | OCIE1A | OCIE1B | TOIE1 | - | TOIE0 |
- TOIE2 là bit quy định ngắt tràn Timer2 (tương tự trường hợp của Timer0, timer1).
- OCIE2 là bit cho phép ngắt khi xảy ra trong việc so sánh TCNT2 với OCR2.
TIFR (Timer/Counter Interrupt Flag Register): Là thanh ghi cờ ngắt ta không quan tâm nhiều về thanh ghi này chỉ biết là trong thanh ghi này có các bit cờ TOV2, OCF2.
ASSR (Asynchronous Timer/Counter): Thanh ghi status của timer 2, chỉ bit AS2 là ghi/đọc, còn lại là chỉ đọc
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | - | - | - | AS2 | TCN2UB | OCR2UB | TCR2UB |
Nói chung timer 2 này khá phức tạp khi sử dụng nó, sau này sẽ có bài viết cụ thể về bộ T/C2 này ứng dụng làm RTC...
Các code khởi tạo T/C tương tự như timer 0 chỉ khác tên thanh ghi, chú ý thanh ghi 16bit là 2 thanh 8bit.
Bài viết chúng ta dừng lại ở đây, thắc mắc để lại comment minh sẽ trả lời!
Bài viết sửa lúc 16-06-2014, 13:26 bởi Vũ Văn Thái