improved uartfd1.
This commit is contained in:
@@ -12,8 +12,8 @@
|
|||||||
|
|
||||||
|
|
||||||
.equ UARTFD_SKIPPING_TIME = 2
|
.equ UARTFD_SKIPPING_TIME = 2
|
||||||
.equ UARTFD_READ_TIMEOUT = 2
|
.equ UARTFD_READ_TIMEOUT = 5
|
||||||
.equ UARTFD_WRITE_TIMEOUT = 2
|
.equ UARTFD_WRITE_TIMEOUT = 5
|
||||||
|
|
||||||
|
|
||||||
.equ UARTFD_IFACE_STATUS_BIT_OVERRUN = 0
|
.equ UARTFD_IFACE_STATUS_BIT_OVERRUN = 0
|
||||||
|
|||||||
@@ -55,7 +55,8 @@
|
|||||||
cbr r16, (1<<TXC@0) ; clear TXCn interrupt
|
cbr r16, (1<<TXC@0) ; clear TXCn interrupt
|
||||||
outr UCSR@0A, r16
|
outr UCSR@0A, r16
|
||||||
inr r16, UCSR@0B
|
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
|
outr UCSR@0B, r16
|
||||||
.endmacro
|
.endmacro
|
||||||
|
|
||||||
@@ -63,12 +64,33 @@
|
|||||||
|
|
||||||
.macro M_UARTFD_STOP_TX
|
.macro M_UARTFD_STOP_TX
|
||||||
inr r16, UCSR@0B
|
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
|
outr UCSR@0B, r16
|
||||||
.endmacro
|
.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
|
; @macro M_UARTFD_RXCHAR_ISR
|
||||||
;
|
;
|
||||||
@@ -77,7 +99,12 @@
|
|||||||
.macro M_UARTFD_RXCHAR_ISR
|
.macro M_UARTFD_RXCHAR_ISR
|
||||||
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
|
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
|
||||||
andi r16, (1<<UARTFD_IFACE_STATUS_BIT_SKIPPING)
|
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
|
inr r16, UCSR@0A ; check for errors
|
||||||
andi r16, (1<<FE@0) | (1<<DOR@0) | (1<<UPE@0)
|
andi r16, (1<<FE@0) | (1<<DOR@0) | (1<<UPE@0)
|
||||||
brne l_hwerr_%
|
brne l_hwerr_%
|
||||||
@@ -184,7 +211,7 @@ l_end_%:
|
|||||||
; @clobbers R16, R17, X
|
; @clobbers R16, R17, X
|
||||||
|
|
||||||
.macro M_UARTFD_TXCHAR_ISR
|
.macro M_UARTFD_TXCHAR_ISR
|
||||||
; disable further TXC1 interrupts
|
; disable further TXC interrupts
|
||||||
inr r16, UCSR@0B
|
inr r16, UCSR@0B
|
||||||
cbr r16, (1<<TXC@0) ; disable TXC interrupt
|
cbr r16, (1<<TXC@0) ; disable TXC interrupt
|
||||||
outr UCSR@0B, r16
|
outr UCSR@0B, r16
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
; this is the tested version!
|
; this is the tested version!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.dseg
|
.dseg
|
||||||
|
|
||||||
uartFd1_iface: .byte UARTFD_IFACE_SIZE
|
uartFd1_iface: .byte UARTFD_IFACE_SIZE
|
||||||
@@ -35,13 +36,16 @@ UARTFD1_Init:
|
|||||||
std Y+UARTFD_IFACE_OFFS_WBUFNUM, r16
|
std Y+UARTFD_IFACE_OFFS_WBUFNUM, r16
|
||||||
clr r16
|
clr r16
|
||||||
std Y+UARTFD_IFACE_OFFS_WBUFLEFT, r16
|
std Y+UARTFD_IFACE_OFFS_WBUFLEFT, r16
|
||||||
|
|
||||||
std Y+UARTFD_IFACE_OFFS_RBUFUSED, r16
|
std Y+UARTFD_IFACE_OFFS_RBUFUSED, r16
|
||||||
std Y+UARTFD_IFACE_OFFS_RBUFLEFT, r16
|
std Y+UARTFD_IFACE_OFFS_RBUFLEFT, r16
|
||||||
|
std Y+UARTFD_IFACE_OFFS_STATUS, r16
|
||||||
|
|
||||||
M_UARTFD_SET_BAUDRATE 0
|
M_UARTFD_SET_BAUDRATE 0
|
||||||
M_UARTFD_SET_CHARFORMAT 0
|
M_UARTFD_SET_CHARFORMAT 0
|
||||||
|
|
||||||
; always receive!
|
; always receive!
|
||||||
|
rcall uartFd1StartReading
|
||||||
rcall uartFd1StartRx
|
rcall uartFd1StartRx
|
||||||
|
|
||||||
ret
|
ret
|
||||||
@@ -213,6 +217,7 @@ uartFd1RunRead:
|
|||||||
rcall uartFd1CheckHwErr ; (r16, r24, r25)
|
rcall uartFd1CheckHwErr ; (r16, r24, r25)
|
||||||
rcall uartFd1CheckBadMsgSize ; (r16, r24, r25)
|
rcall uartFd1CheckBadMsgSize ; (r16, r24, r25)
|
||||||
rcall uartFd1CheckSkipping ; (r16, X)
|
rcall uartFd1CheckSkipping ; (r16, X)
|
||||||
|
rcall uartFd1SetSkippingSignal ; (r16, r17)
|
||||||
|
|
||||||
; clear error flags
|
; clear error flags
|
||||||
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
|
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
|
; @routine uartFd1CheckSkipping
|
||||||
;
|
;
|
||||||
@@ -238,6 +267,7 @@ uartFd1CheckSkipping:
|
|||||||
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
|
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
|
||||||
andi r16, (1<<UARTFD_IFACE_STATUS_BIT_SKIPPING)
|
andi r16, (1<<UARTFD_IFACE_STATUS_BIT_SKIPPING)
|
||||||
breq uartFd1CheckSkipping_ret
|
breq uartFd1CheckSkipping_ret
|
||||||
|
|
||||||
ldd r16, Y+NET_IFACE_OFFS_READTIMER
|
ldd r16, Y+NET_IFACE_OFFS_READTIMER
|
||||||
cpi r16, UARTFD_SKIPPING_TIME
|
cpi r16, UARTFD_SKIPPING_TIME
|
||||||
brcs uartFd1CheckSkipping_ret
|
brcs uartFd1CheckSkipping_ret
|
||||||
@@ -248,6 +278,10 @@ uartFd1CheckSkipping:
|
|||||||
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
|
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
|
||||||
cbr r16, (1<<UARTFD_IFACE_STATUS_BIT_SKIPPING)
|
cbr r16, (1<<UARTFD_IFACE_STATUS_BIT_SKIPPING)
|
||||||
std Y+UARTFD_IFACE_OFFS_STATUS, r16
|
std Y+UARTFD_IFACE_OFFS_STATUS, r16
|
||||||
|
|
||||||
|
ldi r16, T03_FLAGS_I1_RESTARTED
|
||||||
|
rcall LedSignal_SetFlag
|
||||||
|
|
||||||
rcall uartFd1RestartReading ; (R16, X)
|
rcall uartFd1RestartReading ; (R16, X)
|
||||||
out SREG, r15
|
out SREG, r15
|
||||||
pop r15
|
pop r15
|
||||||
@@ -393,6 +427,19 @@ uartFd1RestartReading:
|
|||||||
ldd r16, Y+UARTFD_IFACE_OFFS_STATUS
|
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)
|
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
|
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
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
@@ -430,6 +477,8 @@ uartFd1FinishReading_copyLoop:
|
|||||||
rcall NET_AddIncomingMsgNum
|
rcall NET_AddIncomingMsgNum
|
||||||
brcs uartFd1FinishReading_msgSaved
|
brcs uartFd1FinishReading_msgSaved
|
||||||
rcall NET_Buffer_ReleaseByNum ; (R16, X)
|
rcall NET_Buffer_ReleaseByNum ; (R16, X)
|
||||||
|
ldi r16, T03_FLAGS_ADDIN
|
||||||
|
rcall LedSignal_SetFlag ; (r17)
|
||||||
rjmp uartFd1FinishReading_errorMem
|
rjmp uartFd1FinishReading_errorMem
|
||||||
uartFd1FinishReading_msgSaved:
|
uartFd1FinishReading_msgSaved:
|
||||||
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
|
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
|
||||||
@@ -551,7 +600,8 @@ uartFd1StartTx:
|
|||||||
; @clobbers R16
|
; @clobbers R16
|
||||||
|
|
||||||
uartFd1StopTx:
|
uartFd1StopTx:
|
||||||
M_UARTFD_STOP_TX 1
|
; M_UARTFD_STOP_TX 1
|
||||||
|
M_UARTFD_STOP_TXIRQS 1
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user