From c5915b5583f46802c27149bff7fe71e5be8a2a25 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 28 Oct 2024 23:43:19 +0100 Subject: [PATCH] avr: more work on bitbang module (works now). --- avr/modules/uart_bitbang/bytelevel.asm | 33 +++++++++++++++--------- avr/modules/uart_bitbang/main.asm | 12 +++------ avr/modules/uart_bitbang/packetlevel.asm | 6 ++--- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/avr/modules/uart_bitbang/bytelevel.asm b/avr/modules/uart_bitbang/bytelevel.asm index 208ba66..0e8e69b 100644 --- a/avr/modules/uart_bitbang/bytelevel.asm +++ b/avr/modules/uart_bitbang/bytelevel.asm @@ -79,31 +79,34 @@ l_end: ; @clobbers R16, R21, R22 uartBitbang_SendByte: + cbi COM_DATA_DDR, COM_DATA_PIN ; set DATA port as input + cbi COM_DATA_OUTPUT, COM_DATA_PIN ; disable internal pullup for DATA ldi r21, 8 ; +1 bits left ; send startbit - cbi COM_TXD_DATA, COM_TXD_PIN ; +2 set DATA low - sbi COM_TXD_DDR, COM_TXD_PIN ; +2 set DATA as output + sbi COM_DATA_DDR, COM_DATA_PIN ; +2 set DATA as output + cbi COM_DATA_OUTPUT, COM_DATA_PIN ; +2 set DATA low Utils_WaitNanoSecs COM_BIT_LENGTH, 1, r22 ; wait for one bit duration ; send data bits uartBitbang_SendByte_loop: ; 9 for low bit lsr r16 ; 1+ bit to send -> CARRY brcs uartBitbang_SendByte_setHigh ; HI: +2, LO: +1 uartBitbang_SendByte_setLow: - sbi COM_TXD_DDR, COM_TXD_PIN ; +2 set DATA as output - Utils_WaitNanoSecs COM_BIT_LENGTH, 9, r22 + sbi COM_DATA_DDR, COM_DATA_PIN ; +2 set DATA as output + cbi COM_DATA_OUTPUT, COM_DATA_PIN ; +2 set DATA low + Utils_WaitNanoSecs COM_BIT_LENGTH, 11, r22 rjmp uartBitbang_SendByte_loopEnd ; +2 uartBitbang_SendByte_setHigh: - cbi COM_TXD_DDR, COM_TXD_PIN ; +2 set DATA as input, pullup R makes it ONE + cbi COM_DATA_DDR, COM_DATA_PIN ; +2 set DATA as input, pullup R makes it ONE nop ; +1 (to make pin change available) Utils_WaitNanoSecs COM_HALFBIT_LENGTH, 0, r22 ; wait for half a bit length for line to safely settle - sbis COM_RXD_INPUT, COM_RXD_PIN ; +1 if no skip, +2 if skipped + sbis COM_DATA_INPUT, COM_DATA_PIN ; +1 if no skip, +2 if skipped rjmp uartBitbang_SendByte_error ; +2 if error (collision: we wanted line to be high but it is low) Utils_WaitNanoSecs COM_HALFBIT_LENGTH, 11, r22 uartBitbang_SendByte_loopEnd: dec r21 ; +1 brne uartBitbang_SendByte_loop ; +2, sum per loop: 10 cycles ; send stopbit - cbi COM_TXD_DDR, COM_TXD_PIN ; +2 set DATA as input, pullup R makes it ONE + cbi COM_DATA_DDR, COM_DATA_PIN ; +2 set DATA as input, pullup R makes it ONE Utils_WaitNanoSecs COM_BIT_LENGTH, 0, r22 ; wait for one bit length sec ret @@ -126,8 +129,8 @@ uartBitbang_SendByte_error: ; @clobbers R16, R20, R21, R22 (R17) uartBitbang_ReceiveByte: - cbi COM_RXD_OUTPUT, COM_RXD_PIN ; disable internal pullup for RXD - cbi COM_RXD_DDR, COM_RXD_PIN ; set RXD port as input + cbi COM_DATA_DDR, COM_DATA_PIN ; set DATA port as input + cbi COM_DATA_OUTPUT, COM_DATA_PIN ; disable internal pullup for RXD ldi r21, 8 ; bits left clr r20 ; byte currently receiving ; wait for startbit @@ -137,7 +140,7 @@ uartBitbang_ReceiveByte: uartBitbang_ReceiveByte_loop: Utils_WaitNanoSecs COM_BIT_LENGTH, 8, r22 ; 8 cycles used in the complete loop between waits sec ; +1 - sbic COM_RXD_INPUT, COM_RXD_PIN ; LOW: +2, HIGH: +1 + sbic COM_DATA_INPUT, COM_DATA_PIN ; LOW: +2, HIGH: +1 rjmp uartBitbang_ReceiveByte_shiftIn ; HIGH: +2, rjmp, use set CFLAG clc ; LOW: +1 uartBitbang_ReceiveByte_shiftIn: @@ -164,7 +167,9 @@ uartBitbang_ReceiveByte_error: ; @clobbers R17, R22 uartBitbang_WaitForDataLow: - UART_BB_M_WAIT_FOR_PIN_LOW COM_RXD_INPUT, COM_RXD_PIN + cbi COM_DATA_DDR, COM_DATA_PIN ; set DATA port as input + cbi COM_DATA_OUTPUT, COM_DATA_PIN ; disable internal pullup for TXD + UART_BB_M_WAIT_FOR_PIN_LOW COM_DATA_INPUT, COM_DATA_PIN ret ; @end @@ -178,7 +183,9 @@ uartBitbang_WaitForDataLow: ; @clobbers R17, R22 uartBitbang_WaitForDataHigh: - UART_BB_M_WAIT_FOR_PIN_HIGH COM_RXD_INPUT, COM_RXD_PIN + cbi COM_DATA_DDR, COM_DATA_PIN ; set DATA port as input + cbi COM_DATA_OUTPUT, COM_DATA_PIN ; disable internal pullup for TXD + UART_BB_M_WAIT_FOR_PIN_HIGH COM_DATA_INPUT, COM_DATA_PIN ret ; @end @@ -192,6 +199,8 @@ uartBitbang_WaitForDataHigh: ; @clobbers R17, R22 uartBitbang_WaitForAttnHigh: + cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN port as input + cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable internal pullup for ATTN UART_BB_M_WAIT_FOR_PIN_HIGH COM_ATTN_INPUT, COM_ATTN_PIN ret ; @end diff --git a/avr/modules/uart_bitbang/main.asm b/avr/modules/uart_bitbang/main.asm index 5f613fd..fc766ef 100644 --- a/avr/modules/uart_bitbang/main.asm +++ b/avr/modules/uart_bitbang/main.asm @@ -59,14 +59,11 @@ UART_BitBang_Init: rcall Utils_FillSram ; setup pins and interrupts - cbi COM_TXD_DATA, COM_TXD_PIN ; disable internal pullup for TXD - cbi COM_TXD_DDR, COM_TXD_PIN ; set TXD port as input + cbi COM_DATA_DDR, COM_DATA_PIN ; set DATA port as input + cbi COM_DATA_OUTPUT, COM_DATA_PIN ; disable internal pullup for TXD - cbi COM_RXD_OUTPUT, COM_RXD_PIN ; disable internal pullup for RXD - cbi COM_RXD_DDR, COM_RXD_PIN ; set RXD port as input - - cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable internal pullup for ATTN cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN port as input + cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable internal pullup for ATTN sbi COM_IRQ_ADDR_ATTN, COM_IRQ_BIT_ATTN ; enable pin change irq for ATTN line in r16, GIMSK ; enable pin change irq PCIE0 or PCIE1 @@ -89,8 +86,7 @@ UART_BitBang_Init: ; @clobbers R16, R17, X, Y UART_BitBang_Fini: - cbi COM_TXD_DDR, COM_TXD_PIN ; set TXD port as input - cbi COM_RXD_DDR, COM_RXD_PIN ; set RXD port as input + cbi COM_DATA_DDR, COM_DATA_PIN ; set TXD port as input cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN port as input cbi COM_IRQ_ADDR_ATTN, COM_IRQ_BIT_ATTN ; disable pin change irq for ATTN line diff --git a/avr/modules/uart_bitbang/packetlevel.asm b/avr/modules/uart_bitbang/packetlevel.asm index ea6e5ee..79f2b61 100644 --- a/avr/modules/uart_bitbang/packetlevel.asm +++ b/avr/modules/uart_bitbang/packetlevel.asm @@ -84,7 +84,7 @@ uartBitbang_SendPacket: brcc uartBitbang_SendPacket_lineBusyError rcall uartBitbang_WaitForOneBitLength ; wait for one bit duration (R22) - rcall uartBitbang_WaitForOneBitLength ; wait for one bit duration (R22) +; rcall uartBitbang_WaitForOneBitLength ; wait for one bit duration (R22) adiw xh:xl, COM2_MSG_OFFS_MSGLEN ld r17, X @@ -126,13 +126,13 @@ uartBitbang_SendPacket_lineBusyError: uartBitbang_AcquireBus: ; check for ATTN line: busy? - cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable pullup on ATTN cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN as input + cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable pullup on ATTN nop ; needed to sample current input sbis COM_ATTN_INPUT, COM_ATTN_PIN ; ATTN low? rjmp uartBitbang_AcquireBus_busy ; jump if it is - cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; set ATTN low sbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN as output + cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; set ATTN low sec ret uartBitbang_AcquireBus_busy: