Trích:
Nguyên văn bởi LeDuc
Theo mình để dễ dàng thì bạn nên hiểu như thế này , timer 1 la timer 16 bit nghia la no co thể đếm từ 0 đến 65535 . Khi đếm hết nó sẽ quay lại từ đầu là 0 , và lúc đó sẽ xảy ra ngắt .
vd : giả sử cứ 1us timer đế lên 1 , vậy thì khi timer 1 tràn no sẽ đếm được 65535 um =65,535ms=0,065535 s .
Vậy để xác định thời gian ngắt thì chỉ việc xác định timer đếm bao nhiêu thôi đúng ko?
Bây giờ là cách xác định đây .
Thời gian đếm lên của timer phụ thuộc vào chu kỳ lệnh của vi điều khiển . chu kỳ lệnh bằng bao nhiêu thì thời gian định thời của timer củng như vậy . Nếu thạch anh 4M thì chu kỳ lệnh của VDK =1um .
Bậy giờ muốn 1s thì timer ngắt , nghia la sau 10^6 um . timer 1 phải ngắt , nhưng timer1 thì ko thể đếm đến 10^6. vậy ta phai sử dung chế độ prescale 1:8 . nghia la cứ 8 chu kỳ lệnh timer1 mới đếm lên 1 .. ==> 8*65535 = 524280 us .
Code:
#int timer1
void ngat_timer1()
{
set_timer1(24280); // mặc định giá trị ban đầu cho timer la 24280 .
dem++; // timer 1 tràn sau ==> 500 000 us = 0.5s
if(dem==2) // 2* 500 000 =1s
{
...................// thực hiện hành động ;
dem=0;
}
}
void main
setup_timer1(T1_INTERNAL|T1_DIV_BY_8); // cho timer 1 chay ở chế độ timer.Bột chia 8
set_timer1(24280) ; // mặc định số đếm ban đầu cho timer1 la 24280.
enable_interrupts(int_timer1); // cho phép ngắt timer 1
enable_interrupts(global); // cho phép ngắt toàn cục
while(true)
{
.............
}
|
Em thấy chỗ set giá trị cho timer1 sai thì phải, chổ này theo e tính toán thì phải là: set_timer1(3035);
(65535 - 3035)*1us*8 = 500000us