Trích:
Nguyên văn bởi thaithien
Code:
#include <16F887.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06
int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count == 2000) // 2000*500us = 1000000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh chinh
void main(void)
{
set_tris_b(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
set_timer0(6);// T_dinhthi =delay= 2*(256 - 6)*1us = 500us
//INitTIMER0=6;prescaler=2(do RTCC_div_2
a = 0x01;
while(true)
{
PORTB = a;
}
}
|
Bạn tính thời gian thì ok nhưng lệnh set giá trị timer0 hoàn toàn không thực thi và đồng bộ trong thời gian 1 chu kỳ(1us) nên dẫn đến chương trình bị trễ do cộng dồn 2000 lần ngắt.
Giá trị của biến toàn cục ko được khởi tạo giá trị ban đầu thường bằng 0 khi chip power on lần đầu và bằng giá trị lần cuối được gán nếu chỉ bị reset.