- 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
This commit is contained in:
2019-03-03 08:39:07 +00:00
parent 62a224defa
commit b915c39801
4 changed files with 104 additions and 84 deletions
+4 -11
View File
@@ -13,6 +13,7 @@
#include <avr/wdt.h> #include <avr/wdt.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include "machine.h"
#include "fifo.h" #include "fifo.h"
#include "message.h" #include "message.h"
#include "adc.h" #include "adc.h"
@@ -23,16 +24,8 @@
#include "mcp42x6.h" #include "mcp42x6.h"
#define PRINT(a,...) printf(a, ##__VA_ARGS__) #define PRINT(a,...) printf(a, ##__VA_ARGS__)
#define ARDUINO_NANO 1 #define PRINT_PROMPT putchar(0x0D);putchar(0x0A);putchar(':');
#define USART_BAUDRATE 115200UL
#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 TIMER_HW_CLOCK (F_CPU/8) #define TIMER_HW_CLOCK (F_CPU/8)
#define TIMER_IRQ_CLOCK 1000UL #define TIMER_IRQ_CLOCK 1000UL
#define TIMER_HW_RELOAD (0xFFFF-(TIMER_HW_CLOCK/TIMER_IRQ_CLOCK)) #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"); fifo_init(&messageFifo, 8, sizeof(Msg_t), "Fifo");
/* Replace with your application code */ /* Replace with your application code */
uart_init(&messageFifo, BAUD_PRESCALE); uart_init(&messageFifo, USART_BAUDRATE);
timer_init(&messageFifo, TIMER_HW_RELOAD, TimerClockSel_PS_8); timer_init(&messageFifo, TIMER_HW_RELOAD, TimerClockSel_PS_8);
adc_init(&messageFifo); adc_init(&messageFifo);
i2c_init(); i2c_init();
+21 -3
View File
@@ -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; 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 // Set baud rate
UBRR0L = (uint8_t)BAUD_PRESCALE; UBRR0L = (uint8_t)prescale;
UBRR0H = (uint8_t)(BAUD_PRESCALE >> 8); UBRR0H = (uint8_t)(prescale >> 8);
// Enable receiver and transmitter // Enable receiver and transmitter
UCSR0B = (1<<TXEN0)|(1<<RXEN0); UCSR0B = (1<<TXEN0)|(1<<RXEN0);
+5 -1
View File
@@ -9,11 +9,15 @@
#ifndef UART_H_ #ifndef UART_H_
#define UART_H_ #define UART_H_
#include "machine.h"
#include "fifo.h" #include "fifo.h"
void uart_init(Fifo *pFifo, uint16_t BAUD_PRESCALE); #define UART_PRESCALE(baudrate, smpPerBit) ((5+ 10*F_CPU / (baudrate*smpPerBit) - 1)/10)
void uart_init(Fifo *pFifo, uint32_t baudrate);
void uart_putc(char c); void uart_putc(char c);
int uart_putchar(char c, FILE *stream); int uart_putchar(char c, FILE *stream);
void uart_puts(char const *str); void uart_puts(char const *str);
#endif /* UART_H_ */ #endif /* UART_H_ */
+74 -69
View File
@@ -84,80 +84,82 @@
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<ToolchainSettings> <ToolchainSettings>
<AvrGcc> <AvrGcc>
<avrgcc.common.Device>-mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p"</avrgcc.common.Device> <avrgcc.common.Device>-mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p"</avrgcc.common.Device>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols> <avrgcc.compiler.symbols.DefSymbols>
<ListValues> <ListValues>
<Value>NDEBUG</Value> <Value>NDEBUG</Value>
</ListValues> <Value>ARDUINO_NANO=1</Value>
</avrgcc.compiler.symbols.DefSymbols> </ListValues>
<avrgcc.compiler.directories.IncludePaths> </avrgcc.compiler.symbols.DefSymbols>
<ListValues> <avrgcc.compiler.directories.IncludePaths>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value> <ListValues>
</ListValues> <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</avrgcc.compiler.directories.IncludePaths> </ListValues>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level> </avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> <avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.Pedantic>True</avrgcc.compiler.warnings.Pedantic> <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries> <avrgcc.compiler.warnings.Pedantic>True</avrgcc.compiler.warnings.Pedantic>
<ListValues> <avrgcc.linker.libraries.Libraries>
<Value>libm</Value> <ListValues>
</ListValues> <Value>libm</Value>
</avrgcc.linker.libraries.Libraries> </ListValues>
<avrgcc.assembler.general.IncludePaths> </avrgcc.linker.libraries.Libraries>
<ListValues> <avrgcc.assembler.general.IncludePaths>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value> <ListValues>
</ListValues> <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</avrgcc.assembler.general.IncludePaths> </ListValues>
</AvrGcc> </avrgcc.assembler.general.IncludePaths>
</AvrGcc>
</ToolchainSettings> </ToolchainSettings>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<ToolchainSettings> <ToolchainSettings>
<AvrGcc> <AvrGcc>
<avrgcc.common.Device>-mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p"</avrgcc.common.Device> <avrgcc.common.Device>-mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p"</avrgcc.common.Device>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols> <avrgcc.compiler.symbols.DefSymbols>
<ListValues> <ListValues>
<Value>DEBUG</Value> <Value>DEBUG</Value>
</ListValues> <Value>ARDUINO_NANO=1</Value>
</avrgcc.compiler.symbols.DefSymbols> </ListValues>
<avrgcc.compiler.directories.IncludePaths> </avrgcc.compiler.symbols.DefSymbols>
<ListValues> <avrgcc.compiler.directories.IncludePaths>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value> <ListValues>
</ListValues> <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</avrgcc.compiler.directories.IncludePaths> </ListValues>
<avrgcc.compiler.optimization.level>Optimize debugging experience (-Og)</avrgcc.compiler.optimization.level> </avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> <avrgcc.compiler.optimization.level>Optimize debugging experience (-Og)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel> <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
<avrgcc.linker.libraries.Libraries> <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<ListValues> <avrgcc.linker.libraries.Libraries>
<Value>libm</Value> <ListValues>
</ListValues> <Value>libm</Value>
</avrgcc.linker.libraries.Libraries> </ListValues>
<avrgcc.assembler.general.IncludePaths> </avrgcc.linker.libraries.Libraries>
<ListValues> <avrgcc.assembler.general.IncludePaths>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value> <ListValues>
</ListValues> <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</avrgcc.assembler.general.IncludePaths> </ListValues>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel> </avrgcc.assembler.general.IncludePaths>
</AvrGcc> <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
</ToolchainSettings> </ToolchainSettings>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@@ -179,6 +181,9 @@
<Compile Include="i2c.h"> <Compile Include="i2c.h">
<SubType>compile</SubType> <SubType>compile</SubType>
</Compile> </Compile>
<Compile Include="machine.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="main.c"> <Compile Include="main.c">
<SubType>compile</SubType> <SubType>compile</SubType>
</Compile> </Compile>