/*
+ * (C) Copyright 2014 Leo C. <erbl259-lmu@yahoo.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0
*/
-
-#include "common.h"
-
-//#include <avr/power.h>
-//#include <avr/pgmspace.h>
+#include "timer.h"
#include <avr/interrupt.h>
#include <util/atomic.h>
-
-//#include <stdio.h>
-
-
-#include "timer.h"
+#include "time.h"
/* timer interrupt/overflow counter */
-static volatile uint32_t timestamp;
-
+/* counts up every ms. */
+static volatile
+uint32_t timestamp;
-/*---------------------------------------------------------*/
-/* 1000Hz timer interrupt generated by OC1A */
-/*---------------------------------------------------------*/
-
-ISR(TIMER1_COMPA_vect)
+/*
+ * 1000Hz timer interrupt generated by OC4A
+ */
+ISR(TIMER4_COMPA_vect)
{
static int_fast8_t tick_10ms;
- int_fast8_t i;
+ static int_fast8_t tick_1s;
+ int_fast8_t i, j;
+
+ extern void disk_timerproc(void);
+ OCR4A += F_CPU / 1000; /* 1000Hz interval */
timestamp++;
i = tick_10ms + 1;
if (i == 10) {
- i = 0;
Stat |= S_10MS_TO;
-
+
/* Drive timer procedure of low level disk I/O module */
- //disk_timerproc();
+ disk_timerproc();
+
+ j = tick_1s - 1;
+ if (j == 0) {
+ system_tick();
+ j = 100;
+ }
+ tick_1s = j;
+ i = 0;
}
tick_10ms = i;
-
-}
-
-
-
-/*--------------------------------------------------------------------------*/
-
-#if 0
-
-void do_10ms(void)
-{
- if (to_counter)
- to_counter--;
}
-#endif
/*--------------------------------------------------------------------------*/
-
-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
-}
-
-
uint32_t get_timer(uint32_t base)
{
uint32_t ret;
-
ATOMIC_BLOCK(ATOMIC_FORCEON)
{
ret = timestamp;
}
return ret - base;
}
-