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
doch muss ich. Da er an einer bestimmten Stelle da weitermachen muss und der Interrupt unabhängig vom Programmablauf betätigt werden kann ;-)
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
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.