ATmega328p,来自timer0的中断

时间:2015-12-14 22:53:31

标签: c interrupt avr atmega

我在μCATmega328p中遇到来自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);
}

1 个答案:

答案 0 :(得分:3)

好像你有一个打字错误,时钟没有提供给计时器,所以计时器仍然停止。

尝试

'Integer because you assign Integer value in the List
Dim BoldRows As New List(Of Integer)()

Dim detail_table_row as Integer = 1
While reader.read
    detail_table_row = detail_table_row + 1
    BoldRows.Add(detail_table_row)
End While

For Each row As Integer In BoldRows
    oDoc_detail_table.Range.Rows(row).Range.Font.Bold = True
Next

而不是

TCCR0B |= (1<<CS02)|(1<<CS00);// prescaler 1024