Einfaches Interrupt Problem

Gast #1634973
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.
Persönliche Seite #1635012
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.
Gast #1635031
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.
Gast #1635241
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren