Forum: Mikrocontroller und Digitale Elektronik PIC32MX350: externer Interrupt funktioniert nicht


von Harstad (Gast)


Lesenswert?

Hi,

ich habe hier ein Problem mit externen Interrupts beim PIC32MX350. Ich 
habe eine Clock-Leitung an D8 und D9 gelegt und verwende INT1 und INT2 - 
zwei Interrupts und zwei Pins deswegen, weil ich sowohl auf die 
steigende als auch die fallende Flanke reagieren will.

Konfiguriert ist das Ganze per MCC. Die Aufrufe meiner Funktionen sind 
in den ISR in ext_int.c eingetragen und die Interrupts werden per
1
EX_INT1_InterruptFlagClear();   
2
EX_INT1_PositiveEdgeSet();
3
EX_INT1_InterruptEnable();
4
EX_INT2_InterruptFlagClear();   
5
EX_INT2_NegativeEdgeSet();
6
EX_INT2_InterruptEnable();

ektiviert. Das Clock-Signal liegt tatsächlich an D8 und D9 an, trotzdem 
wird die Interrupt-Routine nie angesprungen (weder lande ich da per 
Breakpoint noch sehe ich die Funktion, die von der Routine ausgeführt 
werden müsste).

Meine Frage: was könnte ich da noch übersehen haben?

Danke!

von Chris B. (dekatz)


Lesenswert?

RD8 und RD9 sind beim PIC32MX350 standardmäßig gar nicht INT1 und INT2 
zugeordnet. Das muss man selbst per "Peripheral Pin Select" machen.
Oder hat das der MCC gemacht - was ich aber bezweifle.

Bei den dsPIC33 und PIC32 sollte man immer die Device Pin Tables am 
Anfang des DB studieren. Man sieht dort sofort welche Funktionen 
standardmäßig auf welchen Pin zur Verfügung stehen.

: Bearbeitet durch User
von Harstad (Gast)


Lesenswert?

Chris B. schrieb:
> RD8 und RD9 sind beim PIC32MX350 standardmäßig gar nicht INT1 und INT2
> zugeordnet. Das muss man selbst per "Peripheral Pin Select" machen.
> Oder hat das der MCC gemacht - was ich aber bezweifle.

Eigentlich sollte der MCC das schon erledigen, zumindest gibt es dafür 
ja die Pin-Matrix, in der ich INT1 und INT2 einem Pin zuordnen kann.

Im sich ergebenden Code sieht das dann so aus:
1
INT2Rbits.INT2R = 0x0000;   //RD9->EXT_INT:INT2;
2
INT1Rbits.INT1R = 0x0004;   //RD8->EXT_INT:INT1;

Wenn der Kommentar nicht lügt, sollte das doch passen?

von Chris B. (dekatz)


Lesenswert?

Harstad schrieb:

>
1
> INT2Rbits.INT2R = 0x0000;   //RD9->EXT_INT:INT2;
2
> INT1Rbits.INT1R = 0x0004;   //RD8->EXT_INT:INT1;
3
>
>
> Wenn der Kommentar nicht lügt, sollte das doch passen?

Ja das sollte passen.
Was der MCC sonst noch alles generiert kann ich nicht sagen.
Habe es mal auf einem 32MX340 probiert, ohne MCC da in meiner Version 
nicht unterstützt. Ist auch ohne MCC keine Raketentechnik.

Timer aufgesetzt welcher jede Sekunde einen Pin toggelt. Der Pin wurde 
mit dem INT2 Eingang verbunden. Die INT2-Interruptroutine toogelt eine 
LED zur Kontrolle.

Configuration mit:

    // Configure the device for maximum performance
    SYSTEMConfig(GetSystemClock(), SYS_CFG_WAIT_STATES | 
SYS_CFG_PCACHE);
    // Enable multi-vector interrupts
    INTEnableSystemMultiVectoredInt();

Interruptroutine:

// external INT2 interrupt handler
// priority level 2 mit auto context saving
void __ISR(_EXTERNAL_2_VECTOR, IPL2SOFT) Int2Handler(void)
{
    IFS0bits.INT2IF = 0;        //clear Int-flag
    LATFINV = 0x0002;           // Pin RF1 schaltet LED um
}

Initialisierung Interrupt und Port:


    IEC0bits.INT2IE = 0;        //disable
    IFS0bits.INT2IF = 0;        //flag
    IPC2bits.INT2IP = 2;        //priority
    IPC2bits.INT2IS = 1;        //sub priority
    INTCONbits.INT2EP = 1;      //flanke

    IEC0bits.INT2IE = 1;        //enable

    TRISDbits.TRISD9 = 1;       //INT2 Eingang

    AD1PCFG = 0xffff;           //alle DIGITAL

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


Lesenswert?

Harstad schrieb:
> Meine Frage: was könnte ich da noch übersehen haben?

Poste doch alle deine Einstellungen, du hast die Pins bestimmt falsch 
konfiguriert:
1
Initialisierung Interrupt und Port:
2
IEC0bits.INT2IE = 0; //disable
3
IFS0bits.INT2IF = 0; //flag
4
IPC2bits.INT2IP = 2; //priority
5
IPC2bits.INT2IS = 1; //sub priority
6
INTCONbits.INT2EP = 1; //flanke
7
IEC0bits.INT2IE = 1; //enable
8
TRISDbits.TRISD9 = 1; //INT2 Eingang
9
AD1PCFG = 0xffff; //alle DIGITAL

Harstad schrieb:
> gelegt und verwende INT1 und INT2 - zwei Interrupts und zwei Pins
> deswegen, weil ich sowohl auf die steigende als auch die fallende Flanke
> reagieren will

change notification (CN) Interrupt ist da bessere Lösung, reagiert auf 
die steigende und fallende Flanken.

: Bearbeitet durch User
von Harstad (Gast)


Lesenswert?

Ok, so wie es aussieht liegt es bei mir daran, dass die Interrupts zwar 
einzeln, aber nicht global aktiviert waren.

Apropos, das hier finde ich interessant:

Chris B. schrieb:
> void __ISR(_EXTERNAL_2_VECTOR, IPL2SOFT) Int2Handler(void)
> {
>     IFS0bits.INT2IF = 0;        //clear Int-flag
>     LATFINV = 0x0002;           // Pin RF1 schaltet LED um
> }

Der MCC-generierte Code löscht das Int-Flag erst nach dem die ISR 
durchlaufen wurde, du machst es davor. Was ist der Unterschied/Vorteil?

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.