avr: added new version of tcrt1000.

This commit is contained in:
Martin Preuss
2025-04-29 00:37:31 +02:00
parent fa65bc53b5
commit 06434512c7

View File

@@ -1,5 +1,5 @@
; ***************************************************************************
; copyright : (C) 2023 by Martin Preuss
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
@@ -12,10 +12,8 @@
.equ TCRT1K_INTERVAL = 7
.equ TCRT1K_LIMIT = 170
.equ TCRT1K_STATE_OPEN = 255
.equ TCRT1K_STATE_CLOSED = 0
.equ TCRT1K_FLAGS_REPORT_CHANGE_BIT = 0
.equ TCRT1K_FLAGS_VALID_BIT = 7
.equ TCRT1K_FLAGS_VALUE_BIT = 0
; ***************************************************************************
@@ -25,9 +23,6 @@
tcrt1kDataBegin:
tcrt1kTimer: .byte 1
tcrt1kLastState: .byte 1
tcrt1kLastValue: .byte 1
tcrt1kStateCounter: .byte 1
tcrt1kFlags: .byte 1
tcrt1kDataEnd:
@@ -83,15 +78,19 @@ TCRT1K_Fini:
; ---------------------------------------------------------------------------
; @routine TCRT1K_Every100ms @global
;
TCRT1K_Every100ms:
lds r16, tcrt1kTimer
dec r16
breq TCRT1K_Every100ms_readValue
sts tcrt1kTimer, r16
cpi r16, 2
breq TCRT1K_Every100ms_ledOn
cpi r16, 1
breq TCRT1K_Every100ms_startMeasure
cpi r16, 2
breq TCRT1K_Every100ms_ledOn
ret
TCRT1K_Every100ms_ledOn:
sbi TCRT1K_LED_PORT, TCRT1K_LED_PIN ; LED on
@@ -107,83 +106,38 @@ TCRT1K_Every100ms_readValue:
sts tcrt1kTimer, r16
in r16, ADCH ; read value from ADC
cbi TCRT1K_LED_PORT, TCRT1K_LED_PIN ; LED off
sts tcrt1kLastValue, r16
; convert to 1/0
lds r17, tcrt1kFlags
cbr r17, (1<<TCRT1K_FLAGS_VALUE_BIT)
cpi r16, TCRT1K_LIMIT
ldi r16, TCRT1K_STATE_CLOSED
brcs TCRT1K_Every100ms_checkChange
ldi r16, TCRT1K_STATE_OPEN
TCRT1K_Every100ms_checkChange:
lds r17, tcrt1kLastState
cp r16, r17
brne TCRT1K_Every100ms_stateChanged
lds r16, tcrt1kStateCounter
inc r16
brne TCRT1K_Every100ms_incStateCounter
ret
TCRT1K_Every100ms_incStateCounter:
sts tcrt1kStateCounter, r16
cpi r16, 1 ; report change after one interval
breq TCRT1K_Every100ms_reportChange
cpi r16, 2 ; report change after two intervals
breq TCRT1K_Every100ms_reportChange
cpi r16, 10 ; report change after ten intervals
breq TCRT1K_Every100ms_reportChange
ret
TCRT1K_Every100ms_reportChange:
lds r16, tcrt1kFlags
ori r16, (1<<TCRT1K_FLAGS_REPORT_CHANGE_BIT)
sts tcrt1kFlags, r16
ret
TCRT1K_Every100ms_stateChanged:
sts tcrt1kLastState, r16 ; store new state
clr r16
sts tcrt1kStateCounter, r16
TCRT1K_Every100ms_end:
brcs TCRT1K_Every100ms_valueSet
sbr r17, (1<<TCRT1K_FLAGS_VALUE_BIT)
TCRT1K_Every100ms_valueSet:
sbr r17, (1<<TCRT1K_FLAGS_VALID_BIT)
sts tcrt1kFlags, r17
ret
; @end
TCRT1K_Run:
; ---------------------------------------------------------------------------
; @routine TCRT1K_GetValue @global
;
; @return CFLAG set if there is a value, cleared otherwise (standard api)
; @return R16 value (0=door closed, 1=door open)
; @clobbers R16
TCRT1K_GetValue:
lds r16, tcrt1kFlags
andi r16, (1<<TCRT1K_FLAGS_REPORT_CHANGE_BIT)
breq TCRT1K_Run_retnc
rcall TCRT1K_SendState
brcc TCRT1K_Run_retnc
lds r16, tcrt1kFlags
andi r16, ~(1<<TCRT1K_FLAGS_REPORT_CHANGE_BIT)
sts tcrt1kFlags, r16
sbrs r16, TCRT1K_FLAGS_VALID_BIT
rjmp TCRT1K_GetValue_retNc
andi r16, (1<<TCRT1K_FLAGS_VALUE_BIT)
sec
ret
TCRT1K_Run_retnc:
TCRT1K_GetValue_retNc:
clc
ret
TCRT1K_SendState:
lds r16, com2Address
tst r16
brne TCRT1K_SendState_haveAddress
clc
ret
TCRT1K_SendState_haveAddress:
ldi r16, 0xff ; destination address
ldi r17, VALUE_ID_TCRT1K ; value id
ldi r22, AQHOME_VALUETYPE_DOOR
lds r18, tcrt1kLastState ; value
clr r19
ldi r20, 1 ; denominator
; lds r20, tcrt1kLastValue
clr r21
ldi xl, LOW(com2SendBuffer)
ldi xh, HIGH(com2SendBuffer)
rcall CPRO_WriteReportValue
rjmp COM2_SendPacket
; @end