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
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

View File

@@ -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

View File

@@ -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: