From 703f8042f931fadca827a516c0e437f558770de2 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Sun, 9 Feb 2025 21:06:31 +0100 Subject: [PATCH] avr: more work on ardware uart code. --- avr/devices/t03/main.asm | 10 +- avr/modules/uart_hw/defs.asm | 36 ++- avr/modules/uart_hw/lowlevel.asm | 51 +++- avr/modules/uart_hw/lowlevel_uart1.asm | 107 +++----- avr/modules/uart_hw/m_lowlevel_uart.asm | 222 ++++++++++++++++ avr/modules/uart_hw/msglevel_recv.asm | 16 +- avr/modules/uart_hw/msglevel_send.asm | 19 +- avr/modules/uart_hw/ttyonuart1.asm | 334 ++++++++++++++++++++++++ 8 files changed, 698 insertions(+), 97 deletions(-) create mode 100644 avr/modules/uart_hw/m_lowlevel_uart.asm create mode 100644 avr/modules/uart_hw/ttyonuart1.asm diff --git a/avr/devices/t03/main.asm b/avr/devices/t03/main.asm index 3b50c58..fc07039 100644 --- a/avr/devices/t03/main.asm +++ b/avr/devices/t03/main.asm @@ -129,7 +129,8 @@ devInfoVersion: .db DEVICEINFO_VERSION, DEVICEINFO_REVISION ; v firmwareVersion: .db FIRMWARE_VARIANT_TEMP_WINDOW, FIRMWARE_VERSION_MAJOR .db FIRMWARE_VERSION_MINOR, FIRMWARE_VERSION_PATCHLEVEL -;firmwareStart: rjmp main + + firmwareStart: cli ; setup stack @@ -160,10 +161,11 @@ main_loop: and r16, r17 ori r16, (1< HWERR - rjmp UART_HW_Uart1_RxCharIsr_setStatusAndEnd -UART_HW_Uart1_RxCharIsr_recv: - lds r16, UCSR1A - sbrs r16, RXC1 - rjmp UART_HW_Uart1_RxCharIsr_end ; no data - lds r16, UDR1 - rcall UART_HW_InterfaceWriteToReadBuffer ; (R17, R18, X) - brcs UART_HW_Uart1_RxCharIsr_end - ldd r16, Y+UART_HW_IFACE_OFFS_STATUS ; set overrun error - ori r16, UART_HW_STATUS_OVERRUN ; -> OVERRUN -UART_HW_Uart1_RxCharIsr_setStatusAndEnd: - std Y+UART_HW_IFACE_OFFS_STATUS, r16 -UART_HW_Uart1_RxCharIsr_end: + M_UART_HW_Uart_RxCharIsr 1 + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine UART_HW_Uart1_TxUdreIsr @global +; +; Handler for UDRE1 interrupt called when TX data register is empty. +; +; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_MODE) +; @clobbers R16, (R17, R18, X) + +UART_HW_Uart1_TxUdreIsr: + M_UART_HW_Uart_TxUdreIsr 1 ret ; @end @@ -136,28 +121,14 @@ UART_HW_Uart1_RxCharIsr_end: ; --------------------------------------------------------------------------- ; @routine UART_HW_Uart1_TxCharIsr @global ; +; Handler for TXC1 interrupt called when a last byte has been completely sent and +; the data register is empty.. +; ; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_MODE) ; @clobbers R16, (R17, R18, X) UART_HW_Uart1_TxCharIsr: - lds r16, UCSR1A - sbrs r16,UDRE1 - rjmp UART_HW_Uart1_TxCharIsr_end ; not ready - rcall UART_HW_InterfaceReadFromWriteBuffer ; (R17, R18, X) - brcs UART_HW_Uart1_TxCharIsr_send ; got a byte, go send - - ; disable further DRE1 interrupts - lds r16, UCSR1B - cbr r16, (1< HWERR + rjmp l_setStatusAndEnd_% +l_recv_%: + lds r16, UCSR@0A + sbrs r16, RXC@0 + rjmp l_end_% ; no data + lds r16, UDR@0 + rcall UART_HW_InterfaceWriteToReadBuffer ; (R17, R18, X) + brcc l_overrun_% + clr r16 + std Y+UART_HW_IFACE_OFFS_READTIMER, r16 ; reset read timer + rjmp l_end_% +l_overrun_%: + ldd r16, Y+UART_HW_IFACE_OFFS_STATUS ; set overrun error + ori r16, (1< OVERRUN +l_setStatusAndEnd_%: + std Y+UART_HW_IFACE_OFFS_STATUS, r16 +l_end_%: +.endmacro +; @end + + + +; --------------------------------------------------------------------------- +; @macro M_UART_HW_Uart_TxUdreIsr +; +; Handler for UDREn interrupt called when TX data register is empty. +; +; @param %0 UART number ("0" for UART0) +; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_MODE) +; @clobbers R16, (R17, R18, X) + +.macro M_UART_HW_Uart_TxUdreIsr + lds r16, UCSR@0A + sbrs r16,UDRE@0 + rjmp l_end_% ; not ready + rcall UART_HW_InterfaceReadFromWriteBuffer ; (R17, R18, X) + brcs l_send_% ; got a byte, go send + + ; disable further DRE1 interrupts + lds r16, UCSR@0B + cbr r16, (1<