root / toolbox / led.c @ 215b2fa6
History | View | Annotate | Download (1.29 KB)
1 | dc472500 | Tom Mullins | #include "led.h" |
---|---|---|---|
2 | #include <avr/io.h> |
||
3 | 1b054655 | Tom Mullins | #include <avr/interrupt.h> |
4 | dc472500 | Tom Mullins | |
5 | #define PRESCALE 64 |
||
6 | #define CLOCK_SEL 3 |
||
7 | |||
8 | /* F_CPU / PRESCALE = OCR * 1000 + ERROR */
|
||
9 | #define OCR (F_CPU / PRESCALE / 1000UL) |
||
10 | #define ERROR (F_CPU / PRESCALE - OCR * 1000UL) |
||
11 | |||
12 | 1085ef77 | Tom Mullins | char blink_count;
|
13 | enum color_t blink_color;
|
||
14 | uint16_t blink_period; |
||
15 | dc472500 | Tom Mullins | |
16 | uint16_t ms; |
||
17 | uint16_t error; |
||
18 | |||
19 | 1085ef77 | Tom Mullins | static void led_color(enum color_t color) { |
20 | switch (color) {
|
||
21 | case OFF:
|
||
22 | led_off(); |
||
23 | break;
|
||
24 | case RED:
|
||
25 | led_red(); |
||
26 | break;
|
||
27 | case YELLOW:
|
||
28 | led_yellow(); |
||
29 | break;
|
||
30 | case GREEN:
|
||
31 | led_green(); |
||
32 | break;
|
||
33 | } |
||
34 | } |
||
35 | |||
36 | dc472500 | Tom Mullins | static void blink() { |
37 | 1085ef77 | Tom Mullins | blink_count--; |
38 | if (blink_count % 2) { |
||
39 | led_color(blink_color); |
||
40 | dc472500 | Tom Mullins | } else {
|
41 | led_off(); |
||
42 | } |
||
43 | } |
||
44 | |||
45 | ISR(TIMER0_COMPA_vect) { |
||
46 | error += ERROR; |
||
47 | if (error >= 1000) { |
||
48 | error -= 1000;
|
||
49 | 215b2fa6 | Tom Mullins | OCR0A = OCR+1;
|
50 | dc472500 | Tom Mullins | } else {
|
51 | 215b2fa6 | Tom Mullins | OCR0A = OCR; |
52 | } |
||
53 | ms++; |
||
54 | if (ms == blink_period) {
|
||
55 | blink(); |
||
56 | if (blink_count == 0) { |
||
57 | TCCR0B = 0;
|
||
58 | dc472500 | Tom Mullins | } |
59 | 215b2fa6 | Tom Mullins | ms = 0;
|
60 | dc472500 | Tom Mullins | } |
61 | } |
||
62 | |||
63 | 1085ef77 | Tom Mullins | void led_blink_start(unsigned int period_ms, char n_times, enum color_t color) { |
64 | |||
65 | dc472500 | Tom Mullins | ms = 0;
|
66 | error = 0;
|
||
67 | 1085ef77 | Tom Mullins | |
68 | blink_count = n_times*2-1; |
||
69 | blink_period = period_ms/2;
|
||
70 | blink_color = color; |
||
71 | led_color(color); |
||
72 | |||
73 | dc472500 | Tom Mullins | OCR0A = OCR; |
74 | 1b054655 | Tom Mullins | TIMSK = _BV(OCIE0A); |
75 | dc472500 | Tom Mullins | TCCR0A = _BV(WGM01); |
76 | TCCR0B = CLOCK_SEL; |
||
77 | 1085ef77 | Tom Mullins | |
78 | dc472500 | Tom Mullins | } |
79 | |||
80 | char led_blink_done() {
|
||
81 | 1085ef77 | Tom Mullins | return blink_count == 0; |
82 | dc472500 | Tom Mullins | } |