Atmega 328p и USART
Написал serzhoz дата Пт, 03/30/2012 - 18:38
"Эхо" работает, контроллер возвращает принятые символы, но вот при включении вместо сообщения "Ok!" приходит мусор. Тот же код (с поправкой на регистры) на контроллере atmega8535 работает вполне корректно. В чем может быть ошибка?
Доброе время суток)
Собственно, есть такая проблема. Пытаюсь проверить usart в arduino с контроллером mega 328p (прошиваю через avrdude как обычный мк, не пользуюсь arduino ide) с помощью вот такого кода:
#include <avr/io.h> #define BAUD_PRESCALE 103 void USART_Transmit( char data ) { while ((UCSR0A & (1 << UDRE0)) == 0) {}; //Ожидание опустошения буфера приема UDR0 = data; //Начало передачи данных } int main (void) { char ReceivedByte; UCSR0B |= (1 << RXEN0) | (1 << TXEN0); // Turn on the transmission and reception circuitry UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01); // Use 8-bit character sizes UBRR0L = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register UBRR0H = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register USART_Transmit('O');//Передаем при включении USART_Transmit('k');//сообщение "Ok!", что свидетельствует USART_Transmit('!');//о правильно работе программы USART_Transmit(0x0d);//переход в начало строки USART_Transmit(0x0a);//переход на новую строку for (;;) // Loop forever { while ((UCSR0A & (1 << RXC0)) == 0) {}; // Do nothing until data have been recieved and is ready to be read from UDR ReceivedByte = UDR0; // Fetch the recieved byte value into the variable "ByteReceived" while ((UCSR0A & (1 << UDRE0)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it UDR0 = ReceivedByte; // Echo back the received byte back to the computer } }
"Эхо" работает, контроллер возвращает принятые символы, но вот при включении вместо сообщения "Ok!" приходит мусор. Тот же код (с поправкой на регистры) на контроллере atmega8535 работает вполне корректно. В чем может быть ошибка?
»
Паузу после инициализации
Паузу после инициализации поставь! Контроллер не успевает привести все регистры в твою конфигурцию и отправляет данные левые.
Сделал паузу в 2 с. Не
Сделал паузу в 2 с. Не помогло
А разве регистр UDR0 ? не
А разве регистр UDR0 ? не просто UDR?
Хотя в принципе на вывод данных он не влияет.
Попробуй код отсюда: http://avrlab.com/node/438
Только регистры правильно укажи.
Изменил так#include void
Изменил так
Работает, но с ошибками. Например, отправляю "f" - возвращает "v", а цифры правильно. Переходник usb-usart с другим контроллером работает нормально. Думал уже спалил пины Rx и Tx - но нет, если прошивать из arduino ide стандартными примерами работы с usart - то все без ошибок. Мистика какая-то)
Хм странный прикол,
Хм странный прикол, оптимизация кода не стоит хоть? Или наоборот, возможно нужно её включить?
Попробуй такой вариант.
Была включена на s, выключил
Была включена на s, выключил на 0 - не помогло...
Влепи паузу короткую на 20 мс
Влепи паузу короткую на 20 мс после программы инициализации, то я кода не вижу ты написал вроди бы пробовал. Именно вариант с отдельной подпрограммой инициализации в отдельной функции.