www.mikrocontroller.net

Forum: Compiler & IDEs Interrupts verschachteln


Autor: Thomas Vosshagen (Gast)
Datum:

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

Autor: ape (Gast)
Datum:

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

Autor: Thomas Vosshagen (Gast)
Datum:

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

Autor: Florian Pfanner (Gast)
Datum:

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

Autor: John (Gast)
Datum:

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

Autor: Florian Pfanner (Gast)
Datum:

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

Gruß, Florian

Autor: John (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das meinte ich doch ;)

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Thomas Vosshagen (Gast)
Datum:
Angehängte Dateien:

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

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.