avr: more work on bitbang module (works now).
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user