/* * uart.c * * Created: 20.02.2019 20:50:13 * Author: jens */ #include #include #include "uart.h" void uart_init(uint32_t baudrate) { 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<> 4) & 0xF); byte <<= 4; if (nibble < 10) c = nibble + '0'; else c = nibble + 'A' - 10; uart_putc(c); } } void print_word(uint16_t word) { int i; unsigned char c; for (i=0; i < 2; i++) { c = (char) (word >> 8); print_byte(c); word <<= 8; } }