Forum: Mikrocontroller und Digitale Elektronik Zweifacher Externer Interrupt


von swedisch (Gast)


Lesenswert?

Servus Gemeinde,

folgende Konfiguration:

Tiny2313,20MHz, gemessen werden soll an periodischem signal, 
periodendauer 113us.

Das Signal beinhaltet alle 113 us einen Sync Impuls (MPEG2), welches auf 
einem extra pin anliegt.

Zwei Ausbreitungswege werden mit dem selben Signal gespeist, ein Weg 
direkt, einer Verzögert. Nun will ich den laufzeitunterschied bestimmen. 
Problem ist, dass dieser größer 113us sein wird

Hierzu: die beiden Sync Impulse der beiden Signale auf die beiden 
Externen Interrupts. Dann im eigentlichen MPEG Datenstrom ein Bit 
maskiert, dass alle sagen wir sekunde wieder auftaucht. Der zeitliche 
Abstand vom Auslösen des Externen Interrupts bis Auftreten des 
maskierten Bits ist für beide Wege identisch und immerzu konstant.

Folgende Vorgehensweise:
Am externen Interrupt 0 liegt der Sync Impuls des direkten Weges an.
Wird dieser ausgelöst wird 5 Takte gewartet(bis das Maskierte Bit im 
Datenstrom auftaucht) und dann der Datenstrom an PIND0 abgefragt. Ist er 
in diesem Moment High, timer starten.

Am externen Interrupt 1 liegt der Sync Impuls des verzögerten Weges.
Wird dieser ausgelöst wird wieder exakt 5 takte gewartet, dann der PIND1 
abgefragt. ist dieser in dem Moment High, Timer stoppen, wert umrechnen 
und raus aufs Display.

Nun meine Probleme:
Das Bit welches ich abtasten möchte treffe ich sehr genau, zumindest im 
Interrupt Handler für INT0

Nun bin ich mir nicht ganz sicher wie die Interrupts zeitlich 
abgearbeitet werden. Sollte die verzögerung recht klein sein, so steht 
der INT1 an wenn INT0 noch abgearbeitet wird. somit wird nach dem reti 
von INT0 direkt in INT1 gesprungen, jedoch passt hier meine 5 Takte 
verzögerungszeit nicht. d.h. ich treffe das Bit welches ich abtasten 
will nicht und treffe evtl ein falsches bit, welches aber high ist in 
diesem moment. Ergo: ich messe nur mist.

Ebenso, wenn die zu messende verzögerung ein vielfaches der 
periodendauer, hier 113us, beträgt.
Hat jemand vielleicht eine Idee, wie man dies Umgehen kann? evtl nicht 
nur ein Bit manipulieren sondern gleich ein ganzes Byte.

Bin langsam am Verzweifeln.

Werde morgen mal meinen Code posten, den hab ich leider nicht auf diesem 
Rechner. vielleicht mache ich ja nur einen gravierenden Fehler auf den 
ich selber im moment nicht stoße.

MfG, swedisch

von fubu1000 (Gast)


Lesenswert?

Hallo,
Code wäre gut.
Ich könnte mich irren (nit hauen bitte), aber ich meine bei den Atmegas 
und Tinys kannste ne Interruproutine nicht unterbrechen.
Also der Sprung von Int1 nach Int0 geschieht erst nachdem INT1-Routine 
fertig ist.

Gruss

von Christian T. (shuzz)


Lesenswert?

Interrupt-Routinen kann man schon unterbrechen, da gibt's nen Trick für:

Der Trick liegt darin, im Interrupthandler von INT0 lediglich eine 
Adresse auf den Stack zu schieben. Die Adresse gehört zur eigentlichen 
Funktion die die Interruptbehandlung macht.
Das RET am Ende des Handlers springt dann quasi nicht zurück ins 
Hauptprogramm sondern erstmal zu der Interruptroutine. Die kann dann 
aber bereits wieder von einem anderen Interrupt unterbrochen werden.

Du musst allerdings sicherstellen, daß die Routine für INT0 auch 
wirklich fertig ist bis der nächste INT0 auftritt da Du ansonsten ein 
fieses Deadlock erzeugst und Dir dann irgendwann der Stack überläuft...


Ob das dem OP aber weiterhilft kann ich nicht sagen.

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.