Forum: Mikrocontroller und Digitale Elektronik Interrupts beim PIC32


von sr2401 (Gast)


Lesenswert?

Hallo,

vom dsPIC33 kommend, habe ich doch noch die ein oder andere Frage zu den 
Interrupts beim PIC32. Zum Testen möchte ich ein Bit im Timer1-Interrupt 
toggeln. Dazu habe ich meinen Timer wie folgt in der Main konfiguriert:
1
/*Timer 1*/
2
    T1CONbits.ON = 0;               
3
    T1CONbits.TCKPS = 01;           //Prescale 8
4
    PR1 = 1000;         
5
    TMR1 = 0x00;
6
7
    IFS0bits.T1IF = 0;
8
    IPC1bits.T1IP = 5;
9
    IEC0bits.T1IE = 1;
10
11
    T1CONbits.ON = 1;

Die ISR habe ich so aus einem Beispiel von der Microchip Homepage:
1
void __ISR(_TIMER_1_VECTOR, ipl2) Timer1Handler(void){
2
3
        LATBbits.LATB10 = !LATBbits.LATB10;  
4
5
    IFS0bits.T1IF = 0;
6
}

Beim dsPIC haben diese Schritte ausgereicht. Ich vermute, dass ich beim 
PIC32 weitere Bits setzen muss, um Interrupts global zu erlauben. Leider 
ist mir aus dem Datenblatt nicht klar, welche Bits das sind. Vielleicht 
hängt es aber auch mit der Subpriority zusammen. Meine zweite Frage 
bezieht sich direkt auf die ISRs. Gibt es irgendwo eine Zusammenfassung 
wie die ISR für jede einzelne Interrupt-Art lautet? Beim dsPIC habe ich 
die alle im Header-File gefunden.. hier suche ich bis jetzt vergeblich..

Wünsche euch noch einen schönen Sonntag, und schonmal vielen Dank für 
die Unterstützung!!!

von Stefan (Gast)


Lesenswert?

Hier ein Beispiel für
den µC.

void InitTimer1(){
  T1CON   = 0x8000;
  T1IE_bit   = 1;
  T1IF_bit   = 0;
  T1IP0_bit   = 1;
  T1IP1_bit   = 1;
  T1IP2_bit   = 1;
  PR1     = 8000;
  TMR1     = 0;
}

void Timer1Interrupt() iv IVT_TIMER_1 ilevel 7 ics ICS_SRS {
  T1IF_bit   = 0;
  //Enter your code here
}

von sr2401 (Gast)


Lesenswert?

Danke für die schnelle Antwort.. aber leider kann mein Compiler (XC32) 
mit der ISR nichts anfangen:(

von sr2401 (Gast)


Lesenswert?

Ich habe jetzt die beiden Funktionen gefunden, mit denen man die 
Interrupts aktivieren kann:

INTEnableSystemMultiVectoredInt();
INTEnableSystemSingleVectoredInt();

Aber leider funktioniert das Programm immer noch nicht. Nutze ich die 
erste Funktion, läuft das Programm, was ich daran sehe, dass die LED in 
der While-Schleife toggelt. Die grüne LED ist aber dauerhaft an und 
schaltet nicht wie gewünscht um.

Wenn ich die zweite Funktion verwende, toggelt keine der LEDs.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <plib.h>
4
5
#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_4, FPLLODIV = DIV_4, FWDTEN = OFF
6
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_1
7
#define SYS_FREQ (25000000L)
8
9
int main(int argc, char** argv) {
10
    
11
    TRISBbits.TRISB10 = 0;          //LED1 (green)
12
    TRISBbits.TRISB11 = 0;          //LED2 (red)
13
14
    INTEnableSystemMultiVectoredInt();
15
16
    /*Timer 1*/
17
    T1CONbits.ON = 0;
18
    T1CONbits.TCKPS = 0b01;           //Prescale 8
19
    PR1 = 8000;
20
    TMR1 = 0x00;
21
    IFS0bits.T1IF = 0;
22
    IPC1bits.T1IP = 5;
23
    IEC0bits.T1IE = 1;
24
    T1CONbits.ON = 1;
25
26
    while(1){
27
        LATBbits.LATB11 = !LATBbits.LATB11; //LED in Schleife toggeln
28
        for(i=0; i<80000; i++){
29
        }
30
    }
31
32
    return (EXIT_SUCCESS);
33
}
34
35
36
void __ISR(_TIMER_1_VECTOR, ipl5) Timer1Handler(void){
37
38
    LATBbits.LATB10 = !LATBbits.LATB10;  //LED in ISR toggeln
39
40
    IFS0bits.T1IF = 0;
41
}

von sr2401 (Gast)


Lesenswert?

funktioniert jetzt :) Timer-Frequenz war zu hoch.. bleibt nur noch die 
letzte Frage, wo ich für andere Interrupts, beispielsweise für den 
CN-Interrupt die entsprechenden ISR-Aufrufe finde..

von Chris B. (dekatz)


Lesenswert?

In der "main" sollte noch die Multiverctor-Interruptverarbeitung 
freigeschaltet werden:

// Enable multi-vector interrupts
    INTEnableSystemMultiVectoredInt();

Subpriority muss man nicht definieren solange keine 2 oder mehr 
Interrupt die gleiche Priorität besitzen.

Hier ein Beispiel für den Timer ohne sich um die einzelnen SFRzu 
kümmern:

// Konfiguration Timer1......
void Init_TIMER1(void)
{
    ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_3);
    OpenTimer1(T1_ON | T1_PS_1_256 | T1_SYNC_EXT_OFF | T1_SOURCE_INT, 
3125);
}

Und die Interruptroutine dazu.
// TIMER 1 interrupt handler priority level 5 mit software context 
saving
void __ISR(_TIMER_1_VECTOR, IPL3SOFT) Timer1Handler(void)
{
    mT1ClearIntFlag();
    LATBINV = 0x00002000;         //Funktionskontrolle mit LED
}

Dafür:
LATBbits.LATB10 = !LATBbits.LATB10;

hat der PIC32 eigene Register. Damit kann man mit einem Befehl mehrer 
Bits auf einem Port ändern:
z.B.
LATBINV = 0x00002070;
Invertiert RB13, RB7, RB6 und RB5

(Diese Register gibt es für TRIS, PORT, LAT mit den Funktionen SET, 
CLR,INV)

sr2401 schrieb:
> Gibt es irgendwo eine Zusammenfassung
> wie die ISR für jede einzelne Interrupt-Art lautet? Beim dsPIC habe ich
> die alle im Header-File gefunden..

Ist auch beim PIC32 so:
\xc32\v1.32\pic32-libs\include\proc\p32mx........
nach "Vector Numbers" suchen weil die Files ein paar 100kB haben....

von Chris B. (dekatz)


Lesenswert?

ah das hat sich jetzt überschnitten weil uich wiedermal zu langsam 
getippt und zu lange gesucht habe....;-)

: Bearbeitet durch User
von sr2401 (Gast)


Lesenswert?

Danke für die ausführliche Antwort:) Und auch wenn es sich überschnitten 
hat, waren viele  interessante Informationen für mich in deinem Post!!

also rufe ich eine ISR immer wie folgt auf:

void __ISR("Vector Name aus Header-File", ipl"Priorität") 
"Funktionsname"(void){}

Sehe ich das richtig, dass ich den Funktionsnamen frei wählen darf?

von Chris B. (dekatz)


Lesenswert?

sr2401 schrieb:
> Sehe ich das richtig, dass ich den Funktionsnamen frei wählen darf?

Ja.

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.