PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt - Programmablauf



PcVirus
04.08.2007, 22:13
Hi,
mich interessiert es wo der Controller nach einer ISR das Programm fortsetzt.
Wird nach dem letzten bearbeiteten Befehl weitergearbeitet oder startet das Programm neu?

MfG Jörn

franzl
04.08.2007, 22:38
Hi,
das Programm Speichert sich die Programmstelle vor dem Sprung in die ISR auf dem Stack und springt nach der ISR wieder dort hin zurück.
Hoffe ich konnt dir helfen.
mfg franz

PcVirus
04.08.2007, 22:42
Ok. Danke.
Und wie ist es wenn ich gerade in einer warteschleife bin?
z.B.:


void sleep(uint16_t sleep_ms)
{
uint16_t i=0;
while(i<sleep_ms)
{
_delay_ms(1);
i++;
}
}

Angenommen der µC soll 3 sek warten und er muss in die ISR.
Bleiben dann die Variableninhalte bestehen und er setzt die Warteschleife fort wenn er aus der ISR raus geht?

linux_80
05.08.2007, 01:31
Wenn Du in C programmierst, werden vom Compiler alle in der ISR verwendeten Register auf dem Stack gesichert, und danach wiederhergestellt, so dass das Hauptprogramm nix von der Unterbrechung mitbekommt.

Die Werte von Variablen stehen sowieso im SRAM, und bleiben so, ausser in der ISR wird die gleiche Variable verwendet, und verändert.
Dazu gibts im Wiki auch einen Artikel.

Bääääär
06.08.2007, 15:40
Wenn du meinst, dass er mitten in diesen 3sek die ISR abrackert und so die drei Sekunden verlängert, dann denke ich hast du recht. In diesem Fall würde ich entweder einen externen Timer verwenden oder die internen, somit hast du immer genau 3sek, egal, welche ISR die Wartezeit unterbricht. Im Allgemeinen dauert eine ISR aber nicht ewig und fällt auf die 3sek gesehen nicht wirklich ins Gewicht.

linux_80
06.08.2007, 18:00
Das Problem mit der Zeit ergibt sich ja daraus, weil das Hauptprogramm nix von der ISR mitbekommt.
Beim warten kommt es nur darauf an, was man verzögern will, und ob man einen Timer frei hat, falls es genau sein muss.