diff --git a/avr/modules/uart_fd/uartfd0.asm b/avr/modules/uart_fd/uartfd0.asm index b10ab20..d4834cf 100644 --- a/avr/modules/uart_fd/uartfd0.asm +++ b/avr/modules/uart_fd/uartfd0.asm @@ -12,9 +12,10 @@ + .dseg -uartFd0_iface: .bytes UARTFD_IFACE_SIZE +uartFd0_iface: .byte UARTFD_IFACE_SIZE @@ -34,13 +35,16 @@ UARTFD0_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 uartFd0StartReading rcall uartFd0StartRx ret @@ -73,11 +77,20 @@ UARTFD0_Run: ldi yh, HIGH(uartFd0_iface) clr r22 - rcall uartFd0RunRead ; (r16, r17, r18, r19, r20, r24, r25, X, Z) - sbci r22, 0 + push r15 + in r15, SREG + + cli ; disable irqs + rcall uartFd0RunRead ; (r16, r17, r18, r19, r20, r24, r25, X, Z) + sbci r22, 0 + out SREG, r15 ; probably enable irqs + + cli ; disable irqs + rcall uartFd0RunWrite ; (r16, r17, r18, r19, r24, r25, X) + sbci r22, 0 - rcall uartFd0RunWrite ; (r16, r17, r18, r19, r24, r25, X) - sbci r22, 0 + out SREG, r15 ; probably enable irqs + pop r15 tst r22 clc @@ -202,7 +215,8 @@ uartFd0RunRead: rcall uartFd0CheckOverrun ; (r16, r24, r25) rcall uartFd0CheckHwErr ; (r16, r24, r25) rcall uartFd0CheckBadMsgSize ; (r16, r24, r25) - rcall uartFd0CheckSkipping ; (R16, X) + rcall uartFd0CheckSkipping ; (r16, X) + rcall uartFd0SetSkippingSignal ; (r16, r17) ; clear error flags ldd r16, Y+UARTFD_IFACE_OFFS_STATUS @@ -218,17 +232,41 @@ uartFd0RunRead: +; --------------------------------------------------------------------------- +; @routine uartFd0SetSkippingSignal +; +; @param Y pointer to interface data in SRAM +; @clobbers r16 (r17) + +uartFd0SetSkippingSignal: +#ifdef MODULES_LED_SIGNAL + ldd r16, Y+UARTFD_IFACE_OFFS_STATUS + andi r16, (1<