Jump to content
    

версия 3.10. Не работаю прерывания USART в ATmega168pa?

Заметил интересный феномен в версии 3.10 на микроконтроллере ATmega168pa.

 

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

 

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

 

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

 

В 4.0 это еще не проверял.

Share this post


Link to post
Share on other sites

Заметил интересный феномен в версии 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();
}

 

Никаких проблем не возникало.

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

 

Заменил на ISR и заработало.

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

 

В 4.0 это еще не проверял.

 

Проверял тоже в 3.10.

 

Share this post


Link to post
Share on other sites

ISR(USART_RX_vect)
{
  OS::TISRW_SS ISRW;
  ....
}

 

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

 

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

 

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

 

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

 

Edited by a9d

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

 

IAR я не использовал.

Также заметил, что тулчейн из студии 5.1 получше WinAVR. Разница почти в сто байт.

Компиляторы там одни и те-же, но в студии он посвежее.

Share this post


Link to post
Share on other sites

И что оно при использовании 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

Но кто же его предупреждения смотрит.

Share this post


Link to post
Share on other sites

И он обижается на неправильное имя, но ворчит, а не скандал поднимает:

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...