|
При входе в прерывание автоматически сбрасывается бит I (global interrupt enable) запрещая тем самым прерывания. Ставится обратно по команде reti.
Решение:
При входе в обработчик UART сбросить бит RXCIE (RX Complete Interrupt Enable), поставить бит I (__enable_interrupt(), __EINT(), SREG |= (1 << i) либо SREG_Bit7 = 1) перед выходом сбросить I, поставить RXCIE и выйти:
#pragma vector=UART_RX_vect
__interrupt void UART_RX_interrupt( void )
{
char data;
UCSRB &= ~(1 << RXCIE);
__enable_interrupt(); //declared in "inavr.h"
data = UDR; /* read the received data */if(data==0x30) // PRINT (USING UART) VARIABLES
{
while(!(USR&(1 << 5))); //ожидаем установки флага UDRE (UDR-пуст)
UDR=symbol;
}
__disable_interrupt();
UCSRB |= (1 << RXCIE);
}
E-mail: info@telesys.ru