Serieller Interrupt

Gast #353959
Lesenswert?

Hallo,

Ich habe eine kurze Frage bezüglich des seriellen Interrupts. Wenn sich
mein Programm im Hauptprogramm befindet und ein (serieller) Interrupt
ausgeführt wird, so wird der Code an der verlassenen Stelle wieder
weiter ausgeführt.
Nun zur Frage: Geht es, dass nach Beenden des Interrupts das
Hauptprogramm vom Anfang an beginnt (und nicht an der Stelle
weitermacht, wo es vom Interrupt unterbrochen wurde)? Ich benutzte
Bascom mit ATmega8.

Vielen Dank für Eure Antworten!

mfg
Andreas
Gast #353961
Lesenswert?

Beides keine Lösungen, da

>Setz ein Flag im Interrupt (globale Variable) und prüfe im
>Hauptprogramm.
nach dem Interrupt doch erst einmal dort im Hauptprogramm weiter
gemacht wird wo unterbrochen wurde!!


>Oder: Löse einen Reset per Software aus...
Fängt ja von ganz vorne und nicht im Hauptprogramm wieder an, d.h. es
muß auch alles erst wieder initialisiert werden...!!


Was tun? Es gibt eine Möglichkeit, allerdings hat das nichts mehr mit
vernünftiger Programmierung zu tun.
Ich denke eher, du hast möglicherweise ein strukturelles Problem mit
deinem Code, kann man das nicht anders lösen?


Grüße
Gast #353962
Lesenswert?

>nach dem Interrupt doch erst einmal dort im Hauptprogramm weiter
>gemacht wird wo unterbrochen wurde!!

Ist schon klar, aber normalerweise kann man dort auch weitermachen. Mit
geschickter Main-Loop und Abfragen bekommt man das schon hin. Ohne Code
kann man eh nicht viel dazu sagen

>nach dem Interrupt doch erst einmal dort im Hauptprogramm weiter
>gemacht wird wo unterbrochen wurde!!

Er wollte das Hauptprogramm "von Anfang an" laufen lassen. Das ist
bei mir immer dort, wo der uC hingeht, wenn er einen Reset bekommt.
Meinetwegen auch was anderes. Wie gesagt, ohne Code kann man nix dazu
sagen

Er könnte alternativ auch die Rücksprungadresse modifizieren und so vom
Interrupt an den Anfang des Programms springen. Allerdings muss er dann
den SP wieder richtig (zurück)setzen, viel Spaß.

Wer allerdings solche komischen Konstrukte braucht, der hat was falsch
gemacht...

Gruß Andreas
Gast #353966
Lesenswert?

Lass das mit den Sprüngen und versuche deinen Code sinvoll zu schreiben.
Ich kenne Bascom nicht - aber wenn du einfach so einen Sprung machst,
musst du dafür sorgen, dass dein Zeug das (durch den Interrupt, durch
Schleifen, durch Funktionsaufrufe) auf dem Stack gesichert auch wieder
weggenommen wird.

Sonst bekommst du irgendwann einen Stackoverflow. Deshalb ist es auch
gut so, dass ein Interrupt wieder da einsetzt wo er aufgehört hat und
das Programm weiterlaufen kann.

Wenn du bestimmten Code nicht ausgeführt haben willst musst du eben
eine Bedingung dafür formulieren, dass dieser Abschnitt nicht nach
einem Interrupt ausgeführt werden darf.

Willst du vielleicht mal erklären, wo das wirkliche Problem ist und
warum du unbedingt am Anfang wieder aufsetzen willst?

Gruß Andreas
Gast #353968
Lesenswert?

@AndreasB
Hauptprogramm <--> Initialisierung
gehören nicht zusammen, aber naja, hat halt jeder seine Meinung :)

>Er könnte alternativ auch die Rücksprungadresse modifizieren und so
>vom Interrupt an den Anfang des Programms springen. Allerdings muss
>er dann den SP wieder richtig (zurück)setzen, viel Spaß.
und müsste noch ein paar andere Sachen beachten/machen!!
Aber genau das wollte ich ihm halt nicht Vorschlagen.


>Wer allerdings solche komischen Konstrukte braucht, der hat was
>falsch gemacht...

So ist´sssss

Mit Gruß
seacrash
Gast #353969
Lesenswert?

Wenn du unbedingt einen Neustart provozieren willst, schreibe ein
Unterprogramm und rufe dieses in sich selbst in eine Endlosschleife
auf.
In Nullkommanichts hast du einen Stackoverflow und der Atmel resetet
sich.

Pseudocode:

void kill_me(void)
{
 kill_me();
}
Gast #353970
Lesenswert?

nitpick

Nicht wenn ich nen gescheiten compiler habe, der Endrekursion erkennen
und richtig behandeln kann. Wenn auf dem aufsteigenden Ast (sofern es
einen gibt) nichts gemacht werden muss, kann der Compiler getrost den
activation record des vorherigen Rekursionsschrittes überschreiben -
und tadaa die perfekte Endlosschleife ist geboren. Ohne
Stackoverflow...

nitpick ende

Gruß Andreas

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren