Bài này giúp các bạn hiểu rõ về bộ định thời Timer và bộ đếm counter của PIC.

Bộ định thời Timer được ứng dụng rộng rãi và thường xuyên trong suốt quá trình lập trình cho bất kì dòng vi điều khiển nào. Dùng các bộ định thời Timer để tạo ra khoảng thời gian trễ, dùng timer trong ứng dụng điều chế độ rộng xung PWM.

counterpic

Tùy vào từng loại vi điều khiển mà tài nguyên timer (số lượng cũng như độ dài 8 bit hay 16bit hay 32 bit) Ví dụ : PIC 16F877A có 3 bộ timer :

  • Timer0: 8 bit (số đếm tối đa của nó là 255), hoạt động ở 2 chế độ định thời và bộ đếm.
  • Timer1: 16 bit (số đếm tối đa của nó là 65535), hoạt động ở 2 chế độ định thời và bộ đếm.
  • Timer2: 8 bit, hoạt động phục vụ chức năng PWM (Pulse Width Modulation- Điều chế độ rộng xung)

Timer được sử dụng ở 2 chế độ : Định thời (Timer) và bộ đếm ( Counter).

Khi hoạt động ở chế độ định thời :

Mỗi bộ timer có một hoặc nhiều thanh ghi chứa giá trị đếm của nó (tùy thuộc vào độ dài của timer), ta giả sử tên thanh ghi là TMR có độ dài là n byte, hay giá trị đếm tối đa là .

2 - 1 . Ví dụ : Timer 8 bit sẽ có 28 - 1 =255, Timer 16 bit sẽ có 216 - 1 = 65535.

Các lệnh CCS dùng cho timer :

enable_interrupts(GLOBAL);
setup_timer_x(mode); // X= 0,1,2,3,4... mode : RTCC_INTERNAL, RTCC_EXT_L_TO_H or RTCC_EXT_H_TO_L
set_timerx(value); // X=0,1,2,3,4... value : là một số nghuyên 8 bit, 16 bit, 32 bit tùy thuộc độ dài của timer
enable_interrupts(level);// cho phép ngắt timer level = INT_RTCC,INT_TIMER1....

Công thức tính  timer của PIC cho lệnh set_timerx(value); 

value = 2n -1 - delay*f/(4*Prescale) .

Trong đó n số bit của timer ( 8, 16 ) , delay : thời gian trẽ ( 1000us,100us...) trong công thức này delay các bạn đổi ra us, f: tần số thạch anh đơn vị là Mhz ,Prescale hệ số chia.

Ví dụ : khi có lệnh setup_timer_1(T1_INTERNAL|T1_DIV_BY_8 ); // sử dụng timer 1, n=16, Prescale=8, nếu các bạn muốn có delay=100ms=100000us thì giá trị  value là : 

value=216 - 1 - 100000x12/(4*8) = 28035.

Chú ý khi thực hiện tính toán, giá trị value phải phù hợp với độ dài của timer, từ 0--255 với timer 8 bit, 0--65535 với timer 16 bit.

Khi hoạt động Chế độ bộ đếm counter:

Trong ứng dụng này, timer hoạt động như một bộ đếm, có nhiệm vụ đếm số các xung đi vào một chân cụ thể trên vi điều khiển. Chế độ bộ đếm này có nhiều ứng dụng trong thực tế như đếm số vòng quay của động cơ (phản hồi từ bộ đo tốc độ động cơ- encoder), đếm sản phẩm, đo tần số ...

Khi được cài đặt ở chế độ này, một chân chức năng trên vi điều khiển sẽ trở thành chân đầu vào xung của bộ đếm. Ví dụ: chân RA4 đối với Timer0 và RC0 đối với Timer1

Khi được cài  đặt hoạt động trong chế độ bộ đếm, Giá trị của thanh ghi TMR sẽ tự động  tăng lên 1 đơn vị khi có một xung vào chân đầu vào xung của timer đó. Khi giá trị của TMR0 đạt đến giá trị tối đa, bit cờ của Timer sẽ được set lên mức 1 và TMR bị xóa, TMR=0.

Dạng xung được xác định là sườn âm hay sườn dương phụ thuộc vào việc cài đặt bit chọn dạng xung tương ứng trên thanh ghi của vi điều khiển.

Ví dụ cài đặt couter 1 : 

set_timer1(0); 
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
delay_ms(1000);
setup_timer_1(T1_DISABLED);

dem=get_timer1(); // Sau 1s thì cập nhật số đếm ( Chú ý điều kiện tràn của timer 1 là 65535 ) nếu tần số vào quá nhanh thì mình phải điều chỉnh thời gian cập nhật số đếm.

Epicviet.com