thieuhuutrung
Trứng gà
cho em hỏi là, vòng đếm của timer0 sẽ đc pic thực hiện khi nào. chẳng hạn em có đoạn code sau
Ý tưởng của em là, cho 1 biến đếm m vào, khi mà m khác 7 thì thoát ra main, chạy timer và khi có ngắt thì m tăng lên 1 đơn vị, cho đến khi m=7(tương đương với delay 500ms) thì mới thực hiện những câu lệnh trong mod1(). mà sao khi nạp vô pic thì led luôn sáng @@(led nối anot chung như trong hướng dẫn) và có nháy nhưng rất nhanh. vì vậy, em thắc mắc là không biết timer0 nó đếm khi nào. khi mình đang chạy 1 cái khác thì timer 0 có đếm ko? cảm ơn mọi người đã đọc.
Code:
#include <htc.h>
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF); //1st config. Word
__CONFIG(BOR4V_BOR21V);
#define _XTAL_FREQ 4000000
unsigned int n=0;
unsigned int m=0;
void port_init()
{
ANSEL=0;
ANSELH=0; //Tat ca các port là digital
TRISA4=1; // RA4=TOCKI => input
TRISB=0x00; //8 pins PortB là output
PORTB=0xFF; //Xuat muc “1”
}
void timer0_init()
{
T0CS=0; //1: su dung chuc nang counter
//0: su dung chuc nang timer
T0SE=0; //1: high->low
//0: low->high
PSA=0; //1: chon ko chia tang
//0: chon chia tang( khi timer)
PS0=1;
PS1=1;
PS2=1; //1:256
T0IE=1; //1: cho phep ngat
//0: ko cho phep
GIE = 1;
T0IF=0;
TMR0=0x00; //set gia tri ban dau cua bo dem.
}
void interrupt isr()
{
if(T0IE&&T0IF)
{
if (n==15)
n=0;//n dem 1s
if (m==7)
m=0;//m dem 500ms
n++;
m++;
T0IF=0;
TMR0=0x00;
}
}
void mod1()
{
unsigned char chayled1[9]={0xff,0b11111110,0b11111100,0b11111000,0b11110000,0b11100000,0b11000000,0b10000000,0x00};
unsigned char shift,shiftbis;
int i,j;
for(i=0;i<9;i++)
{
PORTB=chayled1[i];
shift=0b10000000;
if (RA4==0)
break;
for(j=i;j<8;j++)
{
if ((RA4==0)||(m!=7))
break;
shiftbis = shift^0b11111111;
PORTB=chayled1[i]&shiftbis;
shift=shift>>1;
};
};
}
void main(void)
{
port_init();
timer0_init();
__delay_ms(10);
while(1)
{
mod1();
};
}