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

 
 
> Как правильно портировать код с 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
 
Start new topic
Ответов
Volodin K.I.
сообщение Jul 22 2009, 05:08
Сообщение #2


Участник
*

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



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


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

Группа: Свой
Сообщений: 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



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

 


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


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