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