Forum: Mikrocontroller und Digitale Elektronik Interrupt mit Timer0


von Markus Geiss (Gast)


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!

von johnny.m (Gast)


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?

von Markus Geiss (Gast)


Lesenswert?

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

von johnny.m (Gast)


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...

von Markus Geiss (Gast)


Angehängte Dateien:

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.

von johnny.m (Gast)


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.

von johnny.m (Gast)


Lesenswert?

Ach ja, für den counter reicht natürlich auch ein char.

von Rolf Magnus (Gast)


Lesenswert?

Deine Variablen 'flag_1' und 'counter' müssen volatile definiert
sein.

von johnny.m (Gast)


Lesenswert?

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

von Markus Geiss (Gast)


Lesenswert?

Vielen Dank! Klasse Forum!!!

von Markus Geiss (Gast)


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)

von johnny.m (Gast)


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.

von Markus Geiss (Gast)


Lesenswert?

Nein leider nicht, Vektorname ist so richtig: "TIMER0_OVF_vect"

von Hubert.G (Gast)


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.

von Hubert.G (Gast)


Lesenswert?

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

von Hubert.G (Gast)


Angehängte Dateien:

Lesenswert?

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

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.