Hallo Jungs, ich habe eine kleine Routine in C (AVR-GCC) ATmega16
geschrieben.
Leider funktioniert meine Interrupt-Routine nicht und ich weiß nicht
warum. Vielleicht habe ich einen Gedankenfehler. Schaut doch mal bitte
über den Code:
1 | #include <avr\io.h>
|
2 | #include <avr\interrupt.h>
|
3 | #include <stdint.h>
|
4 |
|
5 | uint8_t zaehler = 0;
|
6 |
|
7 | ISR(TIMER0_COMP_vect) //Output Compare Interrupt
|
8 | {
|
9 | zaehler++;
|
10 | }
|
11 |
|
12 | void timer_init(void)
|
13 | {
|
14 | TCCR0 = (1<<WGM01) | (1<<CS02); // Prescaler auf 256 --> 1MHz / 256 = 4 kHz
|
15 |
|
16 | TIMSK = (1<<OCIE0); // Output Compare Interrupt Enable -
|
17 | // -> Interrupt bei Compare mit OCR0 einschalten
|
18 | OCR0 = 212; // Zeitpunkt für Interrupt
|
19 | TCNT0 = 0x00; // Zählerregister auf 0 setzen
|
20 | }
|
21 |
|
22 | int main (void)
|
23 | {
|
24 |
|
25 | uint8_t ergebnis = 0;
|
26 |
|
27 | DDRB = 0xff; // Port B ist Output
|
28 | PORTB = 0xff; //LED's ausschalten (invers am Board)
|
29 |
|
30 | timer_init();
|
31 |
|
32 | while(1) // Programmschleife
|
33 | {
|
34 | sei();
|
35 | ergebnis = zaehler % 8; // modulo
|
36 | PORTB = ~(1<<ergebnis);
|
37 | }
|
38 | }
|