Forum: Mikrocontroller und Digitale Elektronik Interrupt 2x ausführen ohne RETI nicht möglich?


von retnox (Gast)


Lesenswert?

Hallo!

Ich habe folgendes Problem:

Mein Programm läuft ganz normal,dann wenn ich meinen Interrupt 1 
'drücke' also ausführe,führt der den Interrupt aus aber mit einer 
Änderung: Ich springe nicht mit dem RETI aus dem Interrupt 
heraus,sondern ein befehl davor mit einem LJMP (muss ich in meinem 
Programm).
Nun wenn ich ihn dann ein zweites mal aufrufen will,klappt das nicht,ich 
kann so oft den Taster für den Interrupt drücken wie ich will der 
springt nicht in die ISR rein,hab auch schon versucht am anfang nach dem 
LJMP des interrupts das Flag zu löschen (CLR IE1) doch ohne erfolg.. 
Kann mir da jemand helfen?

Das ganze wird übrigens in der 8051-Ebene programmiert.

MfG

retnox

von Spess53 (Gast)


Lesenswert?

Hi

>Ich springe nicht mit dem RETI aus dem Interrupt
>heraus,sonern ein befehl davor mit einem LJMP (muss ich in meinem
>Programm).

Nein, musst du nicht, wenn du es es richtig machst.

MfG Spess

von retnox (Gast)


Lesenswert?

doch muss ich. Da er an einer bestimmten Stelle da weitermachen muss und 
der Interrupt unabhängig vom Programmablauf betätigt werden kann ;-)

von Ein Gast (Gast)


Lesenswert?

retnox schrieb:
> Ich springe nicht mit dem RETI aus dem Interrupt

Und gibst du den Interrupt danach wieder frei?
An deinen Stackpointer und das Statusregister hast du gedacht?

von Thomas E. (thomase)


Lesenswert?

retnox schrieb:
> Ich springe nicht mit dem RETI aus dem Interrupt
> heraus,sondern ein befehl davor mit einem LJMP (muss ich in meinem
> Programm).
Da machst du aber irgendwas völlig falsch.

retnox schrieb:
> Kann mir da jemand helfen?
Interrupts beendet man ohne Diskussion mit RETI.

retnox schrieb:
> doch muss ich.
Dann ist dein Programm absoluter Müll.

retnox schrieb:
> der Interrupt unabhängig vom Programmablauf betätigt werden kann
Das ist ja auch der Sinn eines Interrupts.

mfg.

von Cyblord -. (cyblord)


Lesenswert?

retnox schrieb im Beitrag #2908465:
> Ganz Ehrlich Thomas Eckmann,mit welcher Lebenseinstellung lebst du
> eigentlich? Hast du es in deinem Leben irgendwie vermurkst oder was soll
> das 'niedere' Geschwätz,dass du von dir abgibst?
>
> @Gast
>
> Ich hab ja oben stehen,dass ich das Interrupt-Flag wieder lösche..oder
> wie gebe ich den denn frei und wo?
>
> Mir ist bewusst das ich mein Interrupt immer mit einem RETI  beende,nun
> muss ich aber das hier eben anders machen,Müll hin oder her!

Das Problem ist eben auch der Stack. Manuell aus einem Unterprogramm 
oder Interrupt springen, kann den Stack unsauber hinterlassen. Wenn das 
Unterprogramm Variablen auf den Stack schiebt, müssen die vor dem 
Rücksprung wieder runter.

Ich weiß nicht wies beim 8051 ist, aber gibt es dort nicht auch ein 
globabes Interrupt-Enable Bit welches gelöscht wird beim Eintritt in die 
ISR? Das wäre ja dann nicht Interrupt-Flag.

gruß cyblord

von Klaus D. (kolisson)


Lesenswert?

retnox schrieb im Beitrag #2908465:
> Ganz Ehrlich Thomas Eckmann,mit welcher Lebenseinstellung lebst du
> eigentlich? Hast du es in deinem Leben irgendwie vermurkst oder was soll
> das 'niedere' Geschwätz,dass du von dir abgibst?

