Forum: Mikrocontroller und Digitale Elektronik Serieller Interrupt


von Andreas (Gast)


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

von AndreasB (Gast)


Lesenswert?

Setz ein Flag im Interrupt (globale Variable) und prüfe im
Hauptprogramm.

Oder: Löse einen Reset per Software aus...

Gruß Andreas

von seacrash (Gast)


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

von AndreasB (Gast)


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

von Andreas (Gast)


Lesenswert?

Hallo,

Danke für Eure Bemühungen. Echt toll, dass man hier so schnelle
Antworten bekommt!

Ich werde es nun mit Sprungmarken versuchen; mal sehen, ob das klappt!

Na dann! THX


mfg
Andreas

von Karl heinz B. (kbucheg)


Lesenswert?

Wie schon gesagt:
Wenn du das machen musst, was du machen willst,
ist es eher wahrscheinlich, dass dein kompletter
Programmaufbau nicht stimmt.

von Thomas (Gast)


Lesenswert?

Kann man nicht in der Interruptroutine die Rücksprungadresse im Stack
überschreiben?

von AndreasB (Gast)


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

von AndreasB (Gast)


Lesenswert?

@Thomas: kann man. Warum mans nicht macht s.o. - Ich würde das WENN dann
nur in Assembler machen - da weiß ich wenigstens noch ziemlich genau was
warum auf dem Stack liegt.

von seacrash (Gast)


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

von Rolf (Gast)


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();
}

von AndreasB (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.