Forum: Mikrocontroller und Digitale Elektronik Interrupt an Port B


von ab2301 (Gast)


Lesenswert?

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!

von ab2301 (Gast)


Lesenswert?

Also mir ist einfach nicht klar welchen externen Interrupt (INT0, 
INT2...) ich dafür wählen muss..

von Chris B. (dekatz)


Lesenswert?

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.

von ab2301 (Gast)


Lesenswert?

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?

von Chris B. (dekatz)


Lesenswert?

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.

von ab2301 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.