Я работаю над последовательной связью своей платы MultiWii Pro, основанной на atmega2560. Я использую avr-gcc для компиляции и avrdude для программирования.
Вот моя проблема. Я пытаюсь заставить atmega2560 отправить что-то (шестнадцатеричное значение) на терминал. Однако, независимо от значения, присвоенного UDR2, и независимо от значения, которое я присвоил UBRR2L и UBRR2H, на выходе терминала всегда будет 0xff, если я установил скорость терминала на 9600 бод, и 0xff, если я установил скорость терминала на 115200 бод.
Вот мой код
#define F_CPU 8000000UL
#define BAUDRATE 19200 //The baudrate to use
#define BAUD_PRESCALLER ((F_CPU / (BAUDRATE * 16UL))-1)
static void InitializeUART()
{
UBRR2L = (uint8_t)(BAUD_PRESCALLER);
UBRR2H = (uint8_t)(BAUD_PRESCALLER>>8);
UCSR2B |= (1<<RXEN2) | (1<<TXEN2); //RX TX Enable
UCSR2C |= (1<<USBS2)|(1<<UCSZ21)|(1<<UCSZ20);
}
И моя функция отправки
void USART2Write(char data)
{
while( !(UCSR2A & (1<<UDRE2)));
UCSR2B &= ~(1<<TXB82); //in the case if there are more than 8 bits of data
if(data & 0x100)
{
UCSR2B |= (1 << TXB82);
}
UDR2 = data;
}
В моем случае скорость передачи моего кода 19200. Скорость передачи терминала также 19200. Независимо от того, что я назначил UDR2, на выходе всегда будет 0x15.
Вот моя настройка предохранителя
Low High Extended
0xFF 0xD8 0xFD