- move IRQ control to main code (only the main code knows exactly which combination of pins is used for com2) - split one big module into multiple smaller files (easier to maintain)
77 lines
2.2 KiB
NASM
77 lines
2.2 KiB
NASM
; ***************************************************************************
|
|
; copyright : (C) 2026 by Martin Preuss
|
|
; email : martin@libchipcard.de
|
|
;
|
|
; ***************************************************************************
|
|
; * This file is part of the project "AqHome". *
|
|
; * Please see toplevel file COPYING of that project for license details. *
|
|
; ***************************************************************************
|
|
|
|
#ifndef AVR_MODULES_COM2W2_BYTEWRITE_H
|
|
#define AVR_MODULES_COM2W2_BYTEWRITE_H
|
|
|
|
|
|
.cseg
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine com2w2SendBytes
|
|
;
|
|
; @param R18 number of bytes to send
|
|
; @param X pointer to bytes to send
|
|
; @param Y pointer to interface data in SRAM
|
|
; @clobbers: r16, r18, X (r17, r22)
|
|
|
|
com2w2SendBytes:
|
|
com2w2SendBytes_loop:
|
|
rcall com2w2ClkSetLow ; (none)
|
|
rcall com2w2WaitTime1 ; longer wait period (R22)
|
|
ld r16, X+
|
|
rcall com2w2SendByte ; (R16, R17, R22)
|
|
dec r18
|
|
brne com2w2SendBytes_loop
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine com2w2SendByte
|
|
;
|
|
; @param R16 byte to send
|
|
; @clobbers: r16, r17 (r22)
|
|
|
|
com2w2SendByte:
|
|
push r15
|
|
in r15, SREG
|
|
ldi r17, 8
|
|
com2w2SendByte_loop:
|
|
M_COM2WCLKSETLOW
|
|
out SREG, r15 ; probably enable irqs
|
|
rcall com2w2WaitTime1 ; wait for longer time (R22)
|
|
lsr r16
|
|
brcs com2w2SendByte_send1
|
|
M_COM2WDATASETLOW
|
|
rjmp com2w2SendByte_sent
|
|
com2w2SendByte_send1:
|
|
M_COM2WDATASETHIGH
|
|
com2w2SendByte_sent:
|
|
Utils_WaitNanoSecs 5000, 0, r22 ; wait for very short time to ensure data is stable when clock rises
|
|
cli ; ensure time period by disabling irqs
|
|
M_COM2WCLKSETHIGH
|
|
rcall com2w2WaitTime2 ; wait for shorter time (R22)
|
|
dec r17
|
|
brne com2w2SendByte_loop
|
|
out SREG, r15
|
|
pop r15
|
|
rcall com2w2WaitTime2 ; wait for shorter time (R22)
|
|
M_COM2WDATASETHIGH ; ensure data line is high
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
#endif
|
|
|