PIC32MX Interrupt handling

OP #4731912
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.
OP #4731962
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!
Gast #4732538
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren