Nguyên văn bởi doituquan
Xem bài viết
Khi mô phỏng thì máy tính sẽ đáp ứng chậm hơn thực tế. Bạn dùng while(true) để đưa PORTB = 0xFF và dùng ngắt timer0 để xóa PORTB, để nhận rõ PORTB bị xóa bạn nên cho thêm delay vào while(true) để nó chậm lại và bạn nhìn thấy được hiệu ứng. Nếu bạn để while(true) thế kia nó sẽ chạy cực nhanh (tầm vài us một lần) nên khi ngắt timer0 xóa PORTB thì nó gần như ngay lập tức được while(true) set trở lại nên bạn không thấy được cả khi nó chạy đúng.
Về phía timer :
Timer thực chất là 1 bộ đếm (nên bạn mới thấy nó thường viết "timer/counter"). Nó sẽ đếm xung tại nguồn mà ta set cho nó. Bạn đã set cho RTCC là "RTCC_EXT_L_TO_H | RTCC_DIV_1" thì cứ sau 1 xung tác động vào RA4 thì bộ đếm của timer 0 tăng lên 1. Đến khi nó đếm được 255 và về 0 thì một ngắt timer0 được xảy ra (với loại timer 8 bit, timer 16 bit thì đếm đến 65535). Nếu bạn set cho timer0 là 0 thì sau 256 lần xung tác động vào RA4 thì nó mới xảy ra ngắt và xóa PORTB 1 lần. Để nó xóa PORTB sau mỗi xung vào RA4 thì bạn phải set cho nó là 255 để sau mỗi xung là 1 ngắt timer0 sẽ xảy ra.
Comment