diff --git a/avr/modules/com2w/com2wn_init.asm b/avr/modules/com2w/com2wn_init.asm index 897253d..4af9982 100644 --- a/avr/modules/com2w/com2wn_init.asm +++ b/avr/modules/com2w/com2wn_init.asm @@ -100,7 +100,7 @@ com2wnInit: rcall com2wSetMode ; (R17) rcall com2wSetupLines - rcall com2wSetupIrq + rcall com2wnSetupIrq ret ; @end diff --git a/avr/modules/com2w/com2wn_io.asm b/avr/modules/com2w/com2wn_io.asm index 9cf78a5..43e9f8d 100644 --- a/avr/modules/com2w/com2wn_io.asm +++ b/avr/modules/com2w/com2wn_io.asm @@ -34,7 +34,7 @@ com2wSetupLines: .endif ; setup DATA line (as input, disable internal pull-up resistor) - rcall com2wDataSetHigh + rcall com2wnDataSetHigh .ifdef COM_DATA_PUE ldd r16, Y+COM2W_IFACE_OFFS_PINMASK_DATA com r16 @@ -75,12 +75,12 @@ com2wClkSetHigh: ; --------------------------------------------------------------------------- -; @routine com2wClkSetLow +; @routine com2wnClkSetLow ; ; @param Y pointer to interface data in SRAM ; @clobbers none -com2wClkSetLow: +com2wnClkSetLow: push r16 push r17 ldd r16, Y+COM2W_IFACE_OFFS_PINMASK_CLK @@ -102,12 +102,12 @@ com2wClkSetLow: ; --------------------------------------------------------------------------- -; @routine com2wDataSetHigh +; @routine com2wnDataSetHigh ; ; @param Y pointer to interface data in SRAM ; @clobbers none -com2wDataSetHigh: +com2wnDataSetHigh: push r16 push r17 ldd r16, Y+COM2W_IFACE_OFFS_PINMASK_DATA @@ -129,12 +129,12 @@ com2wDataSetHigh: ; --------------------------------------------------------------------------- -; @routine com2wDataSetLow +; @routine com2wnDataSetLow ; ; @param Y pointer to interface data in SRAM ; @clobbers none -com2wDataSetLow: +com2wnDataSetLow: push r16 push r17 ldd r16, Y+COM2W_IFACE_OFFS_PINMASK_DATA diff --git a/avr/modules/com2w/com2wn_irq.asm b/avr/modules/com2w/com2wn_irq.asm index b2e5f9e..3f5fb31 100644 --- a/avr/modules/com2w/com2wn_irq.asm +++ b/avr/modules/com2w/com2wn_irq.asm @@ -23,12 +23,16 @@ com2wnSetupIrq: ; setup pin-change interrupt for CLK rcall com2wnEnableClkIrq - ; enable and clear PCIE0/1 (@TODO put later into general setup) - inr r16, GIMSK ; enable pin change irq PCIE0 or PCIE1 - sbr r16, (1< 1000000 +; begin version for > 1000000 Hz + ldi r20, LOW(clock/1000000) + ldd r22, Y+COM2W_IFACE_OFFS_PINMASK_CLK ; +2 +com2wWaitForClockHighMulti10Us_loop0: + push r20 ; +2 +com2wWaitForClockHighMulti10Us_loop: ; 10 cycles per loop + inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port) + and r16, r22 ; +1 + breq com2wWaitForClockHighMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE + + inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port) + and r16, r22 ; +1 + breq com2wWaitForClockHighMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE + + nop ; +1 + + dec r20 ; +1 + brne com2wWaitForClockHighMulti10Us_loop ; +2 if TRUE, +1 if FALSE + pop r20 ; +2 + dec r20 ; +1 + brne com2wWaitForClockHighMulti10Us_loop0 ; +1 if FALSE, +2 if TRUE + clc ; +1 + ret ; +4 +com2wWaitForClockHighMulti10Us_stateReached: + pop r20 + sec ; +1 + ret ; +4 +; end version for > 1000000 Hz +.elif clock < 1000000 + .error "Clock speed too low" .else - .error "Unhandled clock speed" -.endif - +; begin version for 1000000 Hz ldd r22, Y+COM2W_IFACE_OFFS_PINMASK_CLK ; +2 com2wWaitForClockHighMulti10Us_loop: ; 10 cycles per loop inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port) and r16, r22 ; +1 - brne com2wWaitForClockHighMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE + breq com2wWaitForClockHighMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port) and r16, r22 ; +1 @@ -53,12 +75,14 @@ com2wWaitForClockHighMulti10Us_loop: ; 10 cycles per loop nop ; +1 dec r20 ; +1 - brne com2wWaitForClockHighMulti10Us_loop ; +2 if TRUE, +1 if FALSE + brne com2wWaitForClockHighMulti10Us_loop ; +2 if TRUE, +1 if FALSE clc ; +1 ret ; +4 com2wWaitForClockHighMulti10Us_stateReached: sec ; +1 ret ; +4 +; end version for 1000000 Hz +.endif ; @end @@ -68,22 +92,44 @@ com2wWaitForClockHighMulti10Us_stateReached: ; ; Wait for low CLK ; -; @param R20 multiple of 10us to wait (e.g. "2" for "20" us, max: 32) +; @param R20 multiple of 10us to wait (e.g. "2" for "20" us) ; @return CFLAG set if okay (state reached), cleared on error ; @clobbers: r16, r20, r22 com2wWaitForClockLowMulti10Us: -.if clock == 8000000 - add r20, r20 ; *2 - add r20, r20 ; *4 - add r20, r20 ; *8 -.endif -.elif clock == 1000000 -; nothing to do +.if clock > 1000000 +; begin version for > 1000000 Hz + ldi r20, LOW(clock/1000000) + ldd r22, Y+COM2W_IFACE_OFFS_PINMASK_CLK ; +2 +com2wWaitForClockLowMulti10Us_loop0: + push r20 ; +2 +com2wWaitForClockLowMulti10Us_loop: ; 10 cycles per loop + inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port) + and r16, r22 ; +1 + breq com2wWaitForClockLowMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE + + inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port) + and r16, r22 ; +1 + breq com2wWaitForClockLowMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE + + nop ; +1 + + dec r20 ; +1 + brne com2wWaitForClockLowMulti10Us_loop ; +2 if TRUE, +1 if FALSE + pop r20 ; +2 + dec r20 ; +1 + brne com2wWaitForClockLowMulti10Us_loop0 ; +1 if FALSE, +2 if TRUE + clc ; +1 + ret ; +4 +com2wWaitForClockLowMulti10Us_stateReached: + pop r20 + sec ; +1 + ret ; +4 +; end version for > 1000000 Hz +.elif clock < 1000000 + .error "Clock speed too low" .else - .error "Unhandled clock speed" -.endif - +; begin version for 1000000 Hz ldd r22, Y+COM2W_IFACE_OFFS_PINMASK_CLK ; +2 com2wWaitForClockLowMulti10Us_loop: ; 10 cycles per loop inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port) @@ -103,6 +149,8 @@ com2wWaitForClockLowMulti10Us_loop: ; 10 cycles per loop com2wWaitForClockLowMulti10Us_stateReached: sec ; +1 ret ; +4 +; end version for 1000000 Hz +.endif ; @end diff --git a/avr/modules/flash/io_com2w.asm b/avr/modules/flash/io_com2w.asm index 1a56014..0343e7e 100644 --- a/avr/modules/flash/io_com2w.asm +++ b/avr/modules/flash/io_com2w.asm @@ -92,8 +92,8 @@ ioRawWaitForValidMsg_waitLowLoop1: .endif ldi r18, 5 ioRawWaitForValidMsg_waitLowLoop2: - ldi r20, 20 ; wait for about 100us for clock low - rcall com2wWaitForClockLowMulti5Us ; R20, R22 + ldi r20, 10 ; wait for about 100us for clock low + rcall com2wWaitForClockLowMulti10Us ; R20, R22 brcs ioRawWaitForValidMsg_recvMsg dec r18 brne ioRawWaitForValidMsg_waitLowLoop2 @@ -132,8 +132,8 @@ ioRawWaitForValidMsg_end: ; @clobbers R18, R20 (R16, R17, R20, R22, X) com2wSendMsg: - ldi r20, 11 ; wait for about 55us for clock low - rcall com2wWaitForClockLowMulti5Us + ldi r20, 6 ; wait for about 60us for clock low + rcall com2wWaitForClockLowMulti10Us brcs com2wSendMsg_busy ; CLK got low while waiting, so line is busy rcall com2wClkSetLow ; reserve bus (none) adiw xh:xl, NETMSG_OFFS_MSGLEN @@ -267,21 +267,12 @@ com2wRecvByte: ldi r17, 8 clr r16 com2wRecvByte_loop: - ldi r20, 31 ; wait up to 155us for clock low - rcall com2wWaitForClockLowMulti5Us ; (R20, R22) - brcs com2wRecvByte_waitForClkHigh - ldi r20, 31 ; wait up to 155us for clock low - rcall com2wWaitForClockLowMulti5Us ; (R20, R22) + ldi r20, 30 ; wait up to 300us for clock low + rcall com2wWaitForClockLowMulti10Us ; (R20, R22) brcc com2wRecvByte_end -com2wRecvByte_waitForClkHigh: - ldi r20, 31 ; wait up to 155us for clock high - rcall com2wWaitForClockHighMulti5Us ; (R20, R22) - brcs com2wRecvByte_readBit - ldi r20, 31 ; wait up to 155us for clock high - rcall com2wWaitForClockHighMulti5Us ; (R20, R22) + ldi r20, 30 ; wait up to 300us for clock high + rcall com2wWaitForClockHighMulti10Us ; (R20, R22) brcc com2wRecvByte_end - -com2wRecvByte_readBit: ; handle received bit inr r18, COM_DATA_INPUT andi r18, (1< 1000000 +; begin version for > 1000000 Hz + ldi r20, LOW(clock/1000000) + ldi r22, (1< 1000000 Hz +.elif clock < 1000000 + .error "Clock speed too low" .else - .error "Unhandled clock speed" -.endif +; begin version for 1000000 Hz + ldi r22, (1< 1000000 +; begin version for > 1000000 Hz + ldi r20, LOW(clock/1000000) + ldi r22, (1< 1000000 Hz +.elif clock < 1000000 + .error "Clock speed too low" .else - .error "Unhandled clock speed" -.endif +; begin version for 1000000 Hz + ldi r22, (1<