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
Druckbare Version
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
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
Ok. Danke.
Und wie ist es wenn ich gerade in einer warteschleife bin?
z.B.:
Angenommen der µC soll 3 sek warten und er muss in die ISR.Code:void sleep(uint16_t sleep_ms)
{
uint16_t i=0;
while(i<sleep_ms)
{
_delay_ms(1);
i++;
}
}
Bleiben dann die Variableninhalte bestehen und er setzt die Warteschleife fort wenn er aus der ISR raus geht?
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.
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.
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.