roboforum.ru

Технический форум по робототехнике.

Проблема с программированием UART на OR-AVR-M32-D

Проблема с программированием UART на OR-AVR-M32-D

moldov » 12 апр 2011, 13:17

Всем привет.

Написал простенькую програмку для OR-AVR-M32-D посылаю в UART 1 или 2, соответственно должен загораться или гаситься LED на PB3. Проверил в VMLAB все отлично работает.
Прошиваю в контроллер нифига не работает. Подключаюсь к UART контроллера получаю на выходе кракозябру из 3 символов вместо "Ok!" В настройках терминала стоит 9600 8-1.
Что-то приходит, но из за частоты видимо не так как надо. Подскажите какую частоту установить в USART_Init (0x33) или как правильно фьюзы прописать.

Вот фьюзы и частота из make файла. Фьюзы взял с http://roboforum.ru/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%B2%D1%8B%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_fuse-%D0%B1%D0%B8%D1%82%D0%BE%D0%B2_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%D0%BE%D0%B2_Open_Robotics

Код: Выделить всёРазвернуть
DEVICE     = atmega32
CLOCK      = 7372800
PROGRAMMER = -c USBasp -P avrdoper
OBJECTS    = main.o
FUSES      = -U hfuse:w:0xD9:m -U lfuse:w:0xFF:m


А вот и сам код.

Код: Выделить всёРазвернуть
#include <avr/io.h>              // Most basic include files
#include <avr/interrupt.h>       // Add the necessary ones here



void USART_Transmit( unsigned char data );
void USART_Init( unsigned int baud );




ISR(USART_RXC_vect)

{

   int b;
   b = UDR;
   
   // Выполняем обработку принятого байта
   
   if(b=='1')//Если приняли "1"
      
   {
      PORTB |= (1 << 3);
      USART_Transmit('R');//Отправляем букву "R"
      USART_Transmit(0x0d);//переход в начало строки
      USART_Transmit(0x0a);//переход на новую строку
      
   }
   
   else//Если нет
      
      if(b=='2')//Если приняли "2"
         
      {
         PORTB &= ~(1 << 3);
         USART_Transmit('L');//Отправляем букву "L"
         USART_Transmit(0x0d);//переход в начало строки
         USART_Transmit(0x0a);//переход на новую строку
         
      }
   
}

void USART_Transmit( unsigned char data ) {
   /* Wait for empty transmit buffer */
   while ( !( UCSRA & (1<<UDRE)) )
      ; /* Put data into buffer, sends the data */
   UDR = data;
}



void USART_Init( unsigned int baud ) {
   /* Set baud rate */
   UBRRH = (unsigned char)(baud>>8);
   UBRRL = (unsigned char)baud;
   
   /* Enable receiver and transmitter */
   UCSRB = (1<<RXEN)|(1<<TXEN);
   UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0);  // Set frame format: 8data, 1stop bit
   /* Set frame format: 8data, 2stop bit */
   //UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
   
   UCSRB |= (1 << RXCIE); // Enable the USART Recieve Complete interrupt (USART_RXC)
   sei();// Enable the Global Interrupt Enable flag so that interrupts can be processed
}

unsigned char USART_Receive( void ) {
   /* Wait for data to be received */
   while ( !(UCSRA & (1<<RXC)) )
      ; /* Get and return received data from buffer */
   return UDR;
}



// ***********************************************************
// Main program
//
int main(void) {
   DDRB = 0xFF; //Для отладки
   
   //Скорость USART 9600 при кварцевом генераторе 8MHz
   
   USART_Init (0x33);
   USART_Transmit('O');//Передаем при включении
   USART_Transmit('k');//сообщение "Ok!", что свидетельствует
   USART_Transmit('!');//о правильно работе программы
   USART_Transmit(0x0d);//переход в начало строки
   USART_Transmit(0x0a);//переход на новую строку
   
   
   while(1) {             // Infinite loop; define here the
      
   }
   
}


Re: Проблема с программированием UART на OR-AVR-M32-D

avr123.nm.ru » 12 апр 2011, 13:21

Советую для теста написать более простую погу. Например в цикле класть что-то прямо в UDR. желательно еще светодиодом помигать чтоб сразу обнаружить движение проги и оценить частоту такта.

Re: Проблема с программированием UART на OR-AVR-M32-D

=DeaD= » 12 апр 2011, 13:24

Попробуйте отсюда взять примеры программирования UART'а:
mediawiki/images/a/af/OR-AVR-M32-N-PG.pdf

Re: Проблема с программированием UART на OR-AVR-M32-D

boez » 12 апр 2011, 13:30

Крокозяблы = неправильная скорость, в 99% случаев.

Вот:
CLOCK = 7372800

И вот:
//Скорость USART 9600 при кварцевом генераторе 8MHz
USART_Init (0x33);

По идее надо не 0x33 (=51), а 47, для 7372800.

Re: Проблема с программированием UART на OR-AVR-M32-D

moldov » 13 апр 2011, 15:59

Ребята, спасибо всем огромное. Обязательно все попробую, и отпишусь. Сегодня просто времени нет, оставил сладкое на завтра:)

Добавлено спустя 16 минут 17 секунд:
boez писал(а):Крокозяблы = неправильная скорость, в 99% случаев.

Вот:
CLOCK = 7372800

И вот:
//Скорость USART 9600 при кварцевом генераторе 8MHz
USART_Init (0x33);

По идее надо не 0x33 (=51), а 47, для 7372800.


Именно так и ни как иначе. Я был уверен что 0х33, поленился почитать мануал а просто слизал у кого-то код посчитав что так и надо:)

Re: Проблема с программированием UART на OR-AVR-M32-D

Vooon » 13 апр 2011, 20:54

А чем не нравится HAL из орфы?

Re: Проблема с программированием UART на OR-AVR-M32-D

moldov » 14 апр 2011, 15:38

Дело в том что люблю сам все ковырять. По крайней мере прошивки, паять тоже могу, но лень. Собственно, решил возродить все свои контроллерные знания полученные в молодости.
Проект OR пока интересует только со стороны железа как платформа для своих идей. Да и купил модули потому что надо поддерживать отечественных производителей-единомышленников. Мне кажется ROBOFORUM самый многочисленный и интересный в рунете. По крайней мере нет снобов:)


Rambler\'s Top100 Mail.ru counter