Files
aqhomecontrol/avr/modules/com2w2/bytewrite.asm
Martin Preuss db3f88f3af avr: added com2w2 (slightly improved version of com2w).
- 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)
2026-07-05 20:06:00 +02:00

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