Forum: Mikrocontroller und Digitale Elektronik Einfaches Interrupt Problem


von Matthias (Gast)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

In Programm 1 mit dem Prescaler 256 kommt der Interrupt alle 65,54 ms 
(bei F_CPU 1 MHz). Das wäre eine Blinkrate von knapp 8 Hz (bei 1 MHz). 
Das sollte man noch als Flackern sehen.

Ein deutliches Blinken (mit der zusätzlichen Zeile) kann ein Anzeichen 
dafür sein, dass der AVR resettet. Das kann vom Watchdog kommen. War 
der mal an? Das kann auch vom Brownout kommen, wieviel Saft zieht 
dein Aufbau, soviel dass die Versorgungsspannung einbricht? Das kann 
auch von einem in der IDE/Makefile falsch eingestellten Target-µC 
kommen.

In Programm 2 mit dem Prescaler 64 kommt der Interrupt alle 16,38 ms 
(bei F_CPU 1 MHz). Das wäre eine Blinkrate von gut 30 Hz (bei 1 Mhz). 
Das würde ich als konstantes Leuchten sehen.

von Matthias (Gast)


Lesenswert?

Danke schonmal fuer die Info ueber die evtl. sehr hohe Blinkfrequenz der 
LED.

Leider leuchtet die LED aber gar nicht. Sie ist vollkommen dunkel. Nur 
wenn ich den Ausgang mit der LED vor der Endlosschleife einmal toggle, 
blinkt sie hinterher - gillt fuer das erste Programm.

Beim zweiten Programm tut sich bei der LED nie etwas.

Eine Brownout Erkennung ist nicht programmiert.

von Jochen R. (josch90)


Lesenswert?

Schreib mal deine Interrupt-Routine vor die main

von Matthias (Gast)


Lesenswert?

Auch wenn die Interrupt-Routine vor main steht leuchtet oder blinkt die 
LED nicht.

von Jochen R. (josch90)


Lesenswert?

Also ich hab das Programm mal mit dem Debugger getestet, und da hat es 
funktioniert, bist du sicher dass deine Schaltung korrekt ist?

von Matthias (Gast)


Lesenswert?

Schaltung ist wohl nicht korrekt. Es gibt nach dem sei() Aufruf immer 
einen Reset und der MC beginnt von vorne.

Wenn ich daher vor dem sei() die LED anschalte, wird sie durch den Reset 
wieder ausgeschaltet und dann scheint sie zu blinken. Das Problem liegt 
also ganz woanders.

Danke fuer die Hilfe und das Debugging.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.