www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt mit Timer0


Autor: Markus Geiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

Ich habe den 8Bit Timer0 wie folgt in C initialisiert:

TCCR0 |= (1<<CS00)|(1<<CS02); // CPU-Takt/1024
TIMSK |= (1<<TOIE0);          // Timer0 Inetrrupt enable
sei();                        // Global Interrupt enable

ISR(TIMER0_OVF_vect)           // Interrupt Funktion
{
    //Interrupt code
}

Mein Problem ist jetzt, dass die zugehörige Interrupt Funktion nicht
ausgeführt wird (Compalierung erfolgreich).

Mfg und danke für alle Beiträge!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was verleitet Dich zu der Annahme, dass die ISR nicht ausgeführt
wird? Hast Du das in Hardware oder nur im Simulator getestet?

Autor: Markus Geiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Hardware (LED) zeigt keine Reaktion. Sobald die Interrupt Funktion
aufgerufen wird soll dies eine LED anzeigen (bleibt aber dunkel).

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schick doch bitte mal das komplette Programm und die Information,
welchen µC Du verwendest, wie die LED angeschlossen ist usw. Weiß echt
nicht, warum man das immer wieder sagen muss...

Autor: Markus Geiss (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
RISC AVR-Mikrocontroller (ATmega8) der Firma ATMEL
Test LED wird von Port B PIN 2 angesteuert

Das Programm läuft bis zur ersten "while(flag_1==0)" Schleife und
sitzt dann fest, d.h. die rote LED leuchtet.
Würde ISR ausgeführt werden müsste die gelbe LED nach einiger Zeit
leuchten...

Danke schon mal für Deine Mühen, Programm im Anhang.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist doch schon viel besser. Warum nicht gleich so? Da sieht man doch
sofort den Fehler. Variablen, die sowohl im Hauptprogramm als auch in
Interrupt Handlern verwendet werden, müssen volatile deklariert werden!
Also "volatile unsigned int flag;"

Abgesehen davon ist es eine ziemliche Speicherverschwendung, für eine
Variable, die nur 0 oder 1 sein kann, einen int zu verwenden. Da tuts
auch ein char.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, für den counter reicht natürlich auch ein char.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Variablen 'flag_1' und 'counter' müssen volatile definiert
sein.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rolf:
counter wird nur in der ISR verwendet, muss also nicht volatile sein!

Autor: Markus Geiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank! Klasse Forum!!!

Autor: Markus Geiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab meine Variable flag_1 jetzt volatile gemacht. Dies hat aber mein
Problem, dass die Intterrupt Funktion nicht ausgeführt wird, leider
nicht behoben.
Hab auch schon versucht das Timer overflow flag TOV0 im Register TIFR
manuell zu setzen, was aber auch nicht zur Verzweigung in ISR geführt
hat.
Eigentlich kann es doch nur noch am Funktionsrumpf
"ISR(TIMER0_OVF_vect)" liegen?

Danke für alle Beiträge (Code weiter oben)

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann das jetzt grad leider nicht überprüfen, aber schau mal nach, ob der
Vektor nicht "TIMER0_OVF0_vect" heißt, also mit ner '0' hinter dem
OVF. Ich meine, mich erinnern zu können, dass es da in der libc bei
bestimmten Controllern diese (zugegebenermaßen nicht sonderlich
logische) Bezeichnung gab.

Autor: Markus Geiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein leider nicht, Vektorname ist so richtig: "TIMER0_OVF_vect"

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab dein Prog in mein Testboard geladen, die ISR funktioniert.
Dein Testled solltes du auf PINB3 geben nicht PINB2 dann siehst du es
auch flimmern.
Mit deinem while Konstrukt im main komme ich allerdings nicht zurecht,
das solltest du mal überdenken.

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Testled flimmert allerdings nur so
PORTB^= (1<<PINB3);// Test LED

Autor: Hubert.G (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde die Ampel so machen, geht aber sicher noch schöner.

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.