; *************************************************************************** ; copyright : (C) 2023 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. * ; *************************************************************************** ; *************************************************************************** ; defs .equ TIMER_FLAGS_100MS = 1 .equ TIMER_FLAGS_1S = 2 ; *************************************************************************** ; data .dseg timerModuleData: timerModuleTickCounter: .byte 1 timerModuleFlags: .byte 1 timerModuleCounterSecs: .byte 4 timerModuleDerivedCounters: .byte 10 ; size must be number of entries in timer table timerModuleData_end: ; *************************************************************************** ; code .cseg TIMER_BEGIN: ; number of entries here must be equal to bytes in timerModuleDerivedCounters! timerTable: .db 5, 0, LOW(onEvery5s), HIGH(onEvery5s) ; 5s: overflow after 5*1s (1) .db 2, 0, LOW(onEvery10s), HIGH(onEvery10s) ; 10s: overflow after 2*5s (2) .db 3, 0, LOW(onEvery30s), HIGH(onEvery30s) ; 30s: overflow after 3*10s (3) .db 2, 0, LOW(onEvery1m), HIGH(onEvery1m) ; 1m: overflow after 2*30s (4) .db 5, 0, LOW(onEvery5m), HIGH(onEvery5m) ; 5m: overflow after 5*1m (5) .db 3, 0, LOW(onEvery15m), HIGH(onEvery15m) ; 15m: overflow after 3*5m (6) .db 2, 0, LOW(onEvery30m), HIGH(onEvery30m) ; 30m: overflow after 2*15m (7) .db 2, 0, LOW(onEvery1h), HIGH(onEvery1h) ; 1h: overflow after 2*30m (8) .db 12, 0, LOW(onEvery12h), HIGH(onEvery12h) ; 12h: overflow after 12*1h (9) .db 2, 0, LOW(onEvery1d), HIGH(onEvery1d) ; 1d: overflow after 2*12h (10) .db 0, 0 ; --------------------------------------------------------------------------- ; Timer_Init ; ; IN: ; - nothing ; OUT: ; - nothing ; USED: r16, r17, x Timer_Init: ; setup timer for IRQ every 100ms ; reset data in SDRAM ldi xh, HIGH(timerModuleData) ldi xl, LOW(timerModuleData) ldi r16, 0 ldi r17, (timerModuleData_end-timerModuleData) rcall Utils_FillSram ; CTC mode (WGM2:0=2, OCR0A=value, OCF0A Flag =1, -> IRQ_OC0A ; CMP-A interrupt about every 100ms ldi r16, (1<