improved uartfd1.

This commit is contained in:
Martin Preuss
2025-08-25 10:24:48 +02:00
parent 127525e3ec
commit 77d3a201f5
3 changed files with 84 additions and 7 deletions

View File

@@ -12,8 +12,8 @@
.equ UARTFD_SKIPPING_TIME = 2
.equ UARTFD_READ_TIMEOUT = 2
.equ UARTFD_WRITE_TIMEOUT = 2
.equ UARTFD_READ_TIMEOUT = 5
.equ UARTFD_WRITE_TIMEOUT = 5
.equ UARTFD_IFACE_STATUS_BIT_OVERRUN = 0

View File

@@ -55,7 +55,8 @@
cbr r16, (1<<TXC@0) ; clear TXCn interrupt
outr UCSR@0A, r16
inr r16, UCSR@0B
sbr r16, (1<<UDRIE@0) | (1<<TXCIE@0) | (1<<TXEN@0) ; enable TX UDRE and TXC interrupt, enable transceive
; sbr r16, (1<<UDRIE@0) | (1<<TXCIE@0) | (1<<TXEN@0) ; enable TX UDRE and TXC interrupt, enable transceive
sbr r16, (1<<UDRIE@0) | (1<<TXEN@0) ; enable TX UDRE interrupt, enable transceive
outr UCSR@0B, r16
.endmacro
@@ -63,12 +64,33 @@
.macro M_UARTFD_STOP_TX
inr r16, UCSR@0B
cbr r16, (1<<UDRIE@0) | (1<<TXCIE@0) | (1<<TXEN@0) ; disable TX UDRE and TXC1 interrupt, enable transceive
cbr r16, (1<<UDRIE@0) | (1<<TXCIE@0) | (1<<TXEN@0) ; disable TX UDRE and TXC interrupt, disable transceive
outr UCSR@0B, r16
.endmacro
.macro M_UARTFD_STOP_TXIRQS
inr r16, UCSR@0B
cbr r16, (1<<UDRIE@0) | (1<<TXCIE@0) ; disable TX UDRE and TXC interrupt
outr UCSR@0B, r16
.endmacro
.macro M_UARTFD_FLUSH_IN
l_loop_%:
inr r16, UCSR@0A
sbrs r16, RXC@0
rjmp l_end_% ; no data
inr r16, UDR@0 ; r16=received char
rjmp l_loop_%
l_end_%:
.endmacro
; @end
; ---------------------------------------------------------------------------
; @macro M_UARTFD_RXCHAR_ISR
;
@@ -77,7 +99,12 @@
.macro M_UARTFD_RXCHAR_ISR
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
andi r16, (1<<UARTFD_IFACE_STATUS_BIT_SKIPPING)
brne l_resetReadTimer_% ; skipping
breq l_readNext_%
; skipping mode, just skip character
inr r16, UDR@0 ; r16=received char
rjmp l_resetReadTimer_% ; skipping
l_readNext_%:
inr r16, UCSR@0A ; check for errors
andi r16, (1<<FE@0) | (1<<DOR@0) | (1<<UPE@0)
brne l_hwerr_%
@@ -184,7 +211,7 @@ l_end_%:
; @clobbers R16, R17, X
.macro M_UARTFD_TXCHAR_ISR
; disable further TXC1 interrupts
; disable further TXC interrupts
inr r16, UCSR@0B
cbr r16, (1<<TXC@0) ; disable TXC interrupt
outr UCSR@0B, r16

View File

