реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> версия 3.10. Не работаю прерывания USART в ATmega168pa?
a9d
сообщение Jan 21 2012, 17:42
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



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

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


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

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

В 4.0 это еще не проверял.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 21 2012, 18:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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.
Go to the top of the page
 
+Quote Post
a9d
сообщение Jan 21 2012, 19:58
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



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


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

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

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

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


Сообщение отредактировал a9d - Jan 21 2012, 19:26
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 21 2012, 20:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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 нашёл их определение и что подставил?

Go to the top of the page
 
+Quote Post
a9d
сообщение Jan 21 2012, 20:50
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



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

IAR я не использовал.
Также заметил, что тулчейн из студии 5.1 получше WinAVR. Разница почти в сто байт.
Компиляторы там одни и те-же, но в студии он посвежее.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 22 2012, 12:33
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(_Артём_ @ 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

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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 22 2012, 14:45
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 02:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01423 секунд с 7
ELECTRONIX ©2004-2016