Есть такой код в функции main:
if (UCSRA & (1<<RXC)) { __disable_interrupt(); rtc_day = UDR; while (!(UCSRA & (1<<RXC))); rtc_hour = UDR; while (!(UCSRA & (1<<RXC))); rtc_min = UDR; while (!(UCSRA & (1<<RXC))); rtc_sec = UDR; __enable_interrupt(); Beep_Short(); }
if (!(PIND & (1<<PD7))) { Beep_Low(); USART_Transmit(rtc_sec); USART_Transmit(rtc_min); USART_Transmit(rtc_hour); USART_Transmit(rtc_day); while (!(PIND & (1<<PD7))); }
Также имеем следующий обработчик прерывания:
#pragma vector = TIMER2_COMP_vect __interrupt void rtc_interrupt (void) { rtc_0125_sec++; if (rtc_0125_sec == 8) { rtc_0125_sec = 0; rtc_sec++; } if (rtc_sec == 60) { rtc_sec = 0; rtc_min++; } if (rtc_min == 60) { rtc_min = 0; rtc_hour++; } if (rtc_hour == 24) { rtc_hour = 0; rtc_day++; } if (rtc_day == 8) rtc_day = 1; }
Прерывание работает нормально, проверено. Проблема в том, что иногда, после получения из UART'а данных, программа виснет, но прерывание по-прежнему работает. Такое впечатление, что PC улетает в неведомые дали. StartUp-код стандартный IAR'овский, проц мега8. Подскажите, всезнающий all, в чем может быть проблема?
|