ATmega328p,定时器0中断
ATmega328p, interrupt from timer0
我在 µC ATmega328p 中的 timer0 中断有问题。
当中断调用函数 showOnScreen()
时,程序不会在 LCD 上显示任何内容。当在主循环中调用函数 showOnScreen()
时,一切正常。知道为什么当我使用中断时它不起作用吗?
int main(void){
DDRD = 0xf0;
PORTD = 0x0f;
LCD_Initalize();
LCD_Clear();
LCD_Home();
i2cSetBitrate(100);
DS3231_init();
DS3231_setTime(0 ,0 ,0);
DS3231_setDate(0, 1, 1, 1);
showOnScreenInit();
sei();
while(1) {
button();
}
return 0;
}
ISR(TIMER0_COMPA_vect){
showOnScreen();
}
void showOnScreenInit(void){
TCCR0A |= (1<<WGM01); //CTC
TCCR0A |= (1<<CS02)|(1<<CS00);// prescaler 1024
OCR0A = 100;
TIMSK0 |= (1<<OCIE0A); //compare match
}
编辑:我检查了 TCNT0
寄存器,这个寄存器一直等于 0,所以时钟没有启动。
void showOnScreen(void){
if (menuFlag == 0){
DS3231_getDateTime(&dateTime);
LCD_Clear();
show_time(&dateTime);
}
}
其余函数在 DS3231 库中:
void DS3231_getDateTime( TDATETIME * dt ) {
uint8_t i;
uint8_t buf[7];
TWI_read_buf( DS3231_ADDR, 0x00, 7, buf );
for( i=0; i<7; i++ ) dt->bytes[i] = bcd2dec( buf[i] );
}
void show_time( TDATETIME * dt ) {
char time[8];
sprintf(time, "%02d:%02d:%02d", dt->hh, dt->mm, dt->ss);
LCD_WriteText(time);
}
你好像打错了,没有为计时器提供时钟,所以计时器保持停止状态。
尝试
TCCR0B |= (1<<CS02)|(1<<CS00);// prescaler 1024
而不是
TCCR0A |= (1<<CS02)|(1<<CS00);// prescaler 1024
我在 µC ATmega328p 中的 timer0 中断有问题。
当中断调用函数 showOnScreen()
时,程序不会在 LCD 上显示任何内容。当在主循环中调用函数 showOnScreen()
时,一切正常。知道为什么当我使用中断时它不起作用吗?
int main(void){
DDRD = 0xf0;
PORTD = 0x0f;
LCD_Initalize();
LCD_Clear();
LCD_Home();
i2cSetBitrate(100);
DS3231_init();
DS3231_setTime(0 ,0 ,0);
DS3231_setDate(0, 1, 1, 1);
showOnScreenInit();
sei();
while(1) {
button();
}
return 0;
}
ISR(TIMER0_COMPA_vect){
showOnScreen();
}
void showOnScreenInit(void){
TCCR0A |= (1<<WGM01); //CTC
TCCR0A |= (1<<CS02)|(1<<CS00);// prescaler 1024
OCR0A = 100;
TIMSK0 |= (1<<OCIE0A); //compare match
}
编辑:我检查了 TCNT0
寄存器,这个寄存器一直等于 0,所以时钟没有启动。
void showOnScreen(void){
if (menuFlag == 0){
DS3231_getDateTime(&dateTime);
LCD_Clear();
show_time(&dateTime);
}
}
其余函数在 DS3231 库中:
void DS3231_getDateTime( TDATETIME * dt ) {
uint8_t i;
uint8_t buf[7];
TWI_read_buf( DS3231_ADDR, 0x00, 7, buf );
for( i=0; i<7; i++ ) dt->bytes[i] = bcd2dec( buf[i] );
}
void show_time( TDATETIME * dt ) {
char time[8];
sprintf(time, "%02d:%02d:%02d", dt->hh, dt->mm, dt->ss);
LCD_WriteText(time);
}
你好像打错了,没有为计时器提供时钟,所以计时器保持停止状态。
尝试
TCCR0B |= (1<<CS02)|(1<<CS00);// prescaler 1024
而不是
TCCR0A |= (1<<CS02)|(1<<CS00);// prescaler 1024