Interrupte schachteln ? ATmega128
Hallo Leute,
ich habe ein Programm mit mehreren ISR - Routinen geschrieben.
Eine Routine ist dabei recht lang geworden und wird dazu noch alle 13,33 ms aufgerufen,
(damit meine berechnungen auch regelmäßig gemacht werden PID et. )
Dazu kommen noch sehr kleine Routinen, die Zählerüberlauf signalisieren, einen Incrementalgeber abfragen etc.
Ich habe nun das Problem , dass in der Zeit, in der die Berechnungsroutine bearbeitet wird, keine anderen Interrupte bearbeitet werden können und mir somit z.B. Schritte meines Motors flöten gehen.
Gibt es einen Trick, um innerhalb einer ISR weitere Interrupte zuzulassen ?
vielen dank
olby2
Re: Interrupte schachteln ? ATmega128
Zitat:
Zitat von olby2
... mehreren ISR - Routinen geschrieben ... Eine ... ist dabei recht lang ... wird ... alle 13,33 ms aufgerufen, (... PID et. ) ...
Wenn ich Interrupts plane, dann halte ich die ISR so kurz wie möglich und ich habe auch noch nie nested interrupts benutzt, nicht wissentlich (ja, mal als Pannenfall *gggg*). Da ist schon etwas Gehirnschmalz und auch gelegentlich Experiment angesagt. Ob so eine lange ISR wie Deine sinnvoll ist, wage ich fast zu bezweifeln.
Zitat:
Zitat von olby2
... wird ... alle 13,33 ms aufgerufen ...
Für einen PID ist diese Frequenz sicher nicht allzu schnell - aber da Du schreibst, dass Du noch etliche andere hast, werden das bestimmt nie 13,33 ms, ich vermute, dass das in der Zielumgebung deutlich langsamer und ungleichförmiger wird. Dann stimmt eben auch die ganze Regelung nicht, weil anzunehmen ist (ich gehe bei meinen Planungen jedenfalls für mich immer davon aus), dass die verschiedenen ISR sich gegenseitig stören könnten. Und der digitale Regler hat sowieso ein Zeitglied, weil die Regelung zumindest bei den hier üblicherweise verwendeten Controllern mit einer "alten" Geschwindigkeitserfassung arbeiten muss. Wenn dann das jeweilige Alter schwankt und die Regelfrequenz noch dazu - - oh heiliger Regulus.
Ich habe einen PI-Regler in einer ISR implementiert. Problem: Rechenzeit mit floating point *ggrrrrr* war zwei bis drei Millisekunden . Also habe ich das Ganze in Integer gemacht, ein bisschen popeln, ein bisschen tricksen, ein bisschen mal grob schätzen und die gemessenen Reglerkonstanten hinschummeln, viel testen und - läuft prächtig ! ! weniger als 50 µS bei 20 MHz ... und das regelt zwei ziemlich unterschiedliche Motoren sehr sauber auf Gleichlauf bei gleichen Sollwerten. Regelfrequenz für jeden einzelnen Motor rund 100 Hz, die Motoren werden bei versetzten ISR-Aufrufen bedient, um die ISR nicht zu lange dauern zu lassen.
Wenn Du das mit den nested interrupts realisierst, dann berichte aber bitte über Deine Erfahrungen. Ich lerne gerne dazu.
Viel Erfolg