PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupts bei AVRs



Stefan090
02.04.2007, 13:48
Hallo,

was ich schon mal wissen wollte, was passiert wenn in einer Interruptroutine ein aderer Interrupt (sollte wieder in eine andere Interruptroutine springen) ausgelöst wird?

Wird die dann nachdem die andere beendet ist abgearbeitet oder wird die gar nicht ausgeführt?

Denn während einer ISR sind ja die interrupts global deaktiviert

Anwendung z.B bei Drehzahlmessung: wenn ein ext. Interrupt auftritt soll ein Timer gestartet werden und gestoppt werden, wenn der nächste ext. Interrupt auftritt. Beim Timer müsste ich aber bei jedem Overflow eine Variable erhöhen, damit ich nachher die Zeit und somit auch die Drehzahl berechnen kann.

Wenn nun aber gerade während der Overflow Routine ein ext. Interrupt auftritt, funktioniert das ganze dann noch?

Wenn nein, gibt es eine andere Lösung?

Guß Stefan

Florian
02.04.2007, 14:09
Hallo Stefan,
wenn während eine Interruptroutine ausgeführt wird, ein weiterer Interrupt ausgelöst wird, wird die dazugehörige Interruptroutine danach abgearbeitet, denn das dazugehörige Flag in der Interruptvektortabelle ist gesetzt.
Sollten gleichzeitig zwei oder mehr Interrupts ausgelöst werden, wird zuerst die Interruptroutine aufgerufen, die höher/früher in der Interruptvektortabelle steht.

Ich hoffe ich konnte Dir weiterhelfen!?

Viele Grüße
Florian

ogni42
02.04.2007, 17:18
das hängt davon ab. Du kannst natürlich in der ISR die Interrupts wieder einschalten. Dann wird ggfs. endlos zwischen ISRs hin und her gesprungen.

Stefan090
02.04.2007, 17:24
Ok, danke. Ist das bei allen AVRs so?
In der Interruptvektortabelle stehen die interrupts der Reihe nach, in der sie aufteten?

Gruß Stefan

Hubert.G
02.04.2007, 19:26
Die Interruptvektortabelle ist eine Adresstabelle wohin das Programm springt wenn der dazugehörige Interrupt ausgelöst wird, in Assembler ist das ganz eindeutig.
Darum sollten Interruptroutinen so kurz wie möglich gehalten werden um den nächsten nicht zu behindern.
Wenn wärend deiner Overflow-Routine ein ext. Interrupt auftritt wird zuerst die Variable erhöht und dann erst die Routine des ext.Interrupts abgearbeitet.
Das ist bei allen Tiny und Mega so bei den 8051 nicht.

Stefan090
03.04.2007, 07:22
was passiert jedoch wenn ich cli() irgendwo im programm schreibe? werden die ganzen interrupts die in der zwischenzeit auftreten dann nachdem ich wieder sei() schreibe ausgeführt?

oder kann man die interrupts hiermit deaktivieren und somit verwerfen?

Gruß Stefan

wkrug
03.04.2007, 07:55
Soweit ich weiß wird für jeden Interrupt ein Flag gesetzt.
Stehen also mehrere Interrupts nach einem "SEI" an, werden diese nach ihrer Reihenfolge in der Interrupt Vektortabelle abgearbeitet.
Wenn man also vor einem "SEI" anstehende Interrupts unterbinden will, muß man das entsprechende Flag des Interrupts löschen, dann wird dieser Interrupt nach einem "SEI" nicht ausgeführt.

Florian
03.04.2007, 13:12
Hallo Stefan,
die Interruptflags der Interruptvektortabelle bleiben so lange gesetzt, bis sie entweder manuell gelöscht oder durch die dazugehörige Interruptroutine zurückgesetzt werden.
Wenn Du den Befehl cli (Global Interrupt Disable) bzw. die C-Funktion cli() verwendest, wird nur das globale Interrupt-Flag im Statusregister gelöscht, und somit der Aufruf der Interruptvektortabelle unterbunden, die einzelnen Interruptflags bleiben aber, soweit ich weiß, erhalten.

Viele Grüße
Florian

SprinterSB
03.04.2007, 14:14
die Interruptflags der Interruptvektortabelle bleiben so lange gesetzt, bis sie entweder manuell gelöscht oder durch die dazugehörige Interruptroutine zurückgesetzt werden.

Darüber hinaus gibt es es IRQs, die nur solange getriggert werden, wie eine Bedingung erfüllt ist. Level-getriggerte externe IRQs gehören zB dazu.

Die IRQ-Flags werden in speziellen SFRs gespeichert: den Flag-Regs. Diese gehören zu den jeweiligen Peripherie-Komponenten, zB TIFR, GIFR, EIFR, ...

Stefan090
03.04.2007, 15:22
Das heißt wenn ich nach dem cli() wieder ein sei() schreibe, werden dann alle interruptroutinen von den interrupts ausgeführt die in der zwischenzeit aufgetreten sind?

Gruß Stefan

SprinterSB
03.04.2007, 16:02
Ja. Aber wenn die selbe IRQ mehrfach getriggert wurde, dann wird die ISR trotzdem nur 1x ausgeführt.

Die Abarbeitung der IRQs erfolgt gemäß ihrer Priotität, also kleine IRQ-Nummern zuerst

Stefan090
03.04.2007, 16:26
Ok, danke, nun weiß ich endlich alles was ich brauche

Gruß Stefan