Na sowas... da hast du keine Ahnung von Ints und beschimpfst hier die 
Leute.
Ich schlage mal vor: "Lies dich in das Thema ein"

K.

von Peter D. (peda)


Lesenswert?

retnox schrieb im Beitrag #2908465:
> nun
> muss ich aber das hier eben anders machen,Müll hin oder her!

Wenn man sowas wirklich machen müßte, dann würden auch erfahrene 
Programmierer sowas anwenden. Da sie es aber nicht tun, gibt es auch 
keine Anwendung, wo es nötig wäre. Nur Anfänger denken, daß sie es 
müßten.

Der 8051 wehrt sich sogar recht stark gegen solchen Müll. Dessen 
Interruptlogik hat interne Flags, die mit voller Absicht nicht 
zugreifbar sind.

Es gibt natürlich einen Trick, es doch zu erreichen. Da ich aber nicht 
später von Dir verflucht werden will, weil ich daran schuld wäre, daß Du 
Dich in eine Programmier-Sackgasse manövriert hast, werde ich ihn nicht 
nennen.


Peter

von Steffen H. (avrsteffen)


Lesenswert?

Peter Dannegger schrieb:
> Es gibt natürlich einen Trick, es doch zu erreichen. Da ich aber nicht
> später von Dir verflucht werden will, weil ich daran schuld wäre, daß Du
> Dich in eine Programmier-Sackgasse manövriert hast, werde ich ihn nicht
> nennen.
Das machst du richtig so. 'rednox' braucht keine Hilfe im programmieren 
sonder in 'BENEHMEN'.

Das ist aber leider eine andere Page.

von Reinhard Kern (Gast)


Lesenswert?

retnox schrieb im Beitrag #2908475:
> Arroganter Idiot,sowas wie du gehört direkt verbrannt!

Jetzt haben wir hier nicht nur shit storms, sondern gleich einen kill 
storm... es gibt wohl keine untere Grenze für menschliches Benehmen.

Ich bitte alle, nicht mehr auf die Frage zu antworten, oder einen Mod, 
gleich dichtzumachen, rednox' Verhalten ist absolut unzumutbar.

Gruss Reinhard

von Jobst M. (jobstens-de)


Lesenswert?

retnox schrieb im Beitrag #2908465:
> Ganz Ehrlich Thomas Eckmann,mit welcher Lebenseinstellung lebst du
> eigentlich? Hast du es in deinem Leben irgendwie vermurkst oder was soll
> das 'niedere' Geschwätz,dass du von dir abgibst?

Kann Dir eigentlich egal sein. Auch wenn ich dem was er schreibt, nicht 
immer zustimmen kann: Hier hat er absolut Recht und das 'niedere 
Geschwätz' ist das, was Dich zu der Lösung Deiner Probleme bringt - wenn 
Du es denn eingesehen hast.

Wenn Du meinst, es muß anders gemacht werden, ist Dein Konzept Müll.

Es gibt einen Weg, vermutlich der den PeDa auch meint, mit dem dies 
möglich ist. Aber auch das ist keine saubere Lösung und eine Falle für 
viele weitere Probleme. Und solltest Du nicht selber darauf kommen, bist 
Du noch lange nicht so weit, es auch einzusetzen. Ausserdem sollte man 
sie vermeiden, solange es möglich ist.

Aber vielleicht schilderst Du uns auch einfach mal Dein gesamtes 
Problem, denn vermutlich gibt es eine ganz andere Lösung dafür.


Gruß

Jobst

von Genervter (Gast)


Lesenswert?

Bei einem Interrupt "notiert" sich der MC die Programmadresse, bei der 
er nach dem Interrupt weitermachen soll. Zum Notieren gibt es einen 
winzigen Notizzettel namens Stack. Verlässt man den Interrupt 
ordnungsgemäß mit RETI, wird diese Notiz wieder wegradiert. Da du das 
nicht so machst, hinterlässt du einen Stack voll mit Adressmüll. Der 
Stack läuft dir also irgendwann über und andere Routinen holen sich ggf 
falsche Informationen vom Stack ab.

