PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt während eines Interrupts



tegtom
20.11.2010, 12:03
Hallo kurze Frage an Atmel Assembler Experten,

ist es eine ordentliche und auch funktionierende Programmierung wenn ich einer Interruptroutine ISR jederzeit Vorrang geben möchte (externes Signal auf INT0) aber auch einen untergeordneten Interrupt (TIMER0 overflow) so zu lassen möchte das der TIMER0 overfow Interrupt auftreten kann aber von dem übergeordneten Interrupt INT0 unterbrochen werden kann (indem ich einfach in der ISR des Timer0 den cli Befehl weglasse) und nach Abarbeitung der ISR von INT0 der Atmel MEGA 8 wieder zurück in die ISR des Timer0 springt ohne das Fehler auftauchen und damit beide ISR in der von mir vorgegebenen Priorität sauber abgearbeitet werden und sich dann der Prozessor wieder seinem Hauptprogramm widmet?

Danke
Gruß
Thomas

uwegw
20.11.2010, 12:15
Vielleicht solltest du das Problem in mehr als einem(!) Satz schildern, dann versteht man auch besser was du willst...

Jaecko
20.11.2010, 14:24
Dito. Auch mehrmals durchgelesen, aber nicht wirklich dahintergekommen.
Welcher Interrupt soll welchen unterbrechen dürfen?
Bei normalen AVRs gibts nur 1 Priorität (bzw. 2, aber die höheren sind dann die NMI wie Reset, Brownout etc.)

Besserwessi
20.11.2010, 14:51
Nicht einfach, aber so etwa kann man das Problem schon verstehen.

Man kann in einer ISR den Interrupt wieder frei geben. Das sperren geht automatisch muss also nicht in Software per CLI erfolgen. Man kann den Interrupt nur wieder frei geben per SEI. Das ist durchaus in Ordnung, man muss aber etwas aufpassen was man macht.

Problematisch wird es aber wenn sich eine ISR sozusagen selber unterbricht. Bei einem Timer Interrupt kann man das oft ausschließen, bei einem externen Interrupt ist das aber nicht so so sicher. Notfalls kann sich helfen, indem man erst den Speiziellen Interrupt der die ISR ausgelöst hat sperrt und erst dann per SEI global interrupts frei gibt. Wegen des extra Aufwandes ist das aber oft auch kleine Lösung, weil dann noch weniger Zeit zur Verfügung steht.

Zusätzlich muss man den höheren Platzbedarf auf den Stack berücksichtigen. Eventuell ist dann auch die Reihenfolge in der die Interrupts abgearbeitet werden nicht ganz die die man erwartet.

PICture
20.11.2010, 14:54
Hallo!

Ich kenne AVR's nicht genug um mitreden zu können. Theoretisch sollte aber jeder Interrupt so lange bestehen, bis entsprechendes Interrupt Flag (IF) in Interrupt Service Routine (ISR) gelöscht wird. Deswegen sollte es möglich sein durch Festlegung der Reihenfolge, in der die IF's in ISR geprüft werden, eigene Prioritäten zu setzen.

Sollte bei AVR's nicht so sein, dann bitte meine Antwort nicht berücksichtigen und vergessen. ;)

MfG

Besserwessi
20.11.2010, 16:16
Bei den AVRs gibt es für jede Interruptquelle eine eigene ISR. Man muss also nicht erst von Hand nachprüfen wo der Interrupt her kommt. In den meisten Fällen werden die Interrupt Flags auch gleich von der Hardware gelöscht. Wenn gleichzeitig mehrere Interrupts anstehen, gibt es eine feste Reihenfolge.

Die Zeit bis zum möglichen wieder erlauben von Interrupts ist auch nicht besonders lang. Das sollten 4 Zyklen für den eigentlichen Interrupt, meistens 2 Zyklen für den RJMP in die eigentliche ISR und 1 (+1) Zyklen für das setzen des I. Flags sein. Dazu dann ggf. noch etwa 2-3 Zyklen um den gleichen Interrupt zu sperren. Aber selbst wenn eine Interrupt sich selbst unterbricht muss das noch nicht zu einen Absturz führen - es braucht nur viel Stack und der letzte Interrupt wird zuerst abgearbeitet (falls es denn einen Unterschied macht).

PICture
20.11.2010, 17:16
Danke sehr für deine ausführliche Erklärung. :)

Dank dir lerne ich die AVR's immer besser kennen, die ich vielleicht mal anwende, wenn ein PIC für mich nicht mehr ausreicht. ;)

MfG

tegtom
20.11.2010, 17:31
Super vielen Dank für die vielen Antworten (und sorry für die nicht verständliche Beschreibung). Aufgrund eurer Antworten erinnere ich mich gelesen zu haben das die Interrupt Flags automatisch bei Start eines Interrups zurück gesetzt werden und ich denke ich werde den ersten Versuch starten indem ich den unterbrechbaren Timer Interrupt mit SEI starte und dann mal sehen ob die Theorie zu dem Thema auch praktisch stand hält. Ich bin auch gespannt ob der Stack zurecht kommt, ich hatte mal was von max. 3 Sprüngen in Unterprogramme gelesen?, aber das werde ich nicht erreichen, auch wenn der INT0 den Timer Interrupt zeitweise aus bremst.

Hier ist im übrigen das ganze Carrera Digital Projekt zu sehen was eigentlich schon abgeschlossen ist und jetzt "nur" noch um eine zeitliche Überwachung zu ergänzen wäre, denn der im Projekt eingesetzte Sender (ELV 986Mhz) darf "nur" 36 Sekunden senden (was bei dieser ersten Variante genau 1800 Runden pro Stunde sind-später möchte ich andere Sende und Empfangsmodule ausprobieren bei denen eine höhere Übertragungsrate und andere Übertragungsverfahren möglich sind damit dürften die zu fahrenden Runden sich wesentlich erhöhen--auch wenn es eigentlich keiner braucht :-)).

http://www.youtube.com/watch?v=RpTwfAQT7-s

Vielen Dank
Gruß
Thomas

workwind
20.11.2010, 18:42
Du benötigst einfach doppelt so viel Stack für die IRQs. Es hängt von Deiner Implementation ab, wieviel Bytes von der jeweiligen Interruptroutine auf den Stack gepusht werden, mindestens jedoch der Platz für die Rücksprungaddresse. Ansonsten ist das mit zwei Interruptebenen durchaus OK, in der avr-libc gibt es dafür die beiden Konstanten ISR_BLOCK und ISR_NOBLOCK, die man dem ISR Macro als zweiten Parameter übergeben kann.

Besserwessi
20.11.2010, 19:13
Die Begrenzung aus etwa 3 Unterprogrammaufrufe gilt für AVRs ohne SRAM. Beim Mega8 hat man aber einiges SRAM zu verfügung. Das Limit ist da eher bei rund 400.

tegtom
21.11.2010, 09:19
Sehr interessante Neuigkeiten für mich ich weiß natürlich aus meiner beruflichen Erfahrung (die mit Mikrocontrollern nichts zu tun hat) das man im Team die meisten Aufgaben besser lösen kann. Eigentlich müsste man regionale Treffen organisieren indem einige Leute ihre Projekte mitbringen und vorstellen, man über Code und Programmierungen kostenfrei und ohne professionellen Anspruch diskutieren kann (so das die "Vortragenden" keinen Stress haben und man offen und einfach über Probleme und Lösungen diskutieren könnte (vielleicht noch ein kleiner Bauteile und Platinenmarkt). Aber ggf. gibt es so was schon---Man könnte auch z.B. einen Mikrocontroller-Club Düsseldorf ..... oder Rhein-Ruhr oder sonst was gründen und die Teamtreffen hier posten (so machen wir das in einem anderen Hobbybereich, das ist toll, man trifft nette Leute und hat natürlich viel zu besprechen-kleine regionale Gruppen 5-15 Leute-jung und alt). Oder gibt es so was schon?

Aber ich will hier jetzt keinen überfordern und erst mal vielen Dank für die weiteren Beiträge.
Gruß
Thomas