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
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
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?
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.
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
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.
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
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.
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
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
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.
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.
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.
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
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
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