Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: scmRTOS: Прерывание от UARTа
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Colobox
Доброго времени суток!
Начал юзать scmRTOS v.3, написал простенькую тест-прогу с применением UART-прерывания:
....
#define scmRTOS_ISRW_TYPE TISRW_SS
...
#define scmRTOS_CONTEXT_SWITCH_SCHEME 0
...
#define OS_INTERRUPT __interrupt __raw
...
OS_PROCESS void TProc1::Exec()//sys tick=6 ms
{
for(;;)
{
LED1=1;//горит
Sleep(60);
LED1=0;//не горит
Sleep(60);

}
}
...

#pragma vector = USART_RXC_vect
OS_INTERRUPT void RX(void)
{
//
OS::scmRTOS_ISRW_TYPE ISR;
U_Rx();
}
//-------------------------------------------------------------------------
void U_Rx(void)
{
LED2=1;
}
...
Так вот в чем проблема: запуск, светодиод 1 мигает с периодом менее 1 сек.- типа процесс 1 работает. При посылке байта в УАРТ светодиод 2 честно загорается, но! период миганий первого светодиода становится уже не менее 6 сек. Что же с процессом?! Аналогичная задачка с применением внешнего прерывания по-спаду к такому эффекту не приводит.
_Sam_
Проблема в том что вы из UDR не читаете и после посылки одного байта прерывание генерируется постоянно.
dxp
Цитата(Colobox @ Jan 16 2008, 13:29) *
...
Так вот в чем проблема: запуск, светодиод 1 мигает с периодом менее 1 сек.- типа процесс 1 работает. При посылке байта в УАРТ светодиод 2 честно загорается, но! период миганий первого светодиода становится уже не менее 6 сек. Что же с процессом?! Аналогичная задачка с применением внешнего прерывания по-спаду к такому эффекту не приводит.

А флаг прерывания у вас сбрасывается? Если речь идет об AVR (не увидел, какой проц, пытаюсь догадаться), то у него, насколько помню, флаг прерывания сбрасывается путем чтения из регистра данных. Если все так, то у вас проц просто живет в прерывании - выходит, делает одну команду и снова туда...
ReAl
Вопрос не по scmRTOS, а по работе прерывания от USART, см. описание на микроконтроллер.
Цитата
When interrupt-driven data reception is used, the receive complete routine must read the received data from UDR in order to clear the RXC Flag, otherwise a new interrupt will occur once the interrupt routine terminates.
Итого при несброшенном RXC процессор продолжает обрабатывать прерывания друг за дружкой, успевая сделать по одной команде между выходом из прерывания и входом в новое.

А вот флаг от врнешнего прерывания по спаду сам сбрасывается при входе в обработчик, потому и проблем нет.
Добавьте
Код
//-------------------------------------------------------------------------
void U_Rx(void)
{
    (void)UDR; /* или, если ИАР такое не ест - unsigned char dummy = UDR; */
    LED2=1;
}

и всё должно затикать нормально.

Кстати, теги code придуманы для того, чтобы облегчить чтение кода. Если Вам нужна помощь, то именно Вы должны позаботиться о том, чтобы помогающему было легче разбираться.

Если, конечно, интересует результат. (С) Жванецкий
Colobox
Большое спасибо всем ответившим! ...но как же сам не дошел?!- так все просто.
Уж точно, если ничо не идет- посмотри же в даташит, наконец. ...Да, проц - АтМега8.
Насчет тегов,- даже в голову не пришло. Извиняйте, второй раз в форум код пишу,-
в следующий раз не премину воспользоваться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.