Hallo, ich möchte bei einem dsPIC33 einen Interrupt auslösen, wenn sich das Signal an einem von zwei digitalen Eingangs-Pins ändert. Denke, dass da dann der "PortB-Interrupt" der richtige für mich ist.. dass neben RB4 und RB5 gleichzeitig auch noch RB6 und RB7 abgefragt werden ist kein Problem für mich. Leider verstehe ich, trotz Datenblatt und Codebeispielen, nicht genau wie ich das in C umsetzen muss.. Wäre für etwas Hilfestellung, welche Bits ich für mein Vorhaben setzen muss, sehr dankbar!
Also mir ist einfach nicht klar welchen externen Interrupt (INT0, INT2...) ich dafür wählen muss..
Also die INTn Interrupt reagieren nur auf einen bestimmten Flankenwechsel H>L bzw L>H (wobei ich jetzt nicht weiss ob die beim dsPIC33 frei wählbar sind). Wenn du die INTn Interrupt verwendest musst die die dazugehörigen Portleitungen auf Input und Digital umstellen. Zuständig dafür sind die jeweiligen TRISx und ANSELx Register. "x" steht für den Port an welchen die INTn hängen. Möglich wäre noch der CN-Interrupt (Input change interrupt) welcher auf jede Flanke anspricht. Dazu muss zu den oben genannten Registern auch noch das entsprechende CNENx Register für "Change notification enable" angepasst werden. Weiters muss der Interrupt freigeschaltet werden, eine Priorität zugewiesen werden und das Event-Flag gelöscht werden. Für den CN-Interrupt ist das folgende Register u. Bits: IFS1<3>, IEC1<3> und IPC4.<14:12>. Und dann die Interruptroutine selbst natürlich, Anleitung dafür im Compiler-Manual.
Vielen Dank für die schelle Antwort.. [c] CNEN1 = 0b0000000000110000; IPC4bits.CNIP = 3; IFS1bits.CNIF = 0; IEC1bits.CNIE = 1; void __attribute__((interrupt, no_auto_psv)) _CNEN1Interrupt( void ){ //Interrupt IFS1bits.CNIF = 0; } [c] Das ist jetzt mal mein Versuch, der aber leider noch nicht richtig funktioniert. RB4 und 5 sind im TRISB-Register als Eingang konfiguriert. Es handelt sich bei beiden Pins nicht um analoge Eingangspins (AN0 - AN12). Sehe ich das richtig, dass ich dann auf das ANSEL-Register verzichten kann? Das CNEN1 Register habe ich so verstanden, dass ich da die Eingangspins, die auf eine Wertänderung überprüft werden sollen, festlege. Leider wird aber bei einer Wertänderung kein Interrupt ausgelöst. Beim Kompilieren erscheint die Warnung: Invalid interrupt vector names for device '33FJ128GP802' are: _CNEN1Interrupt Heisst das, dass mein Controller dieser Art von Interrupt nicht unterstützt?
Naja der Controller kennt den Interrupt sicher, aber vermutlich stimmt mit der Schreibweise etwas nicht. Kann jetzt auch nichts genaues sagen da ich hier keinen XC16 o.ä. installliert habe. Ich würde mal in den .inc, .h Files des 33FJ128GP802 nachsehen welche Schreibweise gewünscht ist.
Habe den Fehler gefunden.. waren die falschen Ausgangs-Pins. Ich habe übersehen, dass die CN-Pins nicht wie die RB-Pins nummeriert sind. Als Interrupt habe ich jetzt: void _ISR _CNInterrupt(void){ }
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.