Forum: Mikrocontroller und Digitale Elektronik PIC32MX Interrupt handling


von Michael S. (mistreit)


Lesenswert?

Hallo,

ich habe schon viele Projekte erfolgreich auf dem PIC16 und PIC18 hinter 
mir. Sowohl in Assembler, als auch in C (XC8) bin ich gut damit klar 
gekommen.
Nun möchte ich auf PIC32 umsteigen und gehe mein erstes Projekt mir 
einem PIC32MX130F256B an (XC32 V1.42)
Jetzt verzweifel ich an einer im Grunde primitiven Sache, wo ich schon 
seit vielen Stunden am Suchen und Forschen bin und einfach nicht mehr 
weiter weiss:
Timer1 läuft und soll beim Erreichen eines bestimmten Wertes einen 
Interrupt auslösen. In der ISR soll dann eine LED getoggelt werden.
Das mit dem Timer funktioniert auch, aber er will einfach nicht die ISR 
aufrufen.
Das ist sowohl im Simulator, als auch auf der Zielhardware so.
Auffällig ist, dass, wenn ich in die Datei list.lst auch zu sehen ist, 
dass die ISR nicht compiliert wurde also in Assembler-Code umgesetzt 
wurde.

Hier mein Source-Code:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <xc.h>
#include "config32MX130F256B.h"
#include "PIC32MX130_Test_V101.h"
#include <sys/attribs.h>


void __ISR_AT_VECTOR(_TIMER_1_VECTOR, IPL7AUTO) Timer1Handler(void);


void main(void)
{
// init PIC
    init();
    LED=0;

    TMR1    =   0;
    PR1     =   0x0008;
    T1CONbits.TCKPS = 1;        // Prescaler auf 1:64
    T1CONbits.ON = 1;           // Timer1 ON


    INTCON = 0;
    INTCONbits.MVEC = 1; //Multivector mode: 1 = multi, 0 = single 
vector
    IFS0bits.T1IF = 0;  //Flag auf 0 setzen
    IPC1bits.T1IP = 7;  //Priority setzen
    IPC1bits.T1IS = 0;  //Subpriority auf 0
    IEC0bits.T1IE = 1;   // enable timer 1 IRQ

    __builtin_enable_interrupts();


    while(1)
    {
////////// Timer Test
////////        if ( IFS0bits.T1IF==1)
////////        {
////////            LED = !LED;
////////            IFS0bits.T1IF=0;
////////        }
    }


void __ISR_AT_VECTOR(_TIMER_1_VECTOR, IPL7AUTO) Timer1Handler(void)
CoreTimerHandler(void)
    {
        LED = !LED; //LED in ISR toggeln
        IFS0bits.T1IF = 0;
    }
}

Es kann doch nicht so schwer sein.
Irgendeiner eine Idee was ich da falsch mache?
Mir wäre auch schon geholfen, wenn mir jemand mal seine Sources eines 
funktionierenden Iinterupts schickt, was ich mir im Simulator anschauen 
kann.

von Jim M. (turboj)


Lesenswert?

Michael S. schrieb:
> Es kann doch nicht so schwer sein.
> Irgendeiner eine Idee was ich da falsch mache?

Beim geposteten Code ist die Timer Fuktion innerhalb von main(){} - 
versuche das besser außerhalb.

Da sehe ich auch 2 Funktionsnamen hintereinander. Dürfte der Compiler so 
auch nicht verstehen.

von Michael S. (mistreit)


Lesenswert?

Vielen, vielen Dank für die schnelle Antwort!

Oh man, wie blöd kann man sein (nicht falsch verstehen, bezieht sich auf 
mich!!!)! Du hast natürlich vollkommen recht die ISR hat in main nichts 
verloren!
Aber was meinst Du mit 2 Funktionsnamen hintereinander?

von Michael S. (mistreit)


Lesenswert?

Hallo Jim,

ich habe mal weiter probiert.
Jetzt statt __ISR_AT_VECTOR  __ISR verwendet und damit läuft es.
Der Hauptfehler war also das die ISR in der main-Routine. Echt peinlich, 
vor allem wenn man bedenkt, wie viele Stunden ich mit der Suche 
verbracht habe....
Auf jeden Fall noch mal vielen Dank. Jetzt kann ich endlich mit der 
eigentlichen Programmierung anfangen...

Schönen Sonntag Abend!

von 987654 (Gast)


Lesenswert?

Jim M. schrieb:
> Da sehe ich auch 2 Funktionsnamen hintereinander. Dürfte der Compiler so
> auch nicht verstehen.

Das sind nicht 2 Funktionsnamen. `__ISR_AT_VECTOR(v,...)` bzw. 
`__ISR(v,...)` sind Makros, die zu grob zu 
`__attribute__((interrupt,vector(v),nomips16))` expandieren. Sprich: Sie 
machen deine Funktion zu einem interrupt handler.

von Michael S. (mistreit)


Lesenswert?

Ok, danke für die Erklärung!

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.