From b915c398011d6b5349046a792494d3a93b971ac8 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 3 Mar 2019 08:39:07 +0000 Subject: [PATCH] - UART takes baudrate on init - UART calculate optimized baud prescaler git-svn-id: http://moon:8086/svn/projects/HendiControl@47 fda53097-d464-4ada-af97-ba876c37ca34 --- Control/firmware/uart_echo/main.c | 15 +-- Control/firmware/uart_echo/uart.c | 24 +++- Control/firmware/uart_echo/uart.h | 6 +- Control/firmware/uart_echo/uart_echo.cproj | 143 +++++++++++---------- 4 files changed, 104 insertions(+), 84 deletions(-) diff --git a/Control/firmware/uart_echo/main.c b/Control/firmware/uart_echo/main.c index d3d1e0a..52af4e0 100755 --- a/Control/firmware/uart_echo/main.c +++ b/Control/firmware/uart_echo/main.c @@ -13,6 +13,7 @@ #include #include +#include "machine.h" #include "fifo.h" #include "message.h" #include "adc.h" @@ -23,16 +24,8 @@ #include "mcp42x6.h" #define PRINT(a,...) printf(a, ##__VA_ARGS__) -#define ARDUINO_NANO 1 - -#define PRINT_PROMPT putchar(0x0D);putchar(0x0A);putchar(':'); -#if ARDUINO_NANO -#define F_CPU (16000000UL) // MHz -#else -#define F_CPU (18432000UL) // MHz -#endif -#define USART_BAUDRATE 9600UL -#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) +#define PRINT_PROMPT putchar(0x0D);putchar(0x0A);putchar(':'); +#define USART_BAUDRATE 115200UL #define TIMER_HW_CLOCK (F_CPU/8) #define TIMER_IRQ_CLOCK 1000UL #define TIMER_HW_RELOAD (0xFFFF-(TIMER_HW_CLOCK/TIMER_IRQ_CLOCK)) @@ -96,7 +89,7 @@ int main(void) fifo_init(&messageFifo, 8, sizeof(Msg_t), "Fifo"); /* Replace with your application code */ - uart_init(&messageFifo, BAUD_PRESCALE); + uart_init(&messageFifo, USART_BAUDRATE); timer_init(&messageFifo, TIMER_HW_RELOAD, TimerClockSel_PS_8); adc_init(&messageFifo); i2c_init(); diff --git a/Control/firmware/uart_echo/uart.c b/Control/firmware/uart_echo/uart.c index 898ec05..99467ff 100644 --- a/Control/firmware/uart_echo/uart.c +++ b/Control/firmware/uart_echo/uart.c @@ -33,13 +33,31 @@ ISR(USART_RX_vect) } } -void uart_init(Fifo *pFifo, uint16_t BAUD_PRESCALE) +void uart_init(Fifo *pFifo, uint32_t baudrate) { g_pFifo = pFifo; + uint16_t prescale8 = UART_PRESCALE(baudrate, 8UL); + uint16_t prescale16 = UART_PRESCALE(baudrate, 16UL); + + uint32_t baud8 = ((prescale8+1) * 8); + uint32_t baud16 = ((prescale16+1) * 16); + + uint32_t err8 = abs(baudrate - baud8); + uint32_t err16 = abs(baudrate - baud16); + + uint16_t prescale = prescale16; + if (err8 < err16) + { + prescale = prescale8; + + // Double UART speed + UCSR0A |= 1 << U2X0; + } + // Set baud rate - UBRR0L = (uint8_t)BAUD_PRESCALE; - UBRR0H = (uint8_t)(BAUD_PRESCALE >> 8); + UBRR0L = (uint8_t)prescale; + UBRR0H = (uint8_t)(prescale >> 8); // Enable receiver and transmitter UCSR0B = (1< - -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p" - True - True - True - True - False - True - True - - - NDEBUG - - - - - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include - - - Optimize for size (-Os) - True - True - True - True - - - libm - - - - - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include - - - + -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p" + True + True + True + True + False + True + True + + + NDEBUG + ARDUINO_NANO=1 + + + + + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include + + + Optimize for size (-Os) + True + True + True + True + + + libm + + + + + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include + + + - -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p" - True - True - True - True - False - True - True - - - DEBUG - - - - - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include - - - Optimize debugging experience (-Og) - True - True - Default (-g2) - True - - - libm - - - - - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include - - - Default (-Wa,-g) - + -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p" + True + True + True + True + False + True + True + + + DEBUG + ARDUINO_NANO=1 + + + + + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include + + + Optimize debugging experience (-Og) + True + True + Default (-g2) + True + + + libm + + + + + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include + + + Default (-Wa,-g) + @@ -179,6 +181,9 @@ compile + + compile + compile