AVR Timer/Counter Trên Atmega16 - P1

1. Giới thiệu

Timer/Counter là một ngoại vi thông dụng mà bất cứ dòng vi điều khiển nào cũng có, được sử dụng rất nhiều trong các ứng dụng thực tế như quét led, tạo xung PWM, đo tần số, định thời… Do đó, đây là một ngoại vi quan trong mà người học chắc chắn phải tìm hiểu.

Timer/Counter là một bộ đếm, đếm xung clock. Trong bộ Timer/Counter có các thanh ghi chứa giá trị đếm và thanh ghi điều khiển hoạt động đếm này. Nguồn xung nhịp được chọn để đếm trong các vi điều khiển có thể là nguồn xung clock nội (bên trong vi điều khiển) hoặc có thể là nguồn xung clock được cấp từ thạch anh bên ngoài.

Trong vi điều khiển Atmega16 có 3 bộ Timer/Couter, trong đó có 2 bộ Timer/Counter 8 bit là Timer0 và Timer2, 1 bộ Timer 16 bit là Timer.

Các chế độ hoạt động của Timer/Counter trong Atmega16:

  1. Chế độ định thời
  2. Chế độ đếm sự kiện
  3. Chế độ tạo xung điều rộng PWM
  4. Chế độ Input Capture (không có trên Timer/Counter0,2)
  5. Chế độ Output Compare

2. Các bộ Timer/Counter trên Atmega16

Một số định nghĩa cần nắm trước khi sử dụng Timer/Counter trong Atmega16:

2.1. Timer/Counter 0

Các thanh ghi được thiết kế cho hoạt động và điều khiển của Timer/Counter0 là: TCCR0, TCNT0, OCR0, TIMSK,TIFR.

Thanh ghi TCCR0 – Timer/Counter Control Register: Thanh ghi điều khiển hoạt động của Timer/Counter0.

Trong thanh ghi này, cần chú đến đến các bit sau:

Có 4 Mode hoạt động của Timer/Counter0 là: Normal, PWM Phase Correct, CTC và Fast PWM.

  • Bit 3,6 – WGM01:0: Waveform Generation Mode: Các bit chọn chế độ hay chọn dạng sóng.
  • Bit 5:4 – COM01:00: Compare Output Mode: Khi chân OC0 được kết nối, chức năng của các bit COM01:0 phụ thuộc vào các chế độ của các bit WGM01:0 .

- Mode Output Capture, chế độ không phải PWM:

- Mode Output Capture, chế độ Fast PWM Mode:

- Mode Output Capture, chế độ Phase Correct PWM Mode:

Bit 2:0 – CS02:0: Clock Select: là các bit chọn nguồn xung nhịp cho bộ Timer/Counter.

Thanh ghi TCNT0 (Timer/Counter Register): Thanh ghi 8 bit chứa giá trị vận hành của Timer/Counter0, cho phép bạn đọc và ghi trực tiếp (lưu giá trị đếm).

  • x = Delta_T * F_CPU/Clock
  • TCNT0 = 255 - x;
* Delta_T: Khoảng thời gian định thì, F_CPU: Tần số thạch anh, Clock: Bộ chia (prescaler)

Thanh ghi OCR0 (Output Compare Register): Thanh ghi so sánh giá trị đầu ra chứa 8 bit giá trị được so sánh liên tục với giá trị bộ đếm (TCNT0). Một kết quả so sánh bằng có thể được sử dụng để tạo ra một ngắt so sánh đầu ra hoặc để tạo đầu ra dạng sóng trên chân OC0.

Thanh ghi TIMSK (Timer/Counter Interrupt Mask Register): Thanh ghi mặt nạ ngắt dùng cho tất cả các Timer/Counter.

Ta chỉ quan tâm đến các bit 0 và 1 của TIMSK:

  • Bit 1 – OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable): bit cho phép ngắt khi có giá trị bằng xảy ra trong việc so sánh TCNT0 và OCR0.
  • Bit 0 – TOIE0 (Timer/Counter0 Overflow Interrupt Enable): bit cho phép ngắt khi có tràn ở Timer/Counter0. Tràn xảy ra khi giá trị trong TCNT0 đạt đến MAX (255) và lại đếm thêm 1 lần nữa.

Thanh ghi TIFR (Timer/Counter Interrupt Flag Register): Thanh ghi cờ ngắt cho bộ Timer/Counter.

  • Bit 1 – OCF0 (Output Compare Flag 0): bit này được set lên 1 khi xảy ra phép so sánh TCNT0 và OCR0 có giá trị bằng.
  • Bit 0 – TOV0 (Timer/Counter0 Overflow Flag): bit TOV0 được set lên 1 khi xảy ta tràn trong Timer/Counter0.

