www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC24 Interrupt-Frage


Autor: Flo H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: Flo H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Zwirbeljupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.