Цитата(tolik_zp @ Jan 24 2007, 10:12)

рано обрадовался... не помогло
Откуда известно, что прерывание работает? Дерганья ногой в нем не замечаю. Зато вижу, что при приходе любого числа байт, не кратного четырем код будет крутиться в одном из циклов
Код
while (!(UCSRA & (1<<RXC)));
rtc_hour = UDR;
while (!(UCSRA & (1<<RXC)));
rtc_min = UDR;
while (!(UCSRA & (1<<RXC)));
с запрещенными прерываниями. Почему бы не сделать так:
Код
typedef struct {
uint8_t day;
uint8_t hour;
uint8_t min;
uint8_t sec;
uint8_t sec_div8;
} rtc_t;
rtc_t rtc;
if (UCSRA & (1<<RXC))
{
rtc_t Received;
Received.day = UDR;
while (!(UCSRA & (1<<RXC)));
Received.hour = UDR;
while (!(UCSRA & (1<<RXC)));
Received.min = UDR;
while (!(UCSRA & (1<<RXC)));
Received.sec = UDR;
Received.sec_div8 = 0;
__disable_interrupt();
rtc = Received;
__enable_interrupt();
Beep_Short();
}
#pragma vector = TIMER2_COMP_vect
__interrupt void rtc_interrupt (void)
{
rtc.sec_div8++;
if (rtc.sec_div8 == 8)
{
rtc.sec_div8 = 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;
}
}
}
}
}
Здесь прерывания запрещены на короткое время копирования из временной структуры в основную.
Кстати, определить куда именно улетела программа можно вставив дерганье ногой в ключевые места.