OlegALL (04.01.2014 09:25 - 09:31, просмотров: 1584)
В обработчике прерывания по приёму изменяю переменную flag (=1). Однако при переходе в основной цикл ветка if не обрабатывается. (не заходит внутрь). Не понимаю почему. Если бы вместо обработчика была простая функция, тогда всё ок - проверял.
Компилятор AVR Studio 4.18
Код:
int main (void){
init();
while (1){
if (flag == 1){
PORTC |= 1<<PC4;
PORTC |= 1<<PC4;
}
asm("nop");
}
}
ISR(USART_RX_vect){
flag = 1;
switch (rx_stage){
case WAITING_START:
if (UDR0 == REQUEST_START){
request[rx_stage] = UDR0;
rx_stage++;
}
break;
case WAITING_COMMAND:
request[rx_stage] = UDR0;
rx_stage++;
break;
case WAITING_LRC_HIGH:
request_lrc.byte.high = UDR0;
rx_stage++;
break;
case WAITING_LRC_LOW:
request_lrc.byte.low = UDR0;
rx_stage = 0;
//if (request_lrc.two_bytes == get_lrc()){
if (request_lrc.byte.high == 0x00){
// приём завершён
debug();
}
if (request_lrc.byte.low == 0x3b){
// приём завершён
debug();
}
/*
if (request_lrc.two_bytes == 0x00){
// приём завершён
debug();
}*/
break;
default:
rx_stage = 0;
break;
}
}