Forum: Mikrocontroller und Digitale Elektronik Interrupt


von Peter (Gast)


Lesenswert?

Hallo zusammen,

Ich (Anfänger) arbeite mit dem ATmega32 und dem AT90S8515 Controllern.
Werden bei der Abarbeitung von Interrupt Service Routinen (Interrupt
Handlern) bei Eintreffen anderer Interruptanforderungen aus meiner
aktuellen Interrupt Service Routine gesprungen um in die andere ISR zu
springen. Geht das (also Vorgehen wie Hauptprogramm -> Sprung in ISR) ?
Wenn ja wie oft darf gesprungen werden, d.h gibt es eine
"Tiefenbegrenzung" von Interruptsprüngen innerhalt einer ISR?
Gibt es eine Interrupt Priorität nach der in einer ISR nur gesprungen
werden darf oder werden generell in einer ISR andere Interrupts
disabeld?

Ich würde mich freuen wenn einer die Antwort wüßte und sie mir
schreiben könnte.

Vielen Dank

Peter

von Oliver (Gast)


Lesenswert?

Hi,
die Interrupts beim Atmel haben keine Prioritäten, du müsstest die
Interrupts in der Routine wieder freischalten. Dann begrenzt der Stack
die Einsprungtiefe. Mehr fällt mir da jetzt nicht ein.
Gruß Oliver

von Peter D. (peda)


Lesenswert?

Der AVR hat nur eine Interruptpriorität, d.h. sobald ein Interrupt in
Bearbeitung ist, kann kein anderer dazwischen hauen.

Es gibt aber tricky Programmierung, d.h. man kann innerhalb eines
Interrupts das Global-Interupt-Bit wieder neu setzen.
Aber da sollte man schon sehr genau wissen, was man tut, sonst kann es
leicht sein, daß sich solange Interrupts selbst unterbrechen bis der
Stack überläuft.

Generell gilt daher: "Fasse Dich kurz", d.h halte alle Interrupts so
kurz wie nur irgend möglich.

Totsünden, die man leider oft findet, sind Warteschleifen innerhalb von
Interrups.


Peter

von Joerg Wunsch (Gast)


Lesenswert?

Standardmäßig sind Interrupts gesperrt, während eine ISR läuft.  Du
müßtest sie selbst mit SEI freischalten, dann können sie allerdings
beliebig geschachtelt auftreten.

Interrupt-Prioritäten gibt es nur statisch (siehe Datenblatt), die
sind aber nur von Interesse, wenn mehrere Interrupt-Bedingungen
gleichzeitig anliegen.  Das heißt nicht, das sie gleichzeitig
eingetroffen sein müssen; wenn während eines mit CLI geschützten
Abschnittes mehrere Interruptbedingungen auftreten, dann würde nach
dem folgenden SEI der mit der höchsten Priorität zuerst abgearbeitet.

von Peter (Gast)


Lesenswert?

Hallo Oliver,
danke für deine Nachricht, aber in der Spec steht das
es Interruptprioritäten gibt der Reset Interrupt hat die höchste
Priorität und der Analog Comperator Interrupt z.B im AT90S8515 hat die
niedrigste Priorität. Was meinst Du mit freischalten ich laß ja
alle Interrupts während der Abarbeitung einer ISR zu...

Gruß
Peter

von Peter (Gast)


Lesenswert?

Hab ich das jetzt richtig verstanden?
1. Ich muß zuerst mit sei den Interrupt freigeben (Bekannt)
2. Interrupt tritt auf -> Sprung in ISR -> kann nicht durch einen
anderen Interrupt unterbrochen werden, es sei denn ich setze erneut das
globale Interrupt Bit mit sei? (dann kann auch innerhalb einer ISR ein
weiterer Interrupt abgearbeitet werden)
3. Oder soll ich wenn ich keinen Interrupt in der ISR wünsche generell
mit CLI arbeiten.

Es ist wichtig für mich den ich habe verschiedene Ereignisse
die ich per Interrupt verarbeiten muss und da ist es wichtig diese
Problematik zu verstehen

Danke

Peter

von Joerg Wunsch (Gast)


Lesenswert?

Du brauchst kein CLI in der ISR.

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.