Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как правильно портировать код с CodeVisionAVR на WinAVR?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Volodin K.I.
Здравствуйте.

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

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

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

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

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

С Уважением, Володин Константин.
smac
Переменные изменяемые в прерываниях нужно объявить с квалификатором volatile, пристально в код не вглядывался, может и рабочий. А вообще RTFM.
artem79
Цитата(smac @ Jul 21 2009, 23:51) *
А вообще RTFM.


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

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


Исчерпывающе biggrin.gif
Volodin K.I.
дк. вчера сидел отлаживал. отправка через uart_putchar работает. не работает только прием символов.
mempfis_
Цитата(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();
}
Volodin K.I.
Вопрос ... это код все еще на WinAVR ?
mempfis_
Цитата(Volodin K.I. @ Jul 22 2009, 10:17) *
Вопрос ... это код все еще на WinAVR ?


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

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


на объявление прерываний в WinAVR и можете проверять работу.
Может быть придётся объявить несколько констант и адаптировать код под используемый уарт (вектора прерываний и названия регистров).
А в целом код рабочий и применяется во многих проектах. Один из них дуплексный ретранслятор уарт-радиоканал с интенсивным обменом данных в обоих направлениях. Работает всё без сбоев. Основное замечание размер фифо должен быть не менее длины посылки (у меня было ~80 байт) иначе посылки могут перекрыться.
Volodin K.I.
Всем спасибо! Код портировал. Все работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.