Hallo zusammen!!! Ich hoffe mal, dass sich hier jemand mit meiner Problematik auskennt und mir vielleicht den einen oder anderen Tip geben kann, weil ich schon fast am verzweifeln bin. Bei einem C-Programm (C30 Compiler von Microchip) für PIC24FJ32GA004 spinnt noch ganz gewaltig etwas. Jedoch denke ich, dass ich jetzt das Problem gefunden habe, bin mir aber nicht ganz sicher! 1.) Frage: In einem zeitkritischen Programmteil muss ich für kurze Zeit alle Interrupts ausschalten. Also setze ich alle InterruptEnable Bits der verwendeten Hardwarekomponenten auf 0. Nach dem zeitkritischen Programmteil kann ich sie wieder zulassen und Enable die Interrupts wieder. Meine Frage ist nun, was passiert, wenn während der Zeit, in welcher die Interrupts gesperrt sind eigentlich ein Interrupt ausgelöst werden müsste. Wird dieser dann "pending" und wird nach dem Enablen dann ausgeführt oder wird dieser komplett "verschluckt"??? Meine Vermutung ist, dass er wohl verschluckt wird und einfach nie ausgeführt wird. Erst beim nächsten Interruptevent dieser Hardwarekomponente wird der Interrupt dann wieder ausgeführt. Leider habe ich bei Microchip auch nach stundenlangem Durchsuchen der Datenblätter zu diesem Verhalten nichts gefunden. 2.) Frage: Wenn meine Vermutung richtig ist, wie kann ich dies anstellen, dass die Interrupts kurzzeitig den Programmablauf nicht unterbrechen dürfen, jedoch nicht vergessen werden sollten? Würde mir in meiner Studienarbeit echt wahnsinnig weiterhelfen, wenn mir hier jemand einen Tip geben würde... MfG Flo
>Wird dieser dann "pending" und wird nach dem Enablen dann >ausgeführt oder wird dieser komplett "verschluckt"??? Meine Vermutung >ist, dass er wohl verschluckt wird und einfach nie ausgeführt wird. In der Regel wird er pending weil die Hardwareflags gesetzt bleiben und erst nach Aufruf des Interrupts oder löschen des Flags entsorgt wird. Bei deinem PIC weiss ichs jetzt aber nicht.
Ja, das dachte ich am Anfang ja auch, wegen dem hab ich das Problem ja auf diese Weise gelöst. Vielleicht ist es auch so. Aber kann es nicht sein, dass der Interrupt nur bei der Flanke des Interrupt-Flags ausgelöst wird? Aber es gibt ja beim PIC24 auch noch die Pending-Register, oder???. Eben, wie schon gesagt, der genaue Ablauf konnte ich bisher nicht klären... ;-( Aber dies wäre für mich noch die einzig plausible Erklärung weshalb mein Programm nicht funktioniert...
> Meine Frage ist nun, was passiert, wenn während der Zeit, in > welcher die Interrupts gesperrt sind eigentlich ein Interrupt ausgelöst > werden müsste. Das Interrupt-Flag wird gesetzt aber da das zugehörige Enable-Flag nicht gesetzt ist, wird die ISR nicht ausgeführt. Sobald das Enable-Flag gesetzt wird, erfolgt auch direkt die Ausführung der ISR. > wie kann ich dies anstellen, dass die > Interrupts kurzzeitig den Programmablauf nicht unterbrechen dürfen, > jedoch nicht vergessen werden sollten? Sie werden nicht vergessen. Kann es sein, dass die Phase, in der die Interrupts abgeschaltet sind so lang ist, dass mehrere gleichartige Interrupt-Auslöser auftreten? Dann gehen diese Ereignisse natürlich verloren, denn das IFS ist ja bereits gesetzt. > Aber kann es nicht > sein, dass der Interrupt nur bei der Flanke des Interrupt-Flags > ausgelöst wird? Hö? Interrup-Flag-Flanken? Sowas gibts??? > Aber es gibt ja beim PIC24 auch noch die > Pending-Register, oder???. Meinst Du vielleicht eher die Interrupt-Priority-Register? Ja, die gibts auch. > Aber dies wäre für mich noch die > einzig plausible Erklärung weshalb mein Programm nicht funktioniert... Das Interrupt-Handling bei den PIC24 ist recht flexibel und daher auch komplex. Da kann man einiges falsch machen. Ohne Code zu sehen kommen wir hier wohl nicht weiter. gruß daniel
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.