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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.