我在μ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);
}
答案 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