2.2. Timer/Counter 1

Timer/Counter1 là một bộ Timer/Counter 16 bit, đa chức năng, rất phù hợp cho lập trình đo lường và điều khiển vì có độ phân giải cao, có khả năng tạo xung điều rộng PWM (Pulse Width Modulation).

Các thanh ghi trong Timer/Counter1:

Thanh ghi TCCR1A và TCCR1B (Timer/Counter1 Control Register A và B): Thanh ghi điều khiển của Timer/Counter1.

Ta cần quan tâm một số bit quan trọng sau:

  • Bit COM1A1:0 (Compare Output Mode for Channel A): Chọn mode Output Compare cho kênh A.
  • Bit COM1B1:0 (Compare Output Mode for Channel B): Chọn mode Output Compare cho kênh B.

  • Bit WGM13-10 (Waveform Generation Mode): các bit dùng để chọn các chế độ hay chọn dạng sóng.

  • Bit CS12-10 (Clock Select): Chọn chế độ xung nhịp cho Timer/Counter1.

  • Bit ICES1 (Input Capture Edge Select): bit lựa chọn loại cạnh (cạnh lên hay xuống) để kích Input Capture.

Khi ICES=0, cạnh xuống của tín hiệu vào sẽ kích Input Capture, nếu ICES=1 thì cạnh lên sẽ kích. Thanh ghi ICR1 chứa giá trị chính của Input Capture.

Thanh ghi TCNT1H và TCNT1L (Timer/Counter1): thanh ghi 16 bit chứa giá trị vận hành của Timer/Counter1 có thể đọc, ghi trực tiếp.

Các thanh ghi OCR1AH - OCR1AL và OCR1BH- OCR1BL (Output Compare Register 1A và 1B): là các thanh ghi so sánh giá trị đầu ra chứa 16 bit được so sánh liên tục với giá trị bộ đếm (TCNT1). Một kết quả so sánh bằng có thể được sử dụng để tạo ra một ngắt so sánh đầu ra hoặc để tạo đầu ra dạng sóng trên chân OC1x.

 

Thanh ghi ICR1H – ICR1L (Input Capture Register 1): Input Capture sẽ lấy được giá trị của bộ đếm (TCNT1) mỗi khi có sự kiện xảy ra trên chân ICP1 trên vi điều khiển.

 

Thanh ghi TIMSK (Timer/Counter Interrupt Mask Register): Các bộ Timer/Counter trên AVR dùng chung thanh ghi mặt nạ ngắt, vì vậy TIMSK cũng dùng để quy định ngắt cho Timer/Counter1. Ta chỉ quan tâm đến các bit từ 2 đến 5 của TIMSK.

  • Bit 5 – TICIE1 (Input Capture Interrupt Enable): bit cho phép ngắt trong trường hợp Input Capture được dùng.
  • Bit 4 – OCIE1A (Output Compare A Match Interrupt Enable): bit cho phép ngắt khi TCNT1 có giá trị bằng OCR1B.
  • Bit 3 – OCIE1B (Output Compare B Match Interrupt Enable): bit cho phép ngắt khi TCNT1 có giá trị bằng OCR1A.
  • Bit 2 – TOIE1 (Overflow Interrupt Enable): bit quy định ngắt tràn cho thanh ghi Timer/Counter1.

Thanh ghi TIFR (Timer/Counter Interrupt Flag Register): thanh ghi cờ nhớ cho các bộ Timer/Counter.

  • Bit ICF1: cờ này được set lên 1 khi có sự kiện thay đổi ở chân ICP1.
  • Bit OCF1A: cờ này được set lên 1 khi giá trị TCNT1 bằng OCR1A.
  • Bit OCF1B: cờ này được set lên 1 khi giá trị TNCT1 bằng OCR1B.
  • Bit TOV1: cờ này được set lên 1 khi xảy ra tràn Timer/Counter1.

2.3.  Timer/Counter 2 

Về mặt chức năng, Timer/Counter2 gần giống như Timer/Counter0. Tuy nhiên, điểm khác biệt của nó là khả năng hoạt động không đồng bộ với chip, nó giống như bạn tách Timer/Counter2 ra thành một chip timer riêng. Vì thế, cần cung cấp một nguồn xung clock khác cho timer này (1 thạch anh khác).

Trong bài này, mình đã giới thiệu cơ bản về Timer/Counter và các thanh ghi dùng trong Timer/Counter với ATmega16, bài tiếp theo mình sẽ đưa ra các ví dụ cụ thể về các chức năng của Timer/Counter.

Nhận xét

Mới hơn Cũ hơn