mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Serieller Interrupt


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AndreasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setz ein Flag im Interrupt (globale Variable) und prüfe im
Hauptprogramm.

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

Gruß Andreas

Autor: seacrash (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AndreasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: AndreasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AndreasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: seacrash (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();
}

Autor: AndreasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.