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