diff --git a/avr/modules/uart_bitbang2/bytelevel.asm b/avr/modules/uart_bitbang2/bytelevel.asm index 0130e90..5fd5bb3 100644 --- a/avr/modules/uart_bitbang2/bytelevel.asm +++ b/avr/modules/uart_bitbang2/bytelevel.asm @@ -104,33 +104,28 @@ uartBitbang_SendByte_loop: ; 11 for low bit uartBitbang_SendByte_setLow: 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 + rjmp uartBitbang_SendByte_wait ; +2 uartBitbang_SendByte_setHigh: 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_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 - cbi COM_DATA_DDR, COM_DATA_PIN ; +2 set DATA as input, pullup R makes it ONE - Utils_WaitNanoSecs COM_BIT_LENGTH, 8, r22 + cbi COM_DATA_OUTPUT, COM_DATA_PIN ; +2 disable internal pullup for DATA + nop ; +1 + nop ; +1 +uartBitbang_SendByte_wait: + Utils_WaitNanoSecs COM_BIT_LENGTH, 12, r22 uartBitbang_SendByte_loopEnd: dec r21 ; +1 brne uartBitbang_SendByte_loop ; +2, sum per loop: 11 cycles ; send stopbit 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 + cbi COM_DATA_OUTPUT, COM_DATA_PIN ; +2 disable internal pullup for DATA + Utils_WaitNanoSecs COM_BIT_LENGTH, 1, r22 ; wait for one bit length sec ret - -uartBitbang_SendByte_error: - clc - ret ; @end + ; --------------------------------------------------------------------------- ; @routine uartBitbangReceiveByte ; @@ -204,50 +199,6 @@ uartBitbang_WaitForDataHigh: -; --------------------------------------------------------------------------- -; @routine uartBitbang_WaitForAttnHigh -; -; Wait up to 1ms for data pin to become high -; @return CFLAG set if okay, clear otherwise -; @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 - - - - -; --------------------------------------------------------------------------- -; @routine uartBitbang_AcquireBus -; -; Reserve bus if free (otherwise return error) -; Expects interrupts to be disabled. -; -; @return CFLAG set if okay (bus acquired), cleared on error -; @clobbers: none - -uartBitbang_AcquireBus: - ; check for ATTN line: busy? - 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 - 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: - clc - ret -; @end - - - ; --------------------------------------------------------------------------- ; @routine uartBitbang_WaitForOneBitLength ; diff --git a/avr/modules/uart_bitbang2/iface.asm b/avr/modules/uart_bitbang2/iface.asm index dafbb72..64ea27a 100644 --- a/avr/modules/uart_bitbang2/iface.asm +++ b/avr/modules/uart_bitbang2/iface.asm @@ -49,6 +49,12 @@ UART_BitBang_Init: rcall NET_Interface_Init ; (R16, R17, X) ; init hw + cbi COM_DATA_DDR, COM_DATA_PIN ; set TXD port as input + cbi COM_DATA_OUTPUT, COM_DATA_PIN ; disable internal pullup for DATA + cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN port as input + cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable internal pullup for ATTN + + ; enable IRQ 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 ori r16, (1<