diff --git a/CMakeLists.txt b/CMakeLists.txt index 553883d..4e68e48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,12 @@ set_property(CACHE TCB_CLKSEL PROPERTY STRINGS TCB_CLKSEL_CLKTCA_gc ) +set(USART_RXMODE "USART_RXMODE_CLK2X_gc" CACHE STRING "USART at normal or double speed operation") +set_property(CACHE USART_RXMODE PROPERTY STRINGS + USART_RXMODE_CLK2X_gc + USART_RXMODE_NORMAL_gc +) + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.3") message(FATAL_ERROR "Insufficient AVR-GCC version; Support for ATtiny3216 was added in GCC v8") @@ -120,6 +126,7 @@ target_compile_definitions(mockingboard PRIVATE CLK_PRESCALE_DIV=${CLK_PRESCALE_DIV} __CLK_PRESCALE_DIV=__${CLK_PRESCALE_DIV} TCB_CLKSEL=${TCB_CLKSEL} + USART_RXMODE=${USART_RXMODE} ) target_compile_options(mockingboard PRIVATE --param=min-pagesize=0 diff --git a/CMakePresets.json b/CMakePresets.json index 2ce4148..f5a4a17 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -23,7 +23,8 @@ "cacheVariables": { "CMAKE_BUILD_TYPE": "RelWithDebInfo", "FREQSEL": "20MHz", - "TCB_CLKSEL": "TCB_CLKSEL_CLKDIV1_gc" + "TCB_CLKSEL": "TCB_CLKSEL_CLKDIV1_gc", + "USART_RXMODE": "USART_RXMODE_CLK2X_gc" } } ] diff --git a/src/com232.c b/src/com232.c index ef5b8dd..1ce9992 100644 --- a/src/com232.c +++ b/src/com232.c @@ -20,9 +20,6 @@ along with this program. If not, see . */ -#define USART_BAUD_RATE(BAUD_RATE) \ - (uint16_t)((float)(F_CPU * 64 / (16 * (float)BAUD_RATE)) + 0.5) - #include #include #include @@ -31,6 +28,15 @@ #include "com232.h" #include "timing.h" +#if USART_RXMODE == USART_RXMODE_CLK2X_gc +#define RXMODE_S 9 +#elif USART_RXMODE == USART_RXMODE_NORMAL_gc +#define RXMODE_S 16 +#endif + +#define USART_BAUD_RATE(BAUD_RATE) \ + (uint16_t)((float)(F_CPU * 64 / (USART_RXMODE * (float)BAUD_RATE)) + 0.5) + uint8_t RS232_RxCharBuffer[25], RS232_RxCharBegin, RS232_RxCharEnd; uint8_t readkey; @@ -44,11 +50,11 @@ void RS232_Init(void) { USART0.CTRLA = USART_RXCIE_bm; // Enable receive interrupts USART0.CTRLB = USART_RXEN_bm | USART_TXEN_bm | // Enable Rx/Tx and set receive - USART_RXMODE_NORMAL_gc; // mode normal + USART_RXMODE; // mode USART0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc | USART_CHSIZE_8BIT_gc | USART_SBMODE_1BIT_gc; // Async UART with 8N1 config - USART0.BAUD = USART_BAUD_RATE(250000); + USART0.BAUD = USART_BAUD_RATE(500000); } ISR(USART0_RXC_vect) {