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

 
 
 
Reply to this topicStart new topic
> Как правильно портировать код с CodeVisionAVR на WinAVR?, Как правильно портировать код с CodeVisionAVR на WinAVR?
Volodin K.I.
сообщение Jul 21 2009, 18:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 5-12-07
Пользователь №: 33 012



Здравствуйте.

Для создания примера эхо прошивки контроллера АТMega1281 на порту USART0 (принимает символ и сразу отсылает) использовал визард кода в CodevisionAVR (см. codevision.c).

Однако проект будет реализоввываться на базе WinAVR, поэтому я попытался портировать код на WinAVR (см. winavr.c).

Проект я перенес, теперь 0 ошибок, 0 предупреждений.

Но оно естественно не работает.

Вопрос в том где здесь могут быть подводные камни при портировании?

С Уважением, Володин Константин.
Прикрепленные файлы
Прикрепленный файл  codevision.zip ( 1.96 килобайт ) Кол-во скачиваний: 55
Прикрепленный файл  winavr.zip ( 1.88 килобайт ) Кол-во скачиваний: 53
 
Go to the top of the page
 
+Quote Post
smac
сообщение Jul 21 2009, 19:51
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Переменные изменяемые в прерываниях нужно объявить с квалификатором volatile, пристально в код не вглядывался, может и рабочий. А вообще RTFM.
Причина редактирования: Ненужное цитирование.
Go to the top of the page
 
+Quote Post
artem79
сообщение Jul 22 2009, 04:52
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 187
Регистрация: 4-01-07
Из: Казань
Пользователь №: 24 091



Цитата(smac @ Jul 21 2009, 23:51) *
А вообще RTFM.


Так же интересует вопрос переноса проекта. Не расшифруете что значит RTFM?
Go to the top of the page
 
+Quote Post
Volodin K.I.
сообщение Jul 22 2009, 04:56
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 5-12-07
Пользователь №: 33 012



Цитата(artem79 @ Jul 22 2009, 08:52) *
Так же интересует вопрос переноса проекта. Не расшифруете что значит RTFM?

RTFM - читайте этот fucking мануал
Go to the top of the page
 
+Quote Post
artem79
сообщение Jul 22 2009, 04:59
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 187
Регистрация: 4-01-07
Из: Казань
Пользователь №: 24 091



Цитата(Volodin K.I. @ Jul 22 2009, 08:56) *
RTFM - читайте этот fucking мануал


Исчерпывающе biggrin.gif
Go to the top of the page
 
+Quote Post
Volodin K.I.
сообщение Jul 22 2009, 05:08
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 5-12-07
Пользователь №: 33 012



дк. вчера сидел отлаживал. отправка через uart_putchar работает. не работает только прием символов.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jul 22 2009, 06:51
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Volodin K.I. @ Jul 22 2009, 08:08) *
дк. вчера сидел отлаживал. отправка через uart_putchar работает. не работает только прием символов.

Да возьмите вы документацию на контроллер. Там есть всё что нужно - и функция инициализации, и отправка символа, и приём.
Один в один копируете, вставляете в проект и всё работает.

Зхо делается элементарно
Код
void main(void)
{
uart_init(baud);

for(;;)
{
      putchar(getchar());
}
}


Извиняюсь просмотрел что вы хотите сделать с фифо по прерываниям.
Словами долго объяснять что можно былобы подправить в вашем коде,
приведу пример работающей реализации отправки/приёма символов через уарт с помощью фифо.

Код
#pragma vector=USART_RX_vect
__interrupt void USART_RX_IRQ(void)
{
      //прерывание по завершению приёма байта
      //читаем регистр данных уарта в RXFIFO чтобы очистить флаг прерывания
      RxBuf[RxHead++] = UDR0;
      if (RxHead >= UARTRXBUFSIZE) RxHead = 0;
}
/**************************************************************/


Код
#pragma   vector =  USART_TX_vect
__interrupt void USART_TXC(void)
  {  
    if (TxTail != TxHead)
      {
         UDR0  = TxBuf[TxTail++];  // пересылка следующего байта в прерывании
         if (TxTail >= UARTTXBUFSIZE) TxTail = 0;// проверка переполнения
      }
    
  }
/**************************************************************/


функции считывания/занесения данных в фифо

Код
/*********************************************************/
signed int getcharFIFO()
  {
     signed int data = -1;
     if (RxTail != RxHead)
        {
           data = RxBuf[RxTail++];
           if (RxTail >= UARTRXBUFSIZE) RxTail = 0;
        }
     return(data); //возвращаем -1 если фифо пусто или данные
  }
/**************************************************************/


Код
/**************************************************************/
void putcharFIFO(signed char data)
   {      
      if ((TxHead == TxTail) && (UCSR0A & (1<<UDRE0)))  UDR0 = data;
      else
        {
          TxBuf[TxHead++] = (unsigned char) data;
          if (TxHead >= UARTTXBUFSIZE) TxHead = 0;
        }
   }
/**************************************************************/


Собственно организация эха выглядит так

Код
for(;;)
{
    __watchdog_reset();
    __enable_interrupt();
    __sleep();
      
      
    __disable_interrupt();
    signed int temp;
    temp = getcharFIFO();
    if(temp != -1) putcharFIFO();
}


Сообщение отредактировал mempfis_ - Jul 22 2009, 07:09
Go to the top of the page
 
+Quote Post
Volodin K.I.
сообщение Jul 22 2009, 07:17
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 5-12-07
Пользователь №: 33 012



Вопрос ... это код все еще на WinAVR ?
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jul 22 2009, 07:42
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Volodin K.I. @ Jul 22 2009, 10:17) *
Вопрос ... это код все еще на WinAVR ?


Это проект под IAR.
Поменяйте строчки типа

Код
#pragma   vector =  USART_TX_vect
__interrupt void USART_TXC(void)


на объявление прерываний в WinAVR и можете проверять работу.
Может быть придётся объявить несколько констант и адаптировать код под используемый уарт (вектора прерываний и названия регистров).
А в целом код рабочий и применяется во многих проектах. Один из них дуплексный ретранслятор уарт-радиоканал с интенсивным обменом данных в обоих направлениях. Работает всё без сбоев. Основное замечание размер фифо должен быть не менее длины посылки (у меня было ~80 байт) иначе посылки могут перекрыться.
Go to the top of the page
 
+Quote Post
Volodin K.I.
сообщение Jul 27 2009, 15:40
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 5-12-07
Пользователь №: 33 012



Всем спасибо! Код портировал. Все работает.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 10:00
Рейтинг@Mail.ru


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