summaryrefslogtreecommitdiff
path: root/timebase.c
diff options
context:
space:
mode:
Diffstat (limited to 'timebase.c')
-rw-r--r--timebase.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/timebase.c b/timebase.c
new file mode 100644
index 0000000..3b97e2b
--- /dev/null
+++ b/timebase.c
@@ -0,0 +1,61 @@
+#include "main.h"
+#include "timebase.h"
+
+ // at 12MHz:
+#define T0COUNT (XTAL / 1024 / 64) // 183
+#define T0SECERR (XTAL - 1024L * 64 * T0COUNT) // 6912
+#define T0COUNTSEC (T0COUNT + T0SECERR / 1024) // 189
+#define T0MINERR (XTAL - 1024 * (63 * T0COUNT + T0COUNTSEC)) // 768
+#define T0COUNTMIN (T0COUNTSEC + (T0MINERR * 60 + 512) / 1024) // 234
+
+// 234 = 12000000 Hz
+// 233 = 12000017 Hz = 4s/month
+
+
+u8 timeflags;
+u8 dcf77_period;
+u8 dcf77_pulse;
+u8 ct_64Hz; // 64 Hz counter (4sec)
+
+
+void timebase_init( void )
+{
+ TCCR0 = 1<<CS02^1<<CS00; // prescale = 1024
+ TIMSK = 1<<TOIE0; // interrupt enable
+}
+
+
+SIGNAL (SIG_OVERFLOW0)
+{
+ static u8 dcf77_time, old_dcf77;
+ // DCF77 receive
+ if( dcf77_time != 0xFF ) // stop on 0xFF
+ dcf77_time++; // count ticks
+ if( (DCF77_PIN ^ old_dcf77) & 1<<DCF77 ){ // pin changed ?
+ old_dcf77 ^= 0xFF; // change old flag
+ if( old_dcf77 & 1<<DCF77 ){
+ dcf77_period = dcf77_time; // store ticks of period
+ dcf77_time = 0; // count next period
+ }else{
+ dcf77_pulse = dcf77_time; // store ticks of pulse
+ }
+ }
+ // time base 1 second
+ TCNT0 = (u16)(256 - T0COUNT); // reload per tick: -183
+ if( ++ct_64Hz & 0x3F ){ // 64 ticks = one second
+ timeflags = 1<<ONE_TICK; // one tick over
+ return;
+ }
+ TCNT0 = (u16)(256 - T0COUNTSEC); // reload per second: -189
+ if( timeflags & (1<< ONE_MINUTE ))
+ TCNT0 = (u16)(256 - T0COUNTMIN); // reload per minute: -234
+ timeflags = 1<<ONE_SECOND^1<<ONE_TICK; // one tick, one second over
+}
+
+
+void sync_sec( void ) // synchronize by DCF77
+{
+ TCNT0 = (u16)(256 - T0COUNTMIN);
+ ct_64Hz = 0;
+ timeflags = 0;
+}