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 ;-)
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
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
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/
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
Hallo, was willst du den machen, weil es dir um jeden einzelnen Takt geht? Projektbeschreibung?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.