@@ -13,6 +13,7 @@
; this is the tested version!
.dseg
uartFd1_iface: .byte UARTFD_IFACE_SIZE
@@ -35,13 +36,16 @@ UARTFD1_Init:
std Y+UARTFD_IFACE_OFFS_WBUFNUM, r16
clr r16
std Y+UARTFD_IFACE_OFFS_WBUFLEFT, r16
std Y+UARTFD_IFACE_OFFS_RBUFUSED, r16
std Y+UARTFD_IFACE_OFFS_RBUFLEFT, r16
std Y+UARTFD_IFACE_OFFS_STATUS, r16
M_UARTFD_SET_BAUDRATE 0
M_UARTFD_SET_CHARFORMAT 0
; always receive!
rcall uartFd1StartReading
rcall uartFd1StartRx
ret
@@ -213,6 +217,7 @@ uartFd1RunRead:
rcall uartFd1CheckHwErr ; (r16, r24, r25)
rcall uartFd1CheckBadMsgSize ; (r16, r24, r25)
rcall uartFd1CheckSkipping ; (r16, X)
rcall uartFd1SetSkippingSignal ; (r16, r17)
; clear error flags
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
@@ -228,6 +233,30 @@ uartFd1RunRead:
; ---------------------------------------------------------------------------
; @routine uartFd1SetSkippingSignal
;
; @param Y pointer to interface data in SRAM
; @clobbers r16 (r17)
uartFd1SetSkippingSignal:
#ifdef MODULES_LED_SIGNAL
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
andi r16, (1<<UARTFD_IFACE_STATUS_BIT_SKIPPING)
brne uartFd1SetSkippingSignal_skipping
ldi r16, T03_FLAGS_I1_SKIPPING
rcall LedSignal_ClrFlag ; (r17)
rjmp uartFd1SetSkippingSignal_ret
uartFd1SetSkippingSignal_skipping:
ldi r16, T03_FLAGS_I1_SKIPPING
rcall LedSignal_SetFlag ; (r17)
#endif
uartFd1SetSkippingSignal_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine uartFd1CheckSkipping
;
@@ -238,6 +267,7 @@ uartFd1CheckSkipping:
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
andi r16, (1<<UARTFD_IFACE_STATUS_BIT_SKIPPING)
breq uartFd1CheckSkipping_ret
ldd r16, Y+NET_IFACE_OFFS_READTIMER
cpi r16, UARTFD_SKIPPING_TIME
brcs uartFd1CheckSkipping_ret
@@ -248,6 +278,10 @@ uartFd1CheckSkipping:
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
cbr r16, (1<<UARTFD_IFACE_STATUS_BIT_SKIPPING)
std Y+UARTFD_IFACE_OFFS_STATUS, r16
ldi r16, T03_FLAGS_I1_RESTARTED
rcall LedSignal_SetFlag
rcall uartFd1RestartReading ; (R16, X)
out SREG, r15
pop r15
@@ -393,6 +427,19 @@ uartFd1RestartReading:
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
cbr r16, (1<<UARTFD_IFACE_STATUS_BIT_OVERRUN) | (1<<UARTFD_IFACE_STATUS_BIT_HWERR) | (1<<UARTFD_IFACE_STATUS_BIT_BADMSGSIZE)
std Y+UARTFD_IFACE_OFFS_STATUS, r16
push r15
in r15, SREG
cli ; disable irqs
M_UARTFD_FLUSH_IN 1
out SREG, r15 ; probably enable irqs
pop r15
; rcall uartFd1StopRx
; nop
; rcall uartFd1StartRx
ret
; @end
@@ -430,6 +477,8 @@ uartFd1FinishReading_copyLoop:
rcall NET_AddIncomingMsgNum
brcs uartFd1FinishReading_msgSaved
rcall NET_Buffer_ReleaseByNum ; (R16, X)
ldi r16, T03_FLAGS_ADDIN
rcall LedSignal_SetFlag ; (r17)
rjmp uartFd1FinishReading_errorMem
uartFd1FinishReading_msgSaved:
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
@@ -551,7 +600,8 @@ uartFd1StartTx:
; @clobbers R16
uartFd1StopTx:
M_UARTFD_STOP_TX 1
; M_UARTFD_STOP_TX 1
M_UARTFD_STOP_TXIRQS 1
ret
; @end