Trích:
Nguyên văn bởi nhh
Để khởi động timer0,xóa bit T0CS về 0.Lúc này thanh ghi TMR0 sẽ tự động tăng lên một ứng với mỗi chu kỳ lệnh
|
T0CS không phải dùng để khởi động Timer0 mà T0CS dùng để chọn cho Timer0 ở chế độ timer hay counter.
Chế độ timer (T0CS = 0) thì TMR0 sẽ tăng lên 1 sau mỗi chu kì lệnh (khi prescaler = 1, nếu khác 1 thì là bộ của chu kì lệnh).
Chế độ counter thì T0CS =1 khi đó TMR0 sẽ tăng lên mỗi khi có một sườn lên hoặc sườn xuống xuất hiện trên chân T0CKI (RA4) ( chân này dạng open - drain nên bình thường nếu set dạng I/O bình thường thì phải mắc thêm trở kéo lên). Và chúng ta phải chọn sườn lên hay sườn xuống qua bít T0SE.
Trích:
Trong ứng dụng này do timer0 tràn sớm hơn 1s khi dùng thạch anh 10MHz,do vậy dùng thêm một biến đếm số lần tràn sao cho khi biến này giảm xuống 0 thì xấp xỉ 1s.
Trong 20s đầu,đèn xanh bật ON,từ giây 21 đến 30 có thêm đèn vàng ON, 20s cuối đèn đỏ ON.
Các chân từ a đến g của led 7 seg đầu nối với RC0 đến RC6, led còn lại nối RB0 đến RB6.
|
Mình nghĩ bạn nên làm một timer0 trễ 1ms. Sau đó tuỳ ứng dụng mình sẽ sử dụng là bội của 1ms này. Tức là dùng biến static để đếm sự kiện tràn timer0.
Lưu ý: timer0 là bộ free - auto counter sau khi thiết lập ở chế độ timer thì nó sẽ đếm mãi mà không dừng. thanh ghi OPTION ở chế độ sau reset = 0xFF nên ban đầu nó ở chế độ Counter sẽ đếm xung bên ngoài.
Mình xin ví dụ một hàm ngắt với timer0 dùng HTPIC. Với thạch anh 20MHZ thì hàm ngắt timer0 1ms -> TMR0 = 6
Code:
void interrupt inter0(void){
static unsigned char i;
static unsigned int counter; // bien dem su kien ngat timer0
if(T0IF & T0IE){ // neu co ngat Timer0 xay ra
TMR0 = 6;
T0IF = 0 ; // xoa co ngat, cong viec khong the thieu sau ham ngat
++ counter;
if (counter == a ) {
// do something
};
};
}
Trong hàm init chọn như sau: dùng pre cho timer0 với tỉ lệ 1:2
Code:
void init(void){
// khoi tao cho các port
// Khoi tao cho cac thanh ghi
OPTION = 0x00; // dung prescaler cho timer0 voi ti le la 1:2
// Khoi tao cho ngat Timer0
GIE = 1; // cho phep ngat toan cuc
T0IE = 1; // cho phep ngat timer0
T0IF = 0; // xoa co ngat timer0
TMR0 = 6; // khoi tao
}