2015-12-14 71 views
0

我在μCATmega328p中有來自定時器0的中斷問題。 當中斷調用功能showOnScreen()時,程序不會在LCD上顯示任何東西。當在主循環中調用功能showOnScreen()時,一切正常。任何想法爲什麼當我使用中斷時它不起作用?ATmega328p,來自定時器0的中斷

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); 
} 
+0

這可能是一個goodd主意顯示有問題的功能。但是,從ISR調用該函數可能不太合適。請注意,您通過調用具有與其(隱式)聲明不同定義的函數來調用未定義的行爲。使用C99或C11編譯器,您將收到警告。 – Olaf

+0

如果我每次聽到「功能/模塊/程序/ ... XY是好的」,只有一分(以貨幣爲準)。使用調試器。不過,調用一個在中斷處理程序中不必要地花費大量時間的函數是一個非常糟糕的想法。如果你也在普通代碼中輸出某些東西,它將成爲一個明確的問題。只是我的2ct,但我只做這個工作幾十年,你可能有更多的經驗。 – Olaf

+0

我想你必須設置一個時鐘源並通過TCCR0B寄存器啓動定時器。 (對不起,如果你的任何函數已經這樣做) – MikeCAT

回答

3

看來你有一個錯字和時鐘沒有提供給定時器,因此定時器保持停止。

嘗試

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

,而不是

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