Files
HendiControlFirmware/Control/firmware/Bootloader/uart.c
T
jens feaf3666be [UART]
- fixed baudrate calculation

[Bootloader]
- set baudrate top 115200

[HendiCtrl]
- set baudrate top 115200
- revised and fixed command interpreter
- added new commands: SW_VERSION, SW_IDENTIFIER, DEBUG on/on, Remote enter, Remote exit
- oven is switched off on entering / exiting remote


git-svn-id: http://moon:8086/svn/projects/HendiControl@173 fda53097-d464-4ada-af97-ba876c37ca34
2019-03-30 11:48:05 +00:00

102 lines
1.5 KiB
C

/*
* uart.c
*
* Created: 20.02.2019 20:50:13
* Author: jens
*/
#include <stdlib.h>
#include <avr/io.h>
#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<<TXEN0)|(1<<RXEN0);
}
void uart_putc(char c)
{
while((UCSR0A & (1<<UDRE0)) == 0)
{
}
UDR0 = c;
}
char uart_getc()
{
while ((UCSR0A & (1 << RXC0)) == 0)
{
}
return UDR0;
}
void uart_puts(char const *str)
{
while(*str)
{
char c = *(str++);
uart_putc(c);
if (c == 0x0A)
{
uart_putc(0x0D);
}
}
}
void print_byte(char byte)
{
int i;
unsigned char c, nibble;
for (i=0; i < 2; i++)
{
nibble = (char)((byte >> 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;
}
}