4008-04-07 Release
[avr_bc100.git] / BaseMegaFirmware / GCC / timebase.c
1 // Copyright (c) 2007, 2008 Martin Thomas - BSD-license\r
2 // 10 ms timebase with \r
3 // 8bit timer-counter #0 in CTC-mode on ATmega644\r
4 \r
5 #include <stdint.h>\r
6 #include <avr/io.h>\r
7 #include <avr/interrupt.h>\r
8 #include "timebase.h"\r
9 \r
10 #include "key_io.h" /* keys callback/debouce */\r
11 \r
12 #define COUNTER_IS_16BIT   0\r
13 #define PRESCALER   1024UL\r
14 \r
15 #if TIMEBASE_DELTAT_MS != 10\r
16 #warning "code prepared for 10ms tick"\r
17 #endif\r
18 \r
19 #define TIMERFREQ   (1000/TIMEBASE_DELTAT_MS) /* Hz */\r
20 #define OCRMATCHVAL ( (F_CPU*10/PRESCALER/TIMERFREQ+5)/10 - 1 )\r
21 \r
22 #if COUNTER_IS_16BIT\r
23  /* 16 bit counter */\r
24 #define OCR_MATCH_MAX 0xfffe\r
25 #else\r
26 /* 8 bit counter */\r
27 #define OCR_MATCH_MAX 0xfe\r
28 #endif /* COUNTER_IS_16BIT */\r
29 #define OCR_MATCH_MIN 0x02\r
30 \r
31 #if ( OCRMATCHVAL > OCR_MATCH_MAX )\r
32 #error "PRESCALER too small or F_CPU too high"\r
33 #endif\r
34 #if ( OCRMATCHVAL < 2 )\r
35 #error "PRESCALER too large or F_CPU too low"\r
36 #endif\r
37 \r
38 volatile uint16_t timebase_tick;\r
39 \r
40 ISR(TIMER0_COMPA_vect)\r
41 {\r
42         timebase_tick++;\r
43 \r
44         key_io_callback();\r
45 }\r
46 \r
47 void timebase_init(void)\r
48 {\r
49         uint8_t sreg;\r
50 \r
51         sreg=SREG;\r
52         cli();\r
53 \r
54         // init Timer 0 Mode 4 - CTC with interrupt on compare-match \r
55         \r
56         TCCR0A = (1<<WGM01);\r
57 #if (PRESCALER == 1024)\r
58         TCCR0B = (1<<CS02) | (1<<CS00);\r
59 #else\r
60 #error "PRESCALER settings not available"\r
61 #endif\r
62         \r
63         OCR0A  = OCRMATCHVAL; // match-value\r
64         \r
65         TCNT0  = 0;           // reset timer-counter\r
66         TIFR0  = (1<<OCF0A);  // clear interrupt\r
67         TIMSK0 = (1<<OCIE0A); // enabled matchA interrupt\r
68 \r
69         timebase_tick = 0;\r
70 \r
71         SREG=sreg;\r
72 }\r
73 \r
74 uint16_t timebase_get_tick(void)\r
75 {\r
76         uint8_t sreg;\r
77         uint16_t res;\r
78 \r
79         sreg = SREG;\r
80         cli();\r
81 \r
82         res = timebase_tick;\r
83 \r
84         SREG=sreg;\r
85 \r
86         return res;\r
87 }\r