Ich hoffe du hast das Problem jetzt kapiert.

von Matthias (Gast)


Lesenswert?

Du kannst die Rücksprung-Addresse auf dem Stack patchen und dann 
trotzdem mit RETI zurueckkehren. Wenn du mit einem JMP aus der ISR 
springst bist du immer noch im Interrupt-Kontext. Da gibts auch nichts 
dran zu ruetteln.
Aber wie dir ja schon geschrieben wurde: Wenn du so etwas tun "musst" 
machst du ziemlich sicher irgendetwas falsch.

von Karl H. (kbuchegg)


Lesenswert?

Matthias schrieb:

> Aber wie dir ja schon geschrieben wurde: Wenn du so etwas tun "musst"
> machst du ziemlich sicher irgendetwas falsch.

Nicht nur 'ziemlich sicher'.
'Garantiert' ist das bessere Wort.

Denn das die ISR hinter sich aufräumen muss, ist ja nur die Hälfte (eher 
sogar noch weniger) der Geschichte. Der Interrupt hat ja einen anderen 
Programmteil unterbrochen, in dem gerade eine Aktion gelaufen ist. Die 
kann man aber im Normalfall nicht einfach abwürgen! Auch die muss 
geordnet beendet werden, damit sie nicht einen Saustall in der 
Datenbasis und am Stack hinterlässt.


-> Das ist Murx!
Und zwar ganz großer Murx!

"Hinter mir die Sintflut" und "Was kümmert mich die Umgebung" 
funktioniert am Fussballplatz aber nicht in der Programmierung. Ohne 
Selbstdisziplin und Einhalten von Regeln kommt man da nicht weit. Und 
dann passiert es dann eben, das nichts mehr geht und man die Profis um 
Hilfe bitten muss, die dann erst mal die Hände über dem Kopf 
zusammenschlagen.

von Bronco (Gast)


Lesenswert?

Wen's interessiert:
Beim MSP430 bestimmt ein Flag im StatusRegister, das bestimmt, ob die 
CPU schläft oder nicht.
Wenn man schlafen geht und ein Interrupt kommt, wird das StatusRegister 
mit diesem Flag (im Schlafmodus) auf den Stack gesichert, die ISR 
ausgeführt und dann das StatusRegister zurückgeschrieben.
Wenn die CPU durch den Interrupt wachgehalten werden soll, muß der 
StatusRegister-Inhalt auf dem Stack gepatcht werden, damit beim 
Zurückschreiben das Flag im Wachmodus ist.

Ich hab mich seinerzeit ziemlich gewundert, daß dies ein vom Hersteller 
angestrebtes Vorgehen sein soll, aber TI hat es so vorgeschrieben.

Spätere Versionen des IAR-Compilers haben eine Instrinsic-Funktion für 
diesen Zweck, aber meine uralte Version damals hatte das noch nicht und 
ich mußte die korrekte Stack-Adresse selber ausrechnen :-O

von Peter D. (peda)


Lesenswert?

Interrupts sind schon ein mächtiges Werkzeug, wenn man sie mit Sinn und 
Verstand einsetzt.
Tut man das nicht, dann bestraft einen die CPU umgehend mit 
Nichtfunktionieren. Die CPU kennt da kein Erbarmen, auch nicht für 
Anfänger.

Sie sind so konzipiert, daß sie die unterbrochenen Tasks und den 
CPU-Status nicht zerstören. Ansonsten hießen sie ja nicht Interrupt, 
sondern Programmabsturz, Totalausfall, Blue-Screen oder ähnliches.


Peter

von Reinhard Kern (Gast)


Lesenswert?

Peter Dannegger schrieb:
> nicht zerstören. Ansonsten hießen sie ja nicht Interrupt

Der Begriff Interrupt sagt überhaupt nichts über Erfolg und Weitermachen 
aus - siehe coitus interruptus.

Gruss Reinhard

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.