Hallo, ich versuche einen Timer zu schreiben, der alle 100µs eine Variable hochzählt... Leider wird der Interrupt nie ausgeführt. Woran könnte das liegen?
1 | void enableTime2() |
2 | {
|
3 | u8 tmpSREG = SREG; |
4 | cli(); |
5 | |
6 | //normal mode
|
7 | TCCR0 &= ~(1<<WGM01); |
8 | TCCR0 &= ~(1<<WGM00); |
9 | |
10 | //normal port operation for OC0
|
11 | TCCR0 &= ~(1<<COM01); |
12 | TCCR0 &= ~(1<<COM00); |
13 | TCCR0 &= ~(1<<CS02); |
14 | |
15 | //set prescaler to 64
|
16 | TCCR0 |= 1<<CS01; |
17 | TCCR0 |= 1<<CS00; |
18 | |
19 | //preload
|
20 | TCNT0 = 230; |
21 | |
22 | //enable overflow interrupts
|
23 | TIMSK |= 1<<TOIE0; |
24 | |
25 | SREG = tmpSREG; |
26 | |
27 | //enable interrupts
|
28 | SREG |= 1<<7; |
29 | }
|
30 | |
31 | volatile u64 _time; |
32 | |
33 | void setTime(u64 time) |
34 | {
|
35 | u8 tmpSREG = SREG; |
36 | cli(); |
37 | _time = time; |
38 | SREG = tmpSREG; |
39 | }
|
40 | |
41 | u64 getTime() |
42 | {
|
43 | u8 tmpSREG = SREG; |
44 | cli(); |
45 | u64 ret = _time; |
46 | SREG = tmpSREG; |
47 | return ret; |
48 | }
|
49 | |
50 | ISR(TIMER0_OVF_vect) |
51 | {
|
52 | _time += 100; |
53 | TCNT1 = 230; |
54 | toggleOutputPin(led3); |
55 | }
|
56 | |
57 | int main() |
58 | {
|
59 | Pin* led1 = allocPin(2, 0); |
60 | Pin* led2 = allocPin(2, 1); |
61 | led3 = allocPin(2, 3); |
62 | setAsOutputPin(led1); |
63 | setAsOutputPin(led2); |
64 | setOutputPin(led1); |
65 | setOutputPin(led2); |
66 | setTime(0); |
67 | enableTime2(); |
68 | while (1) |
69 | {
|
70 | u64 time = getTime(); |
71 | if (time != 0 && time%1000000 == 0) |
72 | {
|
73 | toggleOutputPin(led1); |
74 | }
|
75 | _delay_ms(50); |
76 | toggleOutputPin(led2); |
77 | }
|
78 | freePin(&led1); |
79 | freePin(&led2); |
80 | freePin(&led3); |
81 | }
|