Chào mừng đến với Câu Lạc Bộ Sáng Tạo
Chia sẻ kinh nghiệm
Kết nối đam mê
Đang cập nhật thời gian...
BÀI VIẾT NỔI BẬT
Xin chào! Tôi là Ếch Sáng Tạo :-)
Chia sẻ trang




Chuyên mục
Bài mới
Xem nhiều
Thống kê
  • Bài viết: 334/334
  • Thành viên: 10.085
  • Đang online: 4
  • Khách hôm nay: 1.810
  • Khách hôm qua: 4.629
  • Tổng khách: 16.194.061
Bài viết
[Bài 2] Tìm hiểu bộ Timer-Counter trên AVR - SangTaoClub.Net
[Bài 2] Tìm hiểu bộ Timer-Counter trên AVR
Đăng bởi: Vũ Văn Thái - Thời gian: 15-06-2014, 11:55
Chuyên mục: Học lập trình AVR - Lượt xem: 20.628

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
  • Bạn chưa đăng nhập, không thể viết bình luận!
    Bấm vào đây để Đăng nhập hoặc Đăng ký!
  • Vũ Văn Thái lúc 21-12-2015, 16:14
    Giá trị đó chính là các bit bạn set trong thanh ghi đó được chuyển sang cơ số 16 để cho gọn bạn nhé, bạn có thể dùng máy tính có chuyển đổi giữa các hệ để chuyển.
    • vanbao_1093 lúc 22-12-2015, 00:08
      vậy mình làm sao set ra được như vậy Ad.? giả sử: chip mega8, thạch anh 8mhz sử dụng timer 1 để tạo ra 2 kênh băm xung. bây giờ cách tính tần số máy , chu kỳ máy , sử dụng bộ chia như thế nào đề 2 thanh ghi TCCR1A;1B ra duoc giá trị 0xA2;   
      0x1A; . Ad có thể hướng dẫn giúp em được không,em chưa hiểu về timer/couter lắm em mới học AVR chưa nắm bắt được.thanks Ad nhiều.!
  • vanbao_1093 lúc 21-12-2015, 00:39


    Ad cho em hoi. cách tính như thế nào để ra được giá tri thanh ghi
       VD
    TCCR1A=0xA2;   
    TCCR1B=0x1A;
  • vanbao_1093 lúc 21-12-2015, 00:34

    Chữ đậm
  • dangnhap90 lúc 26-10-2014, 21:42
    A lam mạch cho e dc k a
  • Trang 1/1: 1

    Bài viết cùng chuyên mục
    ATMG16 giao tiếp với LCD ATMG16 giao tiếp với LCD
    Đăng bởi: haydayanh - Thời gian: 04-06-2021, 22:33
    Chuyên mục: Học lập trình AVR - Lượt xem: 2.683
    Hướng dẫn làm KIT AVR đơn giản Hướng dẫn làm KIT AVR đơn giản
    Đăng bởi: Vũ Văn Thái - Thời gian: 25-10-2014, 09:39
    Chuyên mục: Học lập trình AVR - Lượt xem: 11.063
    [Bài 6] Lập trình giao tiếp USART và RS232 với AVR [Bài 6] Lập trình giao tiếp USART và RS232 với AVR
    Đăng bởi: Vũ Văn Thái - Thời gian: 15-08-2014, 15:25
    Chuyên mục: Học lập trình AVR - Lượt xem: 19.132
    [Bài 5] Lập trình ADC - Đo nhiệt độ dùng LM35 hiển thị LCD với AVR [Bài 5] Lập trình ADC - Đo nhiệt độ dùng LM35 hiển thị LCD với AVR
    Đăng bởi: Vũ Văn Thái - Thời gian: 25-06-2014, 10:17
    Chuyên mục: Học lập trình AVR - Lượt xem: 57.869
    [Bài 4] Lập trình giao tiếp LCD16x2 cho AVR trên CodeVisionAVR [Bài 4] Lập trình giao tiếp LCD16x2 cho AVR trên CodeVisionAVR
    Đăng bởi: Vũ Văn Thái - Thời gian: 22-06-2014, 10:42
    Chuyên mục: Học lập trình AVR - Lượt xem: 24.168
    [Bài 3] Lập trình ngắt cho AVR trên CodeVisionAVR [Bài 3] Lập trình ngắt cho AVR trên CodeVisionAVR
    Đăng bởi: Vũ Văn Thái - Thời gian: 16-06-2014, 14:06
    Chuyên mục: Học lập trình AVR - Lượt xem: 23.181
    [Bài 1] Xuất nhập Port đơn giản cho AVR [Bài 1] Xuất nhập Port đơn giản cho AVR
    Đăng bởi: Vũ Văn Thái - Thời gian: 29-05-2014, 21:22
    Chuyên mục: Học lập trình AVR - Lượt xem: 9.835
    Hướng dẫn set fuse bit cho AVR Hướng dẫn set fuse bit cho AVR
    Đăng bởi: Vũ Văn Thái - Thời gian: 16-05-2014, 22:09
    Chuyên mục: Học lập trình AVR - Lượt xem: 22.638
    Mạch nạp ISP cho vi điều khiển AVR và 89S Mạch nạp ISP cho vi điều khiển AVR và 89S
    Đăng bởi: Vũ Văn Thái - Thời gian: 10-05-2014, 12:22
    Chuyên mục: Học lập trình AVR - Lượt xem: 20.753
    Lập trình C trong CodeVisionAVR Lập trình C trong CodeVisionAVR
    Đăng bởi: Vũ Văn Thái - Thời gian: 28-04-2014, 19:30
    Chuyên mục: Học lập trình AVR - Lượt xem: 17.146
    
    Chào mừng hieutrang đã tham gia câu lạc bộ sáng tạo!
    Vũ Văn Thái - vuthai
    Hôm nay là sinh nhật của asantasibite, ngoctuictu, anhtu230492, moonmoon, vanhopdt2, nguyenminhvy, huy12345, tuan1996, stepphen01, tuan_cho1999, cowboyamiable, dung2304, ← Gửi tin nhắn chúc mừng
    Múi giờ: UTC+07:00 - Asia/Ho Chi Minh ***** IP của bạn: 18.117.81.240 ***** Status: Cache Update thành công!