Forum: Compiler & IDEs Interrupts verschachteln


von Thomas Vosshagen (Gast)


Lesenswert?

Hallo,

ich möchte in einem Programm für den MEGA16 Interrupts verschachteln
und zwar folgendermaßen:

In der ISR von Timer2 kann ein Interrupt von Timer1 auftreten. Wenn
dann die ISR von Timer1 abgearbeitet ist läuft die Abarbeitung der ISR
von Timer2 weiter und erst danach erfolgt der Sprung zurück ins
Hauptprogramm, oder sehe ich das falsch?

Gibt es so etwas wie Interruptprioritäten wie beim 8051 oder sind alle
Interrupts beim AVR gleichwertig?

Vielen Dank für Eure Hilfe!

Gruß, Thomas

von ape (Gast)


Lesenswert?

die interrupts beim avr sind gleichwertig, aber wenn der chip in nen
interrupt geht cleared er von alleine das Global Interrupt Flag.
das kann man aber glaub ich, wenn man es unbedingt möchte, wieder
setzen.
einfach noch mal

sei();

in die Interrupt Routine.

von Thomas Vosshagen (Gast)


Lesenswert?

Danke, aber das war nur zum Teil, was ich wissen wollte. Ok - die
Interrupts sind gleichwertig - gut zu wissen.
Wie ich das alles realisiere, weiss ich (INTERRUPT statt SIGNAL oder
wie Du sagst, mit sei()). Was mir wichtig war:
Springt er von der 2. ISR wieder in die 1. oder direkt ins
Hauptprogramm?

Vielen Dank!


Gruß, Thomas

von Florian Pfanner (Gast)


Lesenswert?

Hallo,

du kannst die Interrupts schon verschachteln. Jedoch musst du von Hand
den aktuellen interrupt deaktvieren also im TIMSK-Register und im
TIFR-Register den Interrupt löschen. Dann kannst du globale die
Interrupts wieder freigen und am Ende der Routine einfach wieder den
Interrupt zulassen.
INTERRUPT() funktioniert hier nicht, da das TIFR-Bit erst beim
verlassen der Interruptroutiene gelöscht wird. Wenn du die Routiene mit
INTERRUPT() aufrufst, wird das SEI-Bit sofort wieder gesetzt und dein
Interrupt wird wieder ausgelöst. Das geht solange, bis dein Stack
verbraucht ist. Also bis sich der Controller aufgehängt hat. Aber "von
hand" gehts.

Gruß, Florian

von John (Gast)


Lesenswert?

Die Interrupts sind nicht gleichwertig, es gibt nur keine Interruptlevel
wie bei anderen Controllern wie dem 8051.
Bei gleichzeitigem Auftreten haben die IRQs eine unterschiedliche
Priorität.

von Florian Pfanner (Gast)


Lesenswert?

Stimmt so nicht ganz. Beim gleichzeitigen auftreten von 2 Interrupts,
wird zuerst der ausgeführt, welcher die niedere Nummer hat.

Gruß, Florian

von John (Gast)


Lesenswert?

Genau das meinte ich doch ;)

von Peter D. (peda)


Lesenswert?

"Beim gleichzeitigen auftreten von 2 Interrupts,
wird zuerst der ausgeführt, welcher die niedere Nummer hat."

Theoretisch ja, praktisch kommt es dann aber zu einer
Prioritätsinversion:

Wenn 2 Interrupts als INTERRUPT deklariert sind, d.h. beim Eintritt das
SEI ausführen, dann wird der zuerst gestartete höherpriorisierte sofort
durch den 2. unterbrochen und dieser 2. niederpriorisierte zuerst
beendet.

Man muß also genau wissen, was man tut, wenn man Interrupts
verschachteln will.


Deshalb benutzte ich den AVR auch nur für kleinere Projekte.
Für komplexere Aufgaben mit vielen Interrupts benutze ich den 8051
(z.B. T89C51CC01), der hat 4 echte Interruptprioritäten, da kann man
sogar noch eine für Softwareinterrupts reservieren.
Z.B. relaisiere ich das 1-wire als Softwareinterrupt, da das Timing
nicht von anderen Interrupts unterbrochen werden darf, außer von
Interrupts der allerhöchsten Priorität.

Man muß sich dann auch nicht mehr so sehr drum kümmern, welche Sachen
wirklich im Interrupt gemacht werden müssen und welche man in die
Mainloop auslagern muß, um sämtliche Interrupts kurz zu halten.



Peter

von Thomas Vosshagen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Hab jetzt alles einmal durchprobiert und im Studio simuliert. Die
Lösung im Anhang scheint mit die logischste. Wär lieb, wenn ihr mal
kurz drübergucken könntet. Andere Interrupts als die 3 erwähnten können
nicht auftreten.

Vielen Dank!!

Gruß, Thomas

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.