www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einfaches Interrupt Problem


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
#include <avr/io.h>
#include <avr/interrupt.h>
 
volatile uint8_t flag;
 
int main(void) {
    DDRD = 0xFF;
 
// Timer2 konfigurieren
    TCCR2 = (1 << CS22) | (1 << CS21);
    TIMSK |= (1 << TOIE2);
 
    sei();

    // LED blinkt nur, wenn die folgende Zeile NICHT auskommentiert ist.
    //PORTD ^= (1 << PD0);

    while(1) {
        if (flag == 1) {
            flag = 0;
             PORTD ^= (1 << PD0);
        }
    }
}
 
// Timer2 overflow Interrupt
ISR( TIMER2_OVF_vect ) {
    flag = 1;
}


Meine naechste Frage ist, wieso kann ich nicht Timer 0 wie folgt nutzen?
#include <avr/io.h>
#include <avr/interrupt.h>
 
volatile uint8_t flag;
 
int main(void) {
    DDRD = 0xFF;
 
// Timer0 konfigurieren
    TCCR0 = (1 << CS01) | (1 << CS00);
    TIMSK |= (1 << TOIE0);
 
    sei();

    while(1) {
        if (flag == 1) {
            flag = 0;
             PORTD ^= (1 << PD0);
        }
    }
}
 
// Timer0 overflow Interrupt
ISR( TIMER0_OVF_vect ) {
    flag = 1;
}

Waere dankbar fuer Hilfe.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jochen R. (josch90)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib mal deine Interrupt-Routine vor die main

Autor: Matthias (Gast)
Datum:

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

Autor: Jochen R. (josch90)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.