Hallo, ich habe hier gerade ein dringendes Problem. Ich habe eine Timer0 Routine, die ausgelöst werden soll, wenn der INT0-Interrupt ausgelöst wurde. Kurz: Wenn an INT0 ein Taster gedrückt wurde, soll der Timer0 gestartet werden und bei einem CompareMatch den Timer0-Interrupt auslösen, der dann etwas tut. Ist er damit fertig, soll der Timer0 wieder abgeschaltet werden. Der Timer0 für sich funktioniert einwandfrei. Er startet, verrichtet über den Interruptservice seinen Dienst und stellt sich nachdem wieder ab. Ausgelöst durch ISR (INT0_vect) hingegen zählt er sein Compareregister (im Debugger gesehen) hoch, löst aber offenbar seinen Interruptservice nicht aus. Hat einer von Euch da eine Idee? Mit Gruß Mike
Mike schrieb: > Wenn an INT0 ein Taster gedrückt wurde Taster prellen und erzeugen 1...sehr viele Pulse.
DEN INT0 gibts sowieso nicht, jede µC Serie hat gerade bei INTs ihre Eigenheiten, da müsste man schon wissen um welchen Proz. es geht.
Alleine schon die Angabe der Prozessorfamilie könnte das Rätselraten deutlich einschränken.
Wenn es um AVR geht, so musst du in deinem ersten Interrupt mittels "sei()" die Interrupts freischalten. Vergiss aber nicht, deinen Taster zu entprellen, oder andere Maßnahmen dafür vorzunehmen. Gruß, Yaro
Yaro schrieb: > Wenn es um AVR geht, so musst du in deinem ersten Interrupt mittels > "sei()" die Interrupts freischalten. das ist unnötig, wenn die INT0_ISR nur den Timer startet und dann beendet ist so wird auch der Timer-Int ausgelöst. > Vergiss aber nicht, deinen Taster zu entprellen, oder andere Maßnahmen > dafür vorzunehmen. da liegt schon eher das Problem, wobei der ausgelöste Timer-Int ja nicht verloren geht - warten wir mal auf den Code ... Sascha
Hallo, vielen Dank für die vielen Hinweise. Ich muss wohl etwas konkreter werden. Den Code selbst kann ich hier leider nicht posten und er müsste auch aus zahlreichen Dateien zusammen geschustert werden. uC: Atmega32 Den INT0 Interrupt gibt es wohl schon eindeutig. Hat ja auch einen eigenen ISR :). Die Taste ist entprellt über einen Kondensator (100nF) und der INT0 soll nur auf eine fallende Flanke reagieren. Das Schaltverhalten sieht auf dem Oszi sehr sauber aus. Wie ich nun gelesen habe kann es wohl daran liegen, dass ich aus einem Interrupthandler einen anderen aktiviere (also in ISR wird Timer0 gestartet und es soll über ISR (TIMER0xxxx) etwas gemacht werden). Solange ich den ersten nicht verlassen habe, wird der zweite seine ISR-Routine nicht aufrufen können, da der Interrupt gesperrt wird. Gibt es da vielleicht noch andere Möglichkeiten oder Triks? Sonst müsste ich eine etwas umständlichere Routine als Dauerschleife implementieren. Gruß Mike
Mike schrieb: > Hallo, > > vielen Dank für die vielen Hinweise. Ich muss wohl etwas konkreter > werden. Den Code selbst kann ich hier leider nicht posten und er müsste > auch aus zahlreichen Dateien zusammen geschustert werden. Dann mach das. Es wird dir helfen deine Gedanken zu ordnen und es wird uns helfen dir die Fehler zu zeigen. Zuma ja wohl die von dir beschriebene Funktionalität von weiter oben sich in maximal ein einhalb Bildschirmseiten Code auch neu (nur so zum Testen) schreiben lässt. > Solange ich den ersten nicht verlassen habe, wird der zweite seine > ISR-Routine nicht aufrufen können, da der Interrupt gesperrt wird. Ähm. In einer ISR wird nicht gewartet. Auf nichts und niemanden! Und ich sehe in deiner Aufgabenbeschreibung ehrlich gesagt auch nicht, warum das notwendig sein sollte. > Sonst müsste ich eine etwas umständlichere Routine als Dauerschleife > implementieren. Was hat eine Dauerschleife damit zu tun? Die eine ISR konfiguriert und startet einen Timer Der Timer stellt sich selber wieder ab. Wo ist da eine Schleife notwendig?
Mike schrieb: > Solange ich den ersten nicht verlassen habe, wird der zweite seine > ISR-Routine nicht aufrufen können, da der Interrupt gesperrt wird. Also spätestens hier solltest du mal deinen Code rausrücken, denn da scheint was falsch umgesetzt zu sein. Wenn ein Interrupt läuft, kann kein zweiter aktiv werden, das stimmt - dieser würde direkt nach dem Verlassen der einen ISR aufgerufen werden. Aber was hast du da programmiert? In wie fern wartet dein Taster-Interrupt auf den Timer-Interrupt? Da stimmt doch was nicht.
LuXXuS 909 schrieb: > Wenn ein Interrupt läuft, kann > kein zweiter aktiv werden, das stimmt - Ich wage es bei dieser Frage ja kaum zu schreiben, aber können kann der zweite Interrupt schon, wenn man ihn freigibt. @ Mike: NEIN, DAS WILLST DU NICHT !!! Zeig lieber deinen Code, das bringt dir mehr. Oliver
@ Mike (Gast) >Die Taste ist entprellt über einen Kondensator (100nF) Dass allein reicht nicht. Fehlt mindestens ein Widerstand, siehe Entprellung. >und der INT0 soll >nur auf eine fallende Flanke reagieren. Das Schaltverhalten sieht auf >dem Oszi sehr sauber aus. >Wie ich nun gelesen habe kann es wohl daran liegen, dass ich aus einem >Interrupthandler einen anderen aktiviere (also in ISR wird Timer0 >gestartet und es soll über ISR (TIMER0xxxx) etwas gemacht werden). >Solange ich den ersten nicht verlassen habe, wird der zweite seine >ISR-Routine nicht aufrufen können, da der Interrupt gesperrt wird. Ja, siehe Interrupt. >Gibt es da vielleicht noch andere Möglichkeiten oder Triks? Tricks brauchst es hier sicher wenige, dafür mehr solide Grundlagen und Konzepte. Siehe oben. MFG Falk
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.