Trích:
Nguyên văn bởi phandinh
bác namqn chỉ cho em cách dùng timer được không?
.khởi tạo
.thiết lập giá trị ban đầu.
|
PIC16F877A có nhiều loại timer, tôi chỉ lấy ví dụ về Timer 1 ở đây. Giả sử tần số xung clock là 4 MHz, có nghĩa là mỗi chu kỳ máy (bao gồm 4 chu kỳ xung clock) sẽ kéo dài 1 us. Lại giả sử cần định thời 100 ms.
Nếu chọn xung clock thực thi lệnh là nguồn xung clock cho Timer 1, thì chúng ta cần đếm đủ 100000 chu kỳ máy (= 100000 us) để định khoảng thời gian 100 ms. Vì bộ đếm của Timer 1 chỉ có độ dài 16-bit, giá trị lớn nhất mà Timer 1 có thể đếm được mà không bị tràn là 65535. Do đó, chúng ta cần giảm tần số xung đi vào Timer 1 để có thể đạt được mục đích. Điều này có thể thực hiện bằng cách sử dụng bộ chia (tần) trước (prescaler). Bộ chia trước của Timer 1 trong PIC16F877A có thể chia 1, 2, 4, hay 8 tần số clock trước khi đưa vào Timer 1. Ở ví dụ này, tôi chọn hệ số chia là 8. Như vậy, số đếm mà Timer 1 sẽ đếm được ứng với 100 ms sẽ là 100000/8 = 12500. Vì Timer 1 chỉ tràn từ 0xFFFF về 0x0000, cần thiết lập trước giá trị của các thanh ghi TMR1H và TMR1L để sẽ tràn trong 12500 lần đếm, tức là giá trị TMR1 = 65536 - 12500 = 53026 = 0xCF2C. Xem thêm hình 6-2 trong datasheet của PIC16F877A để hiểu rõ hơn phần trình bày trên.
Code để thiết lập Timer 1 như sau:
Code:
T1CON = 0x30; // Prescale = 1:8, dung clock thuc thi lenh
TMR1H = 0xCF // TMR1 = 0xCF2C
TMR1L = 0x2C
T1CON = T1CON | 0x01; // Bat Timer 1
Trong chương trình chính, người dùng có thể xét trạng thái của bit TMR1IF (bit 0 của thanh ghi PIR1) để kiểm tra xem đã hết thời gian cần chờ hay chưa. Người dùng cần xóa bit TMR1IF này sau khi đã sử dụng xong để dùng cho lần định thời tiếp theo.
Một nhắc nhở nhỏ: Bạn nên tránh nêu đích danh người được hỏi, và chú ý là những câu hỏi loại này không phải chỉ có một vài người có thể trả lời.
Thân,