Forum: Mikrocontroller und Digitale Elektronik ATmega: gleichzeitige Interrupts


von Stefan H. (shaun)


Lesenswert?

So, nach meinem SPI-Malheur nun mal ein echtes Problem :)

Ich habe eine ISR laufen, die durch Timer1-Compare-Match alle 10ms 
aufgerufen wird, ein, zwei vitale Timervariablen hochzählt und Flags 
setzt. Ausserdem toggelt sie den Eingang für Timer3, entweder aus oder 
externer Eingang. An dem externen Eingang liegt eine Frequenz, die 
gezählt werden soll, d.h. 100 Timer1-Compare-Match-Aufrufe lang ist das 
externe Signal auf T3 geschaltet, danach einen ISR-Zyklus lang aus und 
dann wird ausgelesen.

Da die Frequenz deutlich über 65536Hz liegen kann, wird T3 auch mal 
überlaufen - kein Problem, das High-Word wird in der T3OVF-ISR gebildet.
ABER: was passiert, wenn der entscheidende T1-Match und ein T3-Überlauf 
gleichzeitig eintreten - da die externen Timereingänge ja auf den 
Systemtakt synchronisiert werden, ist das recht wahrscheinlich.

Zwei Möglichkeiten: T3 kommt vor T1 - kein Problem, T3 ist übergelaufen, 
also TCNT3=0, die ISR wird aufgerufen, hochgezählt, alles super.

Oder: T1 kommt zuerst. T3 ist indes schon übergelaufen, sein OVF aber 
noch nicht durch die Interruptlogik wahrgenommen worden, weil 
T1-Compare-Match gerade in der Verarbeitung steckt. Es wird also eine 0 
aus TCNT3 gelesen, aber eigentlich wäre der Wert 65536 höher.

Meine Überlegung: ich frage in der T1-ISR vor dem Speichern des 
TCNT3-Wertes ab, ob T3OVF gesetzt ist. Wenn ja, inkrementiere ich das 
High-Word, löschen T3OVF, damit es nach dem Verlassen der T1-ISR keine 
Fehlzählung gibt und gut - oder?

Jeder, der schon mal einen Frequenzzähler programmiert hat, wird sich 
darüber (hoffentlich!!!) mal Gedanken gemacht haben. Wenn ich das so 
schreibe, bevor sich hier Widerspruch regt, lasse ich mal für den Fall, 
dass meine Abfrage da oben jemals true wird einen Portpin setzen. Mal 
sehen...

von Peter D. (peda)


Lesenswert?


von Stefan H. (shaun)


Lesenswert?

Danke, Peter.
Dass Du genau dieses Problem so schön nachvollziehbar beschrieben hast, 
freut mich schon deswegen, weil ich mich dann nicht für völlig paranoid 
halte.

Mein Zähler (ist Teil einer größeren Schaltung und kein Frequenzzähler 
zum Selbstzweck - ich zähle eine Referenz, um dann einen DDS damit zu 
programmieren, auf dass dieser sich mittels PLL+VCO auf die Referent 
lockt)zählt nun auch ganz brav, unter Berücksichtigung dessen, was ich 
in meinem ersten Posting schon schrieb und dessen, was Du in Deinem 
Beitrag erwähntest.

Allerdings frega ich mich, ob ich den Zählerstand wirklich prüfen muss. 
Wenn beim ATmega64 das T3OVF gesetzt ist, muss ja gerade eben erst ein 
Überlauf stattgefunden haben, demnach ist der TCNT3 zwangsläufig bereits 
durch die Null gelaufen. Ein Szenario, wo beim Ausführen der Torzeit-ISR 
TOVF3 gesetzt ist, der Zähler aber noch nicht übergelaufen, kann ich mir 
nicht vorstellen.

Wie gesagt: ich schalte in der ISR, die am Anfang und Ende der Torzeit 
aufgerufen wird, zuerst(!) den Eingang um. Wenn ich ihn gerade 
ausgeschaltet habe, kann sich zwischen dem Auslesen des Zählerstandes 
und dem Auslösen des T3OVF doch nichts mehr ändern. Oder........?

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.