Atmega 328p и USART

Доброе время суток)
Собственно, есть такая проблема. Пытаюсь проверить usart в arduino с контроллером mega 328p (прошиваю через avrdude как обычный мк, не пользуюсь arduino ide) с помощью вот такого кода:

  1. #include <avr/io.h>
  2. #define BAUD_PRESCALE 103
  3.  
  4. void USART_Transmit( char data )
  5. {
  6. while ((UCSR0A & (1 << UDRE0)) == 0) {}; //Ожидание опустошения буфера приема
  7. UDR0 = data; //Начало передачи данных
  8. }
  9.  
  10. int main (void)
  11. {
  12. char ReceivedByte;
  13.  
  14. UCSR0B |= (1 << RXEN0) | (1 << TXEN0); // Turn on the transmission and reception circuitry
  15. UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01); // Use 8-bit character sizes
  16.  
  17. UBRR0L = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
  18. UBRR0H = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
  19.  
  20. USART_Transmit('O');//Передаем при включении
  21. USART_Transmit('k');//сообщение "Ok!", что свидетельствует
  22. USART_Transmit('!');//о правильно работе программы
  23. USART_Transmit(0x0d);//переход в начало строки
  24. USART_Transmit(0x0a);//переход на новую строку
  25.  
  26. for (;;) // Loop forever
  27. {
  28. while ((UCSR0A & (1 << RXC0)) == 0) {}; // Do nothing until data have been recieved and is ready to be read from UDR
  29. ReceivedByte = UDR0; // Fetch the recieved byte value into the variable "ByteReceived"
  30.  
  31. while ((UCSR0A & (1 << UDRE0)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it
  32. UDR0 = ReceivedByte; // Echo back the received byte back to the computer
  33. }
  34. }

"Эхо" работает, контроллер возвращает принятые символы, но вот при включении вместо сообщения "Ok!" приходит мусор. Тот же код (с поправкой на регистры) на контроллере atmega8535 работает вполне корректно. В чем может быть ошибка?

Паузу после инициализации

Паузу после инициализации поставь! Контроллер не успевает привести все регистры в твою конфигурцию и отправляет данные левые.

Сделал паузу в 2 с. Не

Сделал паузу в 2 с. Не помогло

А разве регистр UDR0 ? не

А разве регистр UDR0 ? не просто UDR?
Хотя в принципе на вывод данных он не влияет.

Попробуй код отсюда: http://avrlab.com/node/438
Только регистры правильно укажи.

Изменил так#include void

Изменил так

  1. #include <avr/io.h>
  2.  
  3. void USART_Init( unsigned int baudrate );
  4. unsigned char USART_Receive( void );
  5. void USART_Transmit( unsigned char data );
  6.  
  7. int main( void ) //Главная функция
  8. {
  9. USART_Init( 103 ); //Скорость соединения 9600 бит/с при 16 mhz
  10. for(;;) //Вечный цикл
  11. {
  12. USART_Transmit( USART_Receive() );
  13. }
  14. }
  15.  
  16. void USART_Init( unsigned int baudrate ) //Функция инициализации USART
  17. {
  18. UBRR0H = (unsigned char) (baudrate>>8);
  19. UBRR0L = (unsigned char) baudrate;
  20. // UCSR0A = (1<<U2X); //Удвоение скорости
  21. UCSR0B = ( ( 1 << RXEN0 ) | ( 1 << TXEN0 ) );
  22. UCSR0C = (1<<USBS0) | (3<<UCSZ00);
  23. }
  24.  
  25. unsigned char USART_Receive( void ) //Функция приема данных
  26. {
  27. while ( !(UCSR0A & (1<<RXC0)) );
  28. return UDR0; //Возврат символа
  29. }
  30.  
  31. void USART_Transmit( unsigned char data )
  32. {
  33. while ( !(UCSR0A & (1<<UDRE0)) ); //Ожидание опустошения буфера приема
  34. UDR0 = data; //Начало передачи данных
  35. }

Работает, но с ошибками. Например, отправляю "f" - возвращает "v", а цифры правильно. Переходник usb-usart с другим контроллером работает нормально. Думал уже спалил пины Rx и Tx - но нет, если прошивать из arduino ide стандартными примерами работы с usart - то все без ошибок. Мистика какая-то)

Хм странный прикол,

Хм странный прикол, оптимизация кода не стоит хоть? Или наоборот, возможно нужно её включить?
Попробуй такой вариант.

Была включена на s, выключил

Была включена на s, выключил на 0 - не помогло...

Влепи паузу короткую на 20 мс

Влепи паузу короткую на 20 мс после программы инициализации, то я кода не вижу ты написал вроди бы пробовал. Именно вариант с отдельной подпрограммой инициализации в отдельной функции.