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
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.
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
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
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.
Stimmt so nicht ganz. Beim gleichzeitigen auftreten von 2 Interrupts, wird zuerst der ausgeführt, welcher die niedere Nummer hat. Gruß, Florian
"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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.