Ответ: (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ShiphT 25 февраля 2003 г. 10:54
В ответ на: Ответ: У меня прерывания разрешены с самого начала программы. отправлено RS 25 февраля 2003 г. 10:36

При входе в прерывание автоматически сбрасывается бит 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);
}


PS: Не надо в обработчике чего-то ждать. Возможно наложение прерываний.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru