; *************************************************************************** ; 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 9 ; must correspond to entries in timer table! timerModuleData_end: ; *************************************************************************** ; code .cseg ; number of entries here must be equal to bytes in timerModuleDerivedCounters! timerTable: .db 10, 0, LOW(onEvery10s), HIGH(onEvery10s) ; 10s: overflow after 10*1s (1) .db 3, 0, LOW(onEvery30s), HIGH(onEvery30s) ; 30s: overflow after 3*10s (2) .db 2, 0, LOW(onEvery1m), HIGH(onEvery1m) ; 1m : overflow after 2*30s (3) .db 5, 0, LOW(onEvery5m), HIGH(onEvery5m) ; 5m : overflow after 5*1m (4) .db 3, 0, LOW(onEvery15m), HIGH(onEvery15m) ; 15m: overflow after 3*5m (5) .db 2, 0, LOW(onEvery30m), HIGH(onEvery30m) ; 30m: overflow after 2*15m (6) .db 2, 0, LOW(onEvery1h), HIGH(onEvery1h) ; 1h: overflow after 2*30m (7) .db 12, 0, LOW(onEvery12h), HIGH(onEvery12h) ; 12h: overflow after 12*1h (8) .db 2, 0, LOW(onEvery1d), HIGH(onEvery1d) ; 1d: overflow after 2*12h (9) .db 0, 0 ; --------------------------------------------------------------------------- ; Timer_Init ; ; IN: ; - nothing ; OUT: ; - nothing ; USED: r16, r17, x Timer_Init: ; setup timer for 15.2588 interrupts per second (e.g. every 65.5 ms) ; 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<