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
Setz ein Flag im Interrupt (globale Variable) und prüfe im Hauptprogramm. Oder: Löse einen Reset per Software aus... Gruß Andreas
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
>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
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
Wie schon gesagt: Wenn du das machen musst, was du machen willst, ist es eher wahrscheinlich, dass dein kompletter Programmaufbau nicht stimmt.
Kann man nicht in der Interruptroutine die Rücksprungadresse im Stack überschreiben?
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
@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.
@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
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(); }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.