summaryrefslogtreecommitdiff
path: root/timebase.c
blob: 3b97e2b304cd099b4d39a4b9a4212165d3841632 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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;
}