Hallo,
bekomme einen Overflow-Interrupt bei einem atmega8 nicht zum laufen.
Habe das Problem mal im folgenden Code runtergebrochen. Meine erste
Frage ist: wieso blinkt meine LED an PD0 nur, wenn ich vor der
Endlosschleife den Port einmal toggle?
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | volatile uint8_t flag;
|
5 |
|
6 | int main(void) {
|
7 | DDRD = 0xFF;
|
8 |
|
9 | // Timer2 konfigurieren
|
10 | TCCR2 = (1 << CS22) | (1 << CS21);
|
11 | TIMSK |= (1 << TOIE2);
|
12 |
|
13 | sei();
|
14 |
|
15 | // LED blinkt nur, wenn die folgende Zeile NICHT auskommentiert ist.
|
16 | //PORTD ^= (1 << PD0);
|
17 |
|
18 | while(1) {
|
19 | if (flag == 1) {
|
20 | flag = 0;
|
21 | PORTD ^= (1 << PD0);
|
22 | }
|
23 | }
|
24 | }
|
25 |
|
26 | // Timer2 overflow Interrupt
|
27 | ISR( TIMER2_OVF_vect ) {
|
28 | flag = 1;
|
29 | }
|
Meine naechste Frage ist, wieso kann ich nicht Timer 0 wie folgt nutzen?
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | volatile uint8_t flag;
|
5 |
|
6 | int main(void) {
|
7 | DDRD = 0xFF;
|
8 |
|
9 | // Timer0 konfigurieren
|
10 | TCCR0 = (1 << CS01) | (1 << CS00);
|
11 | TIMSK |= (1 << TOIE0);
|
12 |
|
13 | sei();
|
14 |
|
15 | while(1) {
|
16 | if (flag == 1) {
|
17 | flag = 0;
|
18 | PORTD ^= (1 << PD0);
|
19 | }
|
20 | }
|
21 | }
|
22 |
|
23 | // Timer0 overflow Interrupt
|
24 | ISR( TIMER0_OVF_vect ) {
|
25 | flag = 1;
|
26 | }
|
Waere dankbar fuer Hilfe.