avr: more work on bitbang module (works now).

This commit is contained in:
Martin Preuss
2024-10-28 23:43:19 +01:00
parent 2626c4365c
commit c5915b5583
3 changed files with 28 additions and 23 deletions

View File

@@ -79,31 +79,34 @@ l_end:
; @clobbers R16, R21, R22 ; @clobbers R16, R21, R22
uartBitbang_SendByte: 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 ldi r21, 8 ; +1 bits left
; send startbit ; send startbit
cbi COM_TXD_DATA, COM_TXD_PIN ; +2 set DATA low sbi COM_DATA_DDR, COM_DATA_PIN ; +2 set DATA as output
sbi COM_TXD_DDR, COM_TXD_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 Utils_WaitNanoSecs COM_BIT_LENGTH, 1, r22 ; wait for one bit duration
; send data bits ; send data bits
uartBitbang_SendByte_loop: ; 9 for low bit uartBitbang_SendByte_loop: ; 9 for low bit
lsr r16 ; 1+ bit to send -> CARRY lsr r16 ; 1+ bit to send -> CARRY
brcs uartBitbang_SendByte_setHigh ; HI: +2, LO: +1 brcs uartBitbang_SendByte_setHigh ; HI: +2, LO: +1
uartBitbang_SendByte_setLow: uartBitbang_SendByte_setLow:
sbi COM_TXD_DDR, COM_TXD_PIN ; +2 set DATA as output sbi COM_DATA_DDR, COM_DATA_PIN ; +2 set DATA as output
Utils_WaitNanoSecs COM_BIT_LENGTH, 9, r22 cbi COM_DATA_OUTPUT, COM_DATA_PIN ; +2 set DATA low
Utils_WaitNanoSecs COM_BIT_LENGTH, 11, r22
rjmp uartBitbang_SendByte_loopEnd ; +2 rjmp uartBitbang_SendByte_loopEnd ; +2
uartBitbang_SendByte_setHigh: 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) 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 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) 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 Utils_WaitNanoSecs COM_HALFBIT_LENGTH, 11, r22
uartBitbang_SendByte_loopEnd: uartBitbang_SendByte_loopEnd:
dec r21 ; +1 dec r21 ; +1
brne uartBitbang_SendByte_loop ; +2, sum per loop: 10 cycles brne uartBitbang_SendByte_loop ; +2, sum per loop: 10 cycles
; send stopbit ; 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 Utils_WaitNanoSecs COM_BIT_LENGTH, 0, r22 ; wait for one bit length
sec sec
ret ret
@@ -126,8 +129,8 @@ uartBitbang_SendByte_error:
; @clobbers R16, R20, R21, R22 (R17) ; @clobbers R16, R20, R21, R22 (R17)
uartBitbang_ReceiveByte: uartBitbang_ReceiveByte:
cbi COM_RXD_OUTPUT, COM_RXD_PIN ; disable internal pullup for RXD cbi COM_DATA_DDR, COM_DATA_PIN ; set DATA port as input
cbi COM_RXD_DDR, COM_RXD_PIN ; set RXD port as input cbi COM_DATA_OUTPUT, COM_DATA_PIN ; disable internal pullup for RXD
ldi r21, 8 ; bits left ldi r21, 8 ; bits left
clr r20 ; byte currently receiving clr r20 ; byte currently receiving
; wait for startbit ; wait for startbit
@@ -137,7 +140,7 @@ uartBitbang_ReceiveByte:
uartBitbang_ReceiveByte_loop: uartBitbang_ReceiveByte_loop:
Utils_WaitNanoSecs COM_BIT_LENGTH, 8, r22 ; 8 cycles used in the complete loop between waits Utils_WaitNanoSecs COM_BIT_LENGTH, 8, r22 ; 8 cycles used in the complete loop between waits
sec ; +1 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 rjmp uartBitbang_ReceiveByte_shiftIn ; HIGH: +2, rjmp, use set CFLAG
clc ; LOW: +1 clc ; LOW: +1
uartBitbang_ReceiveByte_shiftIn: uartBitbang_ReceiveByte_shiftIn:
@@ -164,7 +167,9 @@ uartBitbang_ReceiveByte_error:
; @clobbers R17, R22 ; @clobbers R17, R22
uartBitbang_WaitForDataLow: 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 ret
; @end ; @end
@@ -178,7 +183,9 @@ uartBitbang_WaitForDataLow:
; @clobbers R17, R22 ; @clobbers R17, R22
uartBitbang_WaitForDataHigh: 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 ret
; @end ; @end
@@ -192,6 +199,8 @@ uartBitbang_WaitForDataHigh:
; @clobbers R17, R22 ; @clobbers R17, R22
uartBitbang_WaitForAttnHigh: 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 UART_BB_M_WAIT_FOR_PIN_HIGH COM_ATTN_INPUT, COM_ATTN_PIN
ret ret
; @end ; @end

View File

@@ -59,14 +59,11 @@ UART_BitBang_Init:
rcall Utils_FillSram rcall Utils_FillSram
; setup pins and interrupts ; setup pins and interrupts
cbi COM_TXD_DATA, COM_TXD_PIN ; disable internal pullup for TXD cbi COM_DATA_DDR, COM_DATA_PIN ; set DATA port as input
cbi COM_TXD_DDR, COM_TXD_PIN ; set TXD 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_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 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 in r16, GIMSK ; enable pin change irq PCIE0 or PCIE1
@@ -89,8 +86,7 @@ UART_BitBang_Init:
; @clobbers R16, R17, X, Y ; @clobbers R16, R17, X, Y
UART_BitBang_Fini: UART_BitBang_Fini:
cbi COM_TXD_DDR, COM_TXD_PIN ; set TXD port as input cbi COM_DATA_DDR, COM_DATA_PIN ; set TXD port as input
cbi COM_RXD_DDR, COM_RXD_PIN ; set RXD port as input
cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN 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 cbi COM_IRQ_ADDR_ATTN, COM_IRQ_BIT_ATTN ; disable pin change irq for ATTN line

View File

@@ -84,7 +84,7 @@ uartBitbang_SendPacket:
brcc uartBitbang_SendPacket_lineBusyError 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) ; rcall uartBitbang_WaitForOneBitLength ; wait for one bit duration (R22)
adiw xh:xl, COM2_MSG_OFFS_MSGLEN adiw xh:xl, COM2_MSG_OFFS_MSGLEN
ld r17, X ld r17, X
@@ -126,13 +126,13 @@ uartBitbang_SendPacket_lineBusyError:
uartBitbang_AcquireBus: uartBitbang_AcquireBus:
; check for ATTN line: busy? ; 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_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 nop ; needed to sample current input
sbis COM_ATTN_INPUT, COM_ATTN_PIN ; ATTN low? sbis COM_ATTN_INPUT, COM_ATTN_PIN ; ATTN low?
rjmp uartBitbang_AcquireBus_busy ; jump if it is 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 sbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN as output
cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; set ATTN low
sec sec
ret ret
uartBitbang_AcquireBus_busy: uartBitbang_AcquireBus_busy: