Nhờ giúp đỡ delay bằng timer0
Chào các bạn !
Mình mới làm quen với timer của Pic. Mình có viết chương trình delay 1s bằng timer.
Ý đồ chương trình là sau 1s thì PortB dịch trái, khi PortB dịch trái 5 lần thì PortC sẽ dịch trái.
Lỗi của chương trình là chỉ chạy đúng lần đầu, có nghĩa là PortC chỉ dịch trái 1 lần sau đó ko dịch trái theo đúng ý đồ nữa.
Dưới đây là code của mình, các bạn xem giúp mình với. Xin chân thành cám ơn!
#include <16F877A.h>
#include <def_877a.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
/* Cach tinh thoi gian delay cho timer
t_delay = (he_so_Prescaler x 4) / f_thach_anh x (256 - gia_tri_khoi_dau)
*/
int16 count1,count2;
int8 a,b;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6); // set_timer0(gia_tri_khoi_dau = 6)
++count1;
if(count1 == 2000) // 2000*500us = 500000us = 1s
{
rotate_left(&a,1);
count2++;
count1=0;
if(count2 == 5)
{
rotate_left(&b,1);
count2 == 0;
}
}
}
//Chuong trinh chinh
void main()
{
set_tris_b(0);
set_tris_c(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
a = 0x01;
b = 0x01;
count1 = 0;
count2 = 0;
while(true)
{
PORTB = a;
PORTC = b;
}
}
|