Forum: Mikrocontroller und Digitale Elektronik Latenzzeiten bei zwei Interrupts


von Axel Höhmann (Gast)


Lesenswert?

Hallo,

weiß jemand zufällig, wie die AVRs damit umgehen, wenn
zwei Interrupts "quasi" gleichzeitig eintrudeln?

Mein Problem ist folgendes:
Ich muß sehr schnell auf einen externen Int. reagieren.
Der Proz. läuft schon mit maximalem Takt.

Bekanntlich kann ein Interrupt einen 2-/3-Takt-Befehl
nicht unterbechen. Wie ist es aber erst, wenn der Atmel
gerade  dabei ist einen niedrigeren Int. auzulösen?
Bekanntlich dauert das Dekodieren hier mind. 4Takte.
Kann das unterbrochen werden?

Beispiel: Der UART meldet TX_Complete und noch bevor
der rjmp auf dem Signalhandler ausgeführt wird, kommt
der externe Int..

Gruß
Axel


P.S. In den Datsheets finde ich dazu nichts und
per Debugger läßt sich das nicht ausprobieren ;-)

von Uwe (Gast)


Lesenswert?

Hi!
Was du vor hast ist beschissen, wenn die Bearbeitung eines speziellen 
Int.so wichtig ist kannst du nur mit einem fahren und die anderen musst 
du per Flagabfrage lösen. Hast du etwas mehr Zeit (Einsprung) kannst du 
nach dem Einspr. in die ISR das I-Bit erneut setzen und bist in der ISR 
Intfähig. Achte dabei aber gut auf den Stack! Die Sache kann aber sehr 
schnell unübersichtlich werden.
Gruss Uwe

von Axel Höhmann (Gast)


Lesenswert?

Hallo,

ich weiß, daß das kniffelig ist.
Daß ich für weitere Ints erst wieder "sei" machen muß, ist klar.
Die Frage zeilete auch mehr darauf ab, ab wann weitere Ints
gesperrt sind. Ist es möglich, daß sich während der vier Takte noch ein 
weiterer Int. dazwischenschiebt?

Mit dem Stack habe ich übrigens keine Probleme.
Der wichtige Int putzt den Stack und setzt neue
Rücksprungadresse für's reti. ;-)


Gruß
Axel

von Markus (Gast)


Lesenswert?

Soweit ich weiß wird der IRQ wärend der bearbeitung eine IRQ Routine 
abgeschaltet. Es kann also bis IRET kein weitere IRQ bearbeitet werden.
Danach werden alle "gespeicherten" IRQ in der Reiehnefolge ihrer 
Priorität abgearbeitet.
Laufende Befehle lassen sich sowieso nicht unterbrechen
Ich hab es noch nicht ausprobiert, aber theoretisch müsste man aber mit 
SEI innerhalb einer IRQ Funktion den IRQ wieder einschalten können. 
Damit solltest Du aber vorsichtig sein das der Stack nicht verwurschtelt 
wird..
Also verbrauchst Du mindestens die Takte für den ersten IRQ Aufruf (z.B. 
UART), evt PUSH Befehle für Registerrettung, SEI Befehl und IRQ Aufruf 
für Deine dringende Funktion. Drunter wird nix gehen. Die PUSH Befehle 
müssen unbedingt VOR SEI ausgeführt werden.

Ansonsten hilft wirklich nur noch alles von Hand Pollen und nur den 
einen IRQ fahren.

Gruß
Markus
http://www.elektronik-projekt.de/

von Axel Höhmann (Gast)


Lesenswert?

Hallo Markus,


daß man sei machen muß, hatte ich im zweiten Beitrag geschrieben,
das ist klar. Um den Stack brauche ich mich doch wohl nur
kümmern, wenn die Interruptroutine auch Register verwurschelt, oder?

Mir geht's darum, ob die vier Takte bis zum Einsprung
in die Interrupttabelle noch unterbrochen werden können
oder nicht.

Gruß
Axel

von Markus (Gast)


Lesenswert?

Kurz und kapp, nein

von Axel Höhmann (Gast)


Lesenswert?

Kurz und knapp zurück: Schade


Gruß und Danke
Axel

von Thomas O. (Gast)


Lesenswert?

Hallo,

was willst du den machen, weil es dir um jeden einzelnen Takt geht? 
Projektbeschreibung?

von Axel Höhmann (Gast)


Lesenswert?

Hallo,

ich habe schon gemacht. Ich muß die SW jetzt aber erweitern.
Die Sache ist ziemlich speziell, da ich gerade tief
in den Eingeweiden von Autoelektronik wühle. Das zu erklären,
würde zu lange dauern.

Sobald die Schaltung fertig ist, kann ich hier ja einen Link
posten.


Gruß
Axel

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.