more work on switching to new COM and TIMER stack.
This commit is contained in:
@@ -239,7 +239,7 @@
|
||||
.include "comproto_sysstats.asm"
|
||||
.include "comproto_memstats.asm"
|
||||
.include "comproto_pong.asm"
|
||||
; .include "comproto_values.asm"
|
||||
.include "comproto_values.asm"
|
||||
#endif
|
||||
#endif
|
||||
#ifdef MODULES_TWI_MASTER
|
||||
@@ -266,8 +266,12 @@
|
||||
#ifdef MODULES_LCD
|
||||
sramTimerWriteStats: .byte 2
|
||||
#endif
|
||||
sramTimerEnqueueValues: .byte 2
|
||||
sramTimerSI7021Measure: .byte 2
|
||||
sramTimerEnqueueValues: .byte 2
|
||||
#ifdef MODULES_SI7021
|
||||
sramTimerSI7021Measure: .byte 2
|
||||
sramTimerSI7021SendTemp: .byte 2
|
||||
sramTimerSI7021SendHumidity: .byte 2
|
||||
#endif
|
||||
#ifdef MODULES_LCD
|
||||
sramPeriodicalLcdMark: .byte 2
|
||||
#endif
|
||||
@@ -290,19 +294,22 @@ blinkPattern: .db 2, 50, 0xff, 0xff ; 1 short blink, 2s pause, restart
|
||||
|
||||
|
||||
timerList:
|
||||
; SRAM variable/counter routine flags secs (0=don't start or restart)
|
||||
; SRAM variable/counter routine flags secs (0=don't start or restart)
|
||||
#ifdef MODULES_COM_WITH_ADDR_PROTO
|
||||
.dw cproAddresModeTimer, CPRO_Address_OnTimer, 0, 0 ; (no restart)
|
||||
.dw cproAddresModeTimer, CPRO_Address_OnTimer, 0, 0 ; (no restart)
|
||||
#endif
|
||||
#ifdef MODULES_STATS
|
||||
.dw statsSendTimer, Stats_Timer, TIMER_FLAGS_IF_ADDR, 30 ; every 30s
|
||||
.dw statsSendTimer, Stats_Timer, TIMER_FLAGS_IF_ADDR, 30 ; every 30s
|
||||
#endif
|
||||
#ifdef MODULES_LCD
|
||||
.dw sramPeriodicalLcdMark, periodicalLcdMark, 0, 1 ; every sec
|
||||
.dw sramTimerWriteStats, writeStats, 0, 10
|
||||
.dw sramPeriodicalLcdMark, periodicalLcdMark, 0, 1 ; every sec
|
||||
.dw sramTimerWriteStats, writeStats, 0, 10
|
||||
#endif
|
||||
#ifdef MODULES_SI7021
|
||||
.dw sramTimerSI7021Measure, SI7021_PeriodicMeasurement, 0, 30 ; every 30s
|
||||
.dw sramTimerSI7021SendTemp, sendTemp, TIMER_FLAGS_IF_ADDR, 60 ; every 60s
|
||||
.dw sramTimerSI7021SendHumidity, sendHumidity, TIMER_FLAGS_IF_ADDR, 60 ; every 60s
|
||||
#endif
|
||||
.dw sramTimerSI7021Measure, SI7021_PeriodicMeasurement, 0, 30 ; every 30s
|
||||
; .dw sramTimerEnqueueValues, Main_SendValueMsg, TIMER_FLAGS_IF_ADDR, 60 ; every 1m
|
||||
.dw 0 ; end of list
|
||||
|
||||
|
||||
@@ -332,6 +339,31 @@ writeStats:
|
||||
|
||||
|
||||
|
||||
#ifdef MODULES_SI7021
|
||||
|
||||
sendHumidity:
|
||||
rcall SI7021_SendHumidity
|
||||
brcs sendHumidity_okay
|
||||
; set timer to 1s to retry later
|
||||
ldi xl, LOW(sramTimerSI7021SendHumidity)
|
||||
ldi xh, HIGH(sramTimerSI7021SendHumidity)
|
||||
rjmp Timer_SetValueTo1s
|
||||
sendHumidity_okay:
|
||||
ret
|
||||
|
||||
|
||||
sendTemp:
|
||||
rcall SI7021_SendTemp
|
||||
brcs sendTemp_okay
|
||||
; set timer to 1s to retry later
|
||||
ldi xl, LOW(sramTimerSI7021SendTemp)
|
||||
ldi xh, HIGH(sramTimerSI7021SendTemp)
|
||||
rjmp Timer_SetValueTo1s
|
||||
sendTemp_okay:
|
||||
ret
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Enqueue a VALUE packet.
|
||||
; Write a VALUE packet.
|
||||
;
|
||||
; IN:
|
||||
; - R16: destination address
|
||||
@@ -25,12 +25,12 @@
|
||||
; - R19:R18: value
|
||||
; - R21:R20: denom (e.g. 100, meaning value must be divided by 100)
|
||||
; - R22: value type
|
||||
; - X : buffer to write to
|
||||
; OUT:
|
||||
; - CFLAG: set if okay, clear otherwise
|
||||
; MODIFIED REGS: R6, R7, R8, R9, R10, R11, R12, R16, R17, X, Y (R3, R4, R15, R16, R17, R18, R19, R20, R21)
|
||||
|
||||
CPRO_EnqueueValue:
|
||||
mov r6, r16
|
||||
CPRO_WriteValue:
|
||||
mov r7, r17
|
||||
mov r8, r18
|
||||
mov r9, r19
|
||||
@@ -38,33 +38,20 @@ CPRO_EnqueueValue:
|
||||
mov r11, r21
|
||||
mov r12, r22
|
||||
|
||||
rcall COM_AllocBufferAndGetXY ; (r16, r17, r21)
|
||||
brcc CPRO_EnqueueValue_error
|
||||
|
||||
ldi r17, COM2_PAYLOAD_FLAGS_UID | (6<<COM2_PAYLOAD_FLAGS_SHIFT_NUM)
|
||||
ldi r18, CPRO_CMD_VALUE
|
||||
push xh
|
||||
push xl
|
||||
mov r16, r6
|
||||
ldi r17, CPRO_PAYLOAD_FLAGS_UID | (6<<CPRO_PAYLOAD_FLAGS_SHIFT_NUM)
|
||||
ldi r18, CPRO_CMD_VALUE
|
||||
rcall cproBeginMsgWithVariablePayload ; (R3, R4, R16, R17, R18, R19, R20, R21, X)
|
||||
st X+, r7 ; 6: value id
|
||||
st X+, r12 ; 7: value type
|
||||
st X+, r8 ; 8: low value
|
||||
st X+, r9 ; 9: high value
|
||||
st X+, r10 ; 10: low denom
|
||||
st X+, r11 ; 11: high denom
|
||||
rcall COM2_BeginMsgWithVariablePayload ; R3, R4, R16, R17, R18, R19, R20, R21, X
|
||||
st X+, r7 ; 6: value id
|
||||
st X+, r12 ; 7: value type
|
||||
st X+, r8 ; 8: low value
|
||||
st X+, r9 ; 9: high value
|
||||
st X+, r10 ; 10: low denom
|
||||
st X+, r11 ; 11: high denom
|
||||
pop xl
|
||||
pop xh
|
||||
rcall comCalcAndAddChecksumByte ; (R16, R17, R18, R19, X)
|
||||
|
||||
; mark buffer as enqueued with PRIO "normal" (slightly limited number of retries)
|
||||
ldi r20, COM_BUFFER_PRIO_NORMAL
|
||||
rcall COM_EnqueuePacket ; (R15, R16)
|
||||
brcc CPRO_EnqueueValue_error
|
||||
sec
|
||||
ret
|
||||
CPRO_EnqueueValue_error:
|
||||
clc
|
||||
pop xh
|
||||
rcall com2CalcAndAddChecksumByte ; (R16, R17, R18, R19, X)
|
||||
ret
|
||||
|
||||
|
||||
|
||||
@@ -441,6 +441,54 @@ si7021Muls16x16_32_done:
|
||||
; ret
|
||||
|
||||
|
||||
|
||||
|
||||
SI7021_SendTemp:
|
||||
lds r16, si7021Flags
|
||||
andi r16, SI7021_FLAGS_TEMP_VALID
|
||||
brne SI7021_SendTemp_haveValue
|
||||
sec
|
||||
ret
|
||||
SI7021_SendTemp_haveValue:
|
||||
ldi r16, 0xff ; destination address
|
||||
ldi r17, VALUE_ID_TEMP1 ; value id
|
||||
ldi r22, AQHOME_VALUETYPE_TEMP
|
||||
lds r18, si7021LastTemp ; value
|
||||
lds r19, si7021LastTemp+1
|
||||
ldi r20, 100 ; denominator
|
||||
clr r21
|
||||
rjmp SI7021_SendValue
|
||||
|
||||
|
||||
|
||||
SI7021_SendHumidity:
|
||||
lds r16, si7021Flags
|
||||
andi r16, SI7021_FLAGS_HUM_VALID
|
||||
brne SI7021_SendHumidity_haveValue
|
||||
clc
|
||||
ret
|
||||
SI7021_SendHumidity_haveValue:
|
||||
ldi r16, 0xff ; destination address
|
||||
ldi r17, VALUE_ID_HUM1 ; value id
|
||||
ldi r22, AQHOME_VALUETYPE_HUMIDITY
|
||||
lds r18, si7021LastHumidity ; value
|
||||
lds r19, si7021LastHumidity+1
|
||||
ldi r20, 1 ; denominator
|
||||
clr r21
|
||||
rjmp SI7021_SendValue
|
||||
|
||||
|
||||
SI7021_SendValue:
|
||||
ldi xl, LOW(com2SendBuffer)
|
||||
ldi xh, HIGH(com2SendBuffer)
|
||||
rcall CPRO_WriteValue
|
||||
rjmp COM2_SendPacket
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
SI7021_END:
|
||||
.equ MODULE_SIZE_SI7021 = SI7021_END-SI7021_BEGIN
|
||||
|
||||
|
||||
@@ -148,6 +148,53 @@ Timer_Run_End:
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Set timer value.
|
||||
;
|
||||
; Setting a timer to 0 effectively stops the timer.
|
||||
;
|
||||
; IN:
|
||||
; - r16: new timer value (low)
|
||||
; - r17: new timer value (high)
|
||||
; - X : pointer to timer value in SRAM
|
||||
; OUT:
|
||||
; - nothing
|
||||
; REGS: X
|
||||
|
||||
Timer_SetValue:
|
||||
push r15
|
||||
in r15, SREG
|
||||
cli
|
||||
st X+, r16
|
||||
st X+, r17
|
||||
out SREG, r15
|
||||
pop r15
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Set timer value to 1s.
|
||||
;
|
||||
; IN:
|
||||
; - X : pointer to timer value in SRAM
|
||||
; OUT:
|
||||
; - nothing
|
||||
; REGS: X
|
||||
|
||||
Timer_SetValueTo1s:
|
||||
push r16
|
||||
push r17
|
||||
ldi r16, 1
|
||||
clr r17
|
||||
rcall Timer_SetValue
|
||||
pop r17
|
||||
pop r16
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
timerInitTimers:
|
||||
ldi zl, LOW(timerList*2)
|
||||
ldi zh, HIGH(timerList*2)
|
||||
|
||||
Reference in New Issue
Block a user