Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: версия 3.10. Не работаю прерывания USART в ATmega168pa?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
a9d
Заметил интересный феномен в версии 3.10 на микроконтроллере ATmega168pa.

Код
OS_INTERRUPT void USART_RXC_vect()
{
    OS::TISRW_SS ISRW;
        .....
}


Это прерывание не срабатывает. Тоже самое и с TX.

Заменил на ISR и заработало. Но это походу некорректно.

В 4.0 это еще не проверял.
_Артём_
Цитата(a9d @ Jan 21 2012, 19:42) *
Заметил интересный феномен в версии 3.10 на микроконтроллере ATmega168pa.

Код
OS_INTERRUPT void USART_RXC_vect()
{
    OS::TISRW_SS ISRW;
        .....
}


Это прерывание не срабатывает. Тоже самое и с TX.


Использовал нечто подобное на Меге128 (RXC и UDRE, а не TXC):
Код
#pragma vector=USART1_RXC_vect
__interrupt void GSMUartRx()
{
    OS::TISRW_SS ISRW;
    unsigned char i=UDR1;
    GsmRxPtr.WriteByte(i);
#if (COPY_GSMUART_TO_EXTUART==1)
    ExtTxPtr.WriteByte(i);
#endif
}

#pragma vector=USART1_UDRE_vect
__interrupt void GSMUartTx()
{
    OS::TISRW_SS ISRW;
    unsigned char i=GsmTxPtr.ReadByte();
    UDR1=i;
#if (COPY_GSMUART_TO_EXTUART==1)
    ExtTxPtr.WriteByte(i);
#endif
    if (GsmTxPtr.BufferNotEmpty()==0)
        StopGsmUartTx();
}


Никаких проблем не возникало.
Возможно что-то неправильно с инициализацией прерываний?

Цитата(a9d @ Jan 21 2012, 19:42) *
Заменил на ISR и заработало.

ISR это - TISRW? Или scmRTOS_ISRW_TYPE? Или что?

Цитата(a9d @ Jan 21 2012, 19:42) *
В 4.0 это еще не проверял.


Проверял тоже в 3.10.
a9d
Код
ISR(USART_RX_vect)
{
  OS::TISRW_SS ISRW;
  ....
}


Это если без обверток ОС.

В четвертой версии тоже не работает.

Пля. Лоханулся.

Нужно использовать USART_RX_vect и USART_TX_vect вектора а не USART_RXC_vect и USART_TXC_vect.
_Артём_
Цитата(a9d @ Jan 21 2012, 21:58) *
Пля. Лоханулся.

Нужно использовать USART_RX_vect и USART_TX_vect вектора а не USART_RXC_vect и USART_TXC_vect.


Ясно. Опять Атмел с именами учудил.

И что оно при использовании USART_RXC_vect и USART_TXC_vect компилировалось как ни в чём не бывало? Где тогда IAR нашёл их определение и что подставил?

a9d
Отлично компилируется, но не пашет.

IAR я не использовал.
Также заметил, что тулчейн из студии 5.1 получше WinAVR. Разница почти в сто байт.
Компиляторы там одни и те-же, но в студии он посвежее.
ReAl
Цитата(_Артём_ @ Jan 21 2012, 22:33) *
И что оно при использовании USART_RXC_vect и USART_TXC_vect компилировалось как ни в чём не бывало? Где тогда IAR нашёл их определение и что подставил?
Как уже сказали, avr-gcc. И он обижается на неправильное имя, но ворчит, а не скандал поднимает:
Код
include <avr/interrupt.h>

ISR(FOO_vect) { }

Код
$ avr-gcc -Os -mmcu=atmega8 -S isr.c
isr.c:3: warning: ‘FOO_vect’ appears to be a misspelled signal handler

Но кто же его предупреждения смотрит.
_Артём_
Цитата(ReAl @ Jan 22 2012, 14:33) *
И он обижается на неправильное имя, но ворчит, а не скандал поднимает:
isr.c:3: warning: ‘FOO_vect’ appears to be a misspelled signal handler[/code]
Но кто же его предупреждения смотрит.

C GCC не работал, вот и удивляюсь.
IAR в таком случае ошибку выдаёт:
Код
Error[Pe020]: identifier "TCE3_OVF_vect" is undefined
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.