Есть следующий код:
Спойлер
#include <avr/io.h>void Сonfig()
{
UCSR1A = 0;
UCSR1B = (1 << RXEN1) | (1 << TXEN1);
UCSR1C = (1 << UCSZ11) | (1 << UCSZ10);
UBRR1H = 0;
UBRR1L = 103;
}
void Delay(unsigned int timer)
{
unsigned int tmp = 1600;
while(timer--)
{
while(tmp--);
tmp = 1600;
}
}
void UARTTransmitWord(unsigned char text[])
{
unsigned char count = 0;
while(text[count])
{
while(!(UCSR1A & (1 << UDRE1)));
UDR1 = text[count++];
}
}
int main(void)
{
Сonfig();
while(1)
{
UARTTransmitWord((unsigned char*)"Hello world!\x0D");
Delay(500);
}
}
Код пишу в Atmel Studio и CodeVisionAVR, результат везде одинаков. Перепробовал все все выходы с USART0 по USART3, везде одно и то же. Причем в Proteus все нормально работает, а вот на реальном железе ничего не выходит. Подключенный осциллограф показал всё то же самое. Стартовый и стоповый биты проходят, а данные нет.
Подозрения также были на неправильно высчитанную скорость обмена данными, но следующий код опроверг эти подозрения. Он работает как в Proteus так и на реальном железе, выводя последовательность чисел от 0x00 до 0xFF.
Спойлер
#include <avr/io.h>void Config()
{
UCSR1A = 0;
UCSR1B = (1 << RXEN1) | (1 << TXEN1);
UCSR1C = (1 << UCSZ11) | (1 << UCSZ10);
UBRR1H = 0;
UBRR1L = 103;
}
void Delay(unsigned int timer)
{
unsigned int tmp = 1600;
while(timer--)
{
while(tmp--);
tmp = 1600;
}
}
void UARTTransmitByte(unsigned char byte)
{
while(!(UCSR1A & (1 << UDRE1)));
UDR1 = byte;
}
int main(void)
{
Config();
unsigned char count = 0;
while(1)
{
UARTTransmitByte(count++);
Delay(500);
}
}