Forum: Mikrocontroller und Digitale Elektronik Noch mal Interrupt (ATMEGA64 mit WinAVR)


von bitbo (Gast)


Lesenswert?

Hallo !

Ja, ich habe gesucht !

Ich habe ein Problem mit gleichzeitigen Interrupts.

1. Habe einen INT4 auf einer positiven Flanke
2. Habe einen ICP3 auf einer positiven Flanke (kein Prescaler, 16 MHz 
Takt)
3. Habe einen T3_OVF bei Überlauf von T3

(Alle Interrupt-Routinen sind nicht unterbrechbar (ISR_BLOCK) und sehr 
kurz.


Während ich im INT4 bin, kommt ein ICP3 und ein T3_OVF nahezu 
gleichzeitig.
(Voriger Zählerstand=65430, aktueller Zählerstand=53, Zähler wird nicht 
zurückgesetzt)
Wenn ich im INT4 fertig bin, wird die ICP3 Routine vor der T3_OVF 
gerufen, da diese in der "Vector-Tabelle" zuerst kommt. Jetzt ist mein 
Timer-Wert schon übergelaufen, aber ich "weiss" es nicht, da die T3_OVF 
noch nicht dran war. Da kann man (wahrscheinlich) auch nix machen.

Ich möchte nur wissen, ob und wie ich in "C" die noch anstehenden 
Interrupts auslesen kann. Gibt es da eine Möglichkeit ?

Danke
bitbo

von Marc D. (cosinus)


Lesenswert?

Schau einfach die Interrupt Flags fuer die betroffenen Interrupts an.

Fuer z.B. Timer3 overflow:

das TOV3 Bit im ETIFR Register

Gruss
Marc

von bitbo (Gast)


Lesenswert?

OK, Danke für den Hinweis, aber das habe ich auch schon gemacht.
Merkwürdigerweise ist das immer gesetzt ?!?!
(Ich lese das am Anfang der ICP3 aus)

Sollte die T3_OVF Interrupt-Funktion das nicht beim Verlassen löschen ?
Soll/muss ich das in der T3_OVF selbst löschen ?

Unabhängig davon ist die Methode aber nicht sicher, denn bis die erste 
Anweisung in der ICP3 erreicht wird, könnte das Bit im Hintergrund doch
noch "eben" reinrutschen. Das ist doch ein Hardware-Bit, oder ?

Mir wäre wohler, wenn ich die aktuell anstehenden Interrupts auslesen 
könnte...Aber warte: Ist das dann nicht das Gleiche? Bis ich zum 
Auslesen komme, kann es ja dann auch "eben" reinrutschen ?!

Eine Idee?

Gruß
bitbo

von Peter D. (peda)


Lesenswert?

Das Problem ist bekannt. Man liest einen Timer und etwas später das 
Überlaufbit. Und nun weiß man nicht, war es schon vor oder erst nach dem 
Timerlesen gesetzt.
Die Lösung findest Du hier:

Beitrag "AVR Timer mit 32 Bit"


Peter

von bitbo (Gast)


Lesenswert?

Hi !

Vielen Dank, bei mir funktioniert es nun einwandfrei !!!

Aber ich habe einen kleinen Bug in Timer32.c gefunden.
(siehe Link in vorigem Beitrag)

Thanks and bye, bitbo

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.