/* * uart.c * * Created: 20.02.2019 20:50:13 * Author: jens */ #include #include #include #include "uart.h" #include "message.h" static Fifo *g_pFifo = NULL; ISR(USART_UDRE_vect) { } ISR(USART_TX_vect) { } ISR(USART_RX_vect) { uint8_t status = UCSR0A; if (status & (1 << RXC0)) { uint8_t rx_data = UDR0; Msg_t msg = { .code = Uart, .m.uart.data = rx_data }; fifo_push(g_pFifo, &msg); } } void uart_init(Fifo *pFifo, uint32_t baudrate) { g_pFifo = pFifo; uint32_t prescale8 = UART_PRESCALE(baudrate, 8UL); uint32_t prescale16 = UART_PRESCALE(baudrate, 16UL); uint32_t fcpu8 = (prescale8 * baudrate * 8); uint32_t fcpu16 = (prescale16 * baudrate * 16); uint32_t err8 = abs(fcpu8 - F_CPU); uint32_t err16 = abs(fcpu16 - F_CPU); uint16_t prescale = prescale16; if (err8 < err16) { prescale = prescale8; // Double UART speed UCSR0A |= 1 << U2X0; } // Set baud rate uint16_t reg = prescale - 1; UBRR0L = (uint8_t)reg; UBRR0H = (uint8_t)(reg >> 8); // Enable receiver and transmitter UCSR0B = (1<