www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zweifacher Externer Interrupt


Autor: swedisch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian T. (shuzz)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.