/* * (C) Copyright 2014 Leo C. * * SPDX-License-Identifier: GPL-2.0+ */ #include "common.h" #include #include #include "time.h" #include "timer.h" /* timer interrupt/overflow counter */ /* counts up every ms. */ static volatile uint32_t timestamp; /* * 1000Hz timer interrupt generated by OC3A */ ISR(TIMER3_COMPA_vect) { static int_fast8_t tick_10ms; static int_fast8_t tick_1s; int_fast8_t i, j; extern void disk_timerproc(void); timestamp++; i = tick_10ms + 1; if (i == 10) { Stat |= S_10MS_TO; /* Drive timer procedure of low level disk I/O module */ disk_timerproc(); j = tick_1s - 1; if (j == 0) { system_tick(); j = 100; } tick_1s = j; i = 0; } tick_10ms = i; } /*--------------------------------------------------------------------------*/ #if 0 void timer_setup(void) { /* Clock */ CLKPR = _BV(CLKPCE); CLKPR = 0; /* Timer */ OCR1A = F_CPU / 1000 - 1; // Timer1: 1000Hz interval (OC1A) TCCR1B = 0b00001001; TIMSK1 = _BV(OCIE1A); // Enable TC1.oca interrupt } #endif /*--------------------------------------------------------------------------*/ uint32_t get_timer(uint32_t base) { uint32_t ret; ATOMIC_BLOCK(ATOMIC_FORCEON) { ret = timestamp; } return ret - base; }