mikrocontroller.net

Forum: Compiler & IDEs Aus dem Interrupt springen??


Autor: Matthias Laubnitz (mcl024)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

wie kann ich wenn meine ISR zu ende an eine andere Stelle springen, als 
aus der ich gekommen bin??

Autor: jl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stackmanipulation

Autor: Klugscheisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Davon ist eher abzuraten.

Wenn es denn aber doch sein muss oder von prinzipiellem Interesse ist, 
muss man sich nur klarmachen, das (je nach Programmiersprache) evtl. 
gerettete Register, mindestens aber eine Rückkehradresse auf dem Stack 
sind. Diese kann man manipulieren.

Dazu am besten mal den Abschnitt über Interrupts des entsprechenden 
Prozessors lesen.

Autor: Dussel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pop r16
pop r16
sei
rjmp Marke

Zweimal pop um die Rücksprungadresse vom Stack zu holen. Das Register 
ist egal. Ist aber sehr schlechter Stil und kann auch anders gelöst 
werden. Wenn es nicht nur mal zum Testen oder für's Verständnis ist, 
solltest du das anders machen.

Autor: Dussel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, ich bin von ATmega ausgegangen.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht nur indem Du in Assembler die Rücksprungadresse manipulierst,
aber das ist selten eine gute Idee.

Beschreib einmalwarum Du das benötigst, dann findet sich möglicherweise 
eine andere Lösung.

Autor: Matthias Laubnitz (mcl024)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn in einer bestimmten Zeit kein Interrupt ausgelöt wurde soll etwas 
passieren. Wird aber doch ein Interrupt ausgelöst soll er natürlich nach 
beendigung des Interrupts sofort aufhören in der delay funktion rum 
zutrödeln.
Wenn das mit dem Stack schlecht ist dann muss es doch noch ne andere 
Lösung geben.

Autor: Klugscheisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wird aber doch ein Interrupt ausgelöst soll er natürlich nach
>beendigung des Interrupts sofort aufhören in der delay funktion rum
>zutrödeln.

Da ist genau der Knackpunkt. Ein Delay wird ja nur angewendet, weil es 
nötig ist. Ein Delay wiederrum, das abgebrochen werden kann, weil ein 
Interrupt auftritt deutet auf einen Designfehler hin. Oder darauf, das 
Du im Programm sonst nicht weisst was Du machen sollst. ;-)

Schreib doch mal wozu das Delay da ist?

Autor: Klugscheisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, tschuldigung, ich habe den ersten Teil der Antwort nicht richtig 
gelesen.

Das Delay ist also da, zu warten "ob" was passiert. Richtig? Das machst 
Du dann aber am besten nicht mit einem Delay sondern mit einem Timer. 
Wenn der Timer abgelaufen ist, ohne das ein Interrupt kam, dann 
"passiert was". Falls der Timer noch nicht abgelaufen war, als der 
Interrupt kam, dann den Timer anhalten.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was isn mit Longjumps?

Autor: Matthias Laubnitz (mcl024)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja du hast mich anscheinend richtig verstanden. Das mit dem Timer werde 
ich mal ausprobieren. Hört sich gut.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde das wohl so lösen:
volatile char flag;
unsigned int i;

/* Und dann in der Schleife */
flag = 1; i = 1000;

while(flag && i) i--;

if (i)     /* Interrupt ausgelöst */;
      else /* Interrupt nicht ausgelöst */;

flag wird in der Interruptroutine auf 0 gesetzt (deshalb volatile). Der 
Wert von 1000 ist natürlich nur ein Beispiel.

Autor: Klugscheisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Detlev T: Mach es lieber nicht so.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias Lobitz (mcl024)

>Wenn das mit dem Stack schlecht ist dann muss es doch noch ne andere
>Lösung geben.

Gibt es, Multitasking und Timer

MFG
Falk

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ist es richtig:
> Ein Delay ... deutet auf einen Designfehler hin.
Dieses Zitat ist zwar etwas zusammengestückelt und aus dem Zusammehang 
gerissen, gewinnt dadurch aber an Anschaulichkeit.

Ein Delay gibt es in meinen Programmen bestenfalls im us-Bereich, bei 
Zugriffen auf Hardware (z.B. LCD...). Wozu sollte ich einen uC kaufen, 
ihn mit Strom und einem Takt versorgen und ihn dann NICHTS tun lassen? 
Dann könnte ich ihn ja gleich schlafen legen... ;-)

Mach eine Hauptschleife, die immer mit Vollgas durchlaufen wird. Und in 
dieser Hauptschleife wird immer nur geschaut, ob was zu tun ist.

Bestenfalls für Designstudien und die Quick-And-Dirty Methode taucht 
dann schon mal ein delay_ms() auf.

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.