Вот пример работы с UART (большинство функций взято из Datasheet). Здесь UART настраивается на передачу 11-битных сообщений (старт-бит, 8 бит даннх, бит чётности, стоп-бит). Скорость задаётся при инициализации.
Код
unsigned char ParityBit(unsigned char byte) //функция вычисления бита чётности
{
unsigned char count = 0;
for (unsigned char i = 0; i < 8; i++)
if ((byte >> i) & 0x01)
count++;
return count & 0x01;
}
void USART_Init(unsigned int ubrr) //функция инициализации
{
UBRRH = (unsigned char) (ubrr >> 8);
UBRRL = (unsigned char) ubrr;
UCSRB = (1 << RXCIE) | (1 << RXEN) | (1 << TXEN) | (1 << UCSZ2);
return;
}
void USART_Transmit(unsigned char data) //отправка байта
{
while (!(UCSRA & (1 << UDRE)))
;
UCSRB &= ~(1 << TXB8);
if (ParityBit(data))
UCSRB |= (1 << TXB8);
UDR = data;
return;
}
unsigned char USART_Receive(void) //получение байта
{
unsigned char status, resh, resl;
while (!(UCSRA & (1 << RXC)))
;
status = UCSRA;
resh = UCSRB;
resl = UDR;
if (status & ((1 << FE) | (1 << DOR) | (1 << PE)))
return -1;
resh = (resh >> 1) & 0x01;
if (resh != ParityBit(resl))
return -1;
return resl;
}
ISR (SIG_UART_RECV) //обработчик прерывания по приходу байта
{
unsigned char data = USART_Receive();
//здесь обрабатывается принятый байт
}