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) {