Forum: Mikrocontroller und Digitale Elektronik dsPIC33F: Interrupt Change Notification wird nicht ausgelöst


von Andreas T. (Gast)


Lesenswert?

Hallo!

Ich arbeite mit dem µC dsPIC33FJ256GP710 und dem Explorer 16 Board. Ich 
habe ein Problem mit dem Interrupt, der bei einem Pegelwechsel an einem 
digitalen I/O-Eingang, ausgelöst werden soll.

Mein Code sieht so aus:
1
#include "p33FJ256GP710.h"
2
3
_FOSCSEL(FNOSC_PRIPLL);
4
_FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT);
5
_FWDT(FWDTEN_OFF);
6
7
void configure_CN(void);
8
void __attribute__ ((__interrupt__)) _CNInterrupt(void);
9
10
int counter;
11
12
int main ( void )
13
{
14
15
16
 // Frequenz einstellen
17
 PLLFBD = 0x0026;
18
 CLKDIV = 0x0000;
19
20
21
 // RF5 als Digitaler Input
22
 TRISFbits.TRISF5 = 1; 
23
24
 // RD4 als Digitaler Input
25
 TRISDbits.TRISD4 = 1; 
26
  
27
 // RB3 als digitaler Output
28
 TRISBbits.TRISB3 = 0;
29
30
 // RB3 auf low-Pegel
31
 LATBbits.LATB3 =0 ;
32
33
 // Interrupts configurieren
34
 configure_CN();
35
36
 // Zähler auf Null
37
 counter = 0;
38
        
39
 while(1);
40
}
41
42
void configure_CN(void)
43
{
44
 CNEN2bits.CN18IE = 1; // Enable CN18 pin for interrupt detection
45
 CNEN1bits.CN13IE = 1; // Enable CN3 pin for interrupt detection
46
47
 IEC1bits.CNIE = 1; // Enable CN interrupts
48
 IFS1bits.CNIF = 0; // Reset CN interrupt
49
}
50
51
void __attribute__ ((interrupt, no_auto_psv)) _CNInterrupt(void)
52
{
53
  
54
 //  RB3 auf high-Pegel
55
 LATBbits.LATB3 = 1;
56
  
57
 // Clear CN interrupt
58
 IFS1bits.CNIF = 0; 
59
60
 counter++;
61
62
 //  RB3 auf low-Pegel
63
 LATBbits.LATB3 =0 ;
64
  
65
}

Das Programm soll bei einem Pegelwechsel an den Pins RF5 und RD4 einen 
Interrupt auslösen und die zugehörige Routine ausführen. In dieser wird 
dann ein Counter hochgezählt und der Pin RB3 auf high und dann wieder 
auf low gesetzt.

Leider wird der Interrupt nur bei einem Pegelwechsel an RF5 ausgeführt. 
Bei entsprechneden Signalen an RD4 passiert nichts. Ich habe auch schon 
andere Pins ausprobiert, aber ohne Erfolg.

Ich habe die Interrupt Detection für RF5 ausgeschaltet und nur RD4 
ausprobiert. Das zeigte auch keinen Erfolg. Ein Problem an der Hardware 
konnte ich nicht festellen. Es sei denn, alle getesteten Pins sind 
defekt bis auf RF5 :-)

Vielleich (hoffentlich) habe ich einen groben Denkfehler.
Vielen Dank schon mal für die Hilfe. Ich komme hier im Moment echt nicht 
weiter. Danke!

von (prx) A. K. (prx)


Lesenswert?

Pins auf "digital" gestellt? Ich hab grad nicht parat bei welchen PICs 
das war, aber da sind welche, deren Analogeingänge abgeschaltet werden 
müssen um digital nutzbar zu sein.

von Andreas T. (Gast)


Lesenswert?

Danke für die schnelle Antwort. Es ist richtig, dass der µC Pins hat, 
die auf "digital" gestellt werden müssen. Ich habe allerdings nur Pins 
verwendet, die keine analoge Funktionalität haben. Diese Pins müssen 
nicht auf "digital" gestellt werden, wenn ich das richtig sehe.
So wie der Pin RF5. Mit diesem funktioniert ja mein Code.

Eine Frage habe ich noch zu meinem Code. Es ist doch prinzipiell 
richtig, dass ich für mehrere Pins gleichzeitig den Change Notification 
Interrupt aktivieren kann und diese dann die selbe ISR ausführen, oder?
Mit meinem aktuellen Problem hat das aber nichts zu tun, denke ich.

von C. H. (_ch_)


Lesenswert?

Matthias H. wrote:
> Eine Frage habe ich noch zu meinem Code. Es ist doch prinzipiell
> richtig, dass ich für mehrere Pins gleichzeitig den Change Notification
> Interrupt aktivieren kann und diese dann die selbe ISR ausführen, oder?
ja
> Mit meinem aktuellen Problem hat das aber nichts zu tun, denke ich.
denke ich auch

Schon mal versucht die Interrupt-Prio zu erhöhen?

Gruß
Christian

von Andreas T. (Gast)


Lesenswert?

Das habe ich noch nicht versucht. Werde ich aussprobieren. Danke!

Ich würde mich aber wundern, wenn es daran läge, schließlich 
funktioniert es ja für den einen Pin.

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.