Problem mit ISR beim ext. Interrupt (PIC24)

Gast #4408822
Lesenswert?
• ▲
▼
Hallo Leute,

ich möchte einen externen Interrupt programmieren und bekomme meinen 
Code nicht kompiliert.
Fehlermeldung:

mainXC16.c:22:16: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before 'ISR'

Ich bin schon etwas betriebsblind, aber vielleicht sieht jemand den 
Fehler sofort.

Danke!

Controller:  PIC24HJ128GP306
IDE:  MPLAB X mit Compiler XC16 (v1.25)
1
#define FOSC    7370000UL   
2
#define FCY     (FOSC/2)    
3

4
#include "xc.h"  
5
#include <stdio.h>
6
#include <stdlib.h>
7
#include <libpic30.h>
8

9
volatile uint8_t flag = 0;
10

11
void interrupt ISR(void){
12
 if(IFS3bits.INT4IF == 1){
13
        IFS3bits.INT4IF = 0;    // Reset the external interrupt flag  
14
        flag = 1;
15
 }
16
}
17

18
void interrupt_init(void){  //hierin sollte kein Fehler sein - kompiliert ohne Probleme
19
    INTCON1bits.NSTDIS = 1; //Interrupt nesting disabled 
20
    INTCON2bits.INT4EP = 1; //Ext. Interrupt falling edge 
21
    IFS3bits.INT4IF = 0;    // Reset the external interrupt flag
22
    IPC13bits.INT4IP = 3;   //Set ext. interrupt 4 priority to 3
23
    IEC3bits.INT4IE = 1;    //Enable ext. Interrupt 4
24
}
25

26

27
int main(void) {
28

29
TRISB = 0;
30
TRISD = 1;
31
interrupt_init();
32

33
    while(1){
34

35

36
        if(flag){
37
            flag=0;
38
            //mach was
39
        }
40
    }
41
    return 0;
42
}
Gast #4408880
Lesenswert?
• ▲
▼
Danke schonmal.

Im Userguide steht aber auch:
Thus, interrupt and _interrupt_  are equivalent.

Ist damit nicht die Funktion "ISR" automatisch als ISR gekennzeichnet?
Ich habe das von hier:
[[http://picguides.com/beginner/interrupts.php]]


Klaus schrieb:
> Mal unabhängig von der Schreibweise, irgendwie muß für den Compiler zu
> erkennen sein, zu welchem Interrupt die Funktion gehören soll.

Das checke ich ja dann mit der if-Abfrage. Hier sollen später noch 
andere ISR rein. Mit der Codezele von Klaus kompiliert es zwar, es 
passiert aber nichts (mit LED und entsprechender zeile in der ISR 
getestet).

Ehrlich gesagt, komme ich mit diesen Unterstrichen überhaupt nicht klar 
:-(
Gast #4408883
Lesenswert?
• ▲
▼
Hannes schrieb:
> Mit der Codezele von Klaus kompiliert es zwar, es
> passiert aber nichts (mit LED und entsprechender zeile in der ISR
> getestet).

Sorry, hatte hier einen kleinen Fehler im Code. Der Interrupt funzt 
jetzt. Danke!

Das mit den Unterstrichen verstehe ich vielleicht auch noch irgendwann.
#4408892
Lesenswert?
• ▲
▼
Hannes schrieb:
> Das checke ich ja dann mit der if-Abfrage. Hier sollen später noch
> andere ISR rein.

Das war bei den PIC 12, 16 und 18 so aber die 24er haben für jeden 
Interrupt einen eigenen Vector und brauchen deshalb auch jeweils eine 
eigene ISR.

Für den alten C-Compiler funktioniert bei mir z.B.
1
 void __attribute__ ((__interrupt__, no_auto_psv)) _INT1Interrupt(void)

Mit XC16 hab ich noch nicht gearbeitet.
Gast #4408944
Lesenswert?
• ▲
▼
Hannes schrieb:
> Das checke ich ja dann mit der if-Abfrage. Hier sollen später noch
> andere ISR rein. Mit der Codezele von Klaus kompiliert es zwar, es
> passiert aber nichts (mit LED und entsprechender zeile in der ISR
> getestet).

Wurde zwar schon gesagt, der PIC24 hat sehr viele Interrupte. Das können 
bei manchem Chip schon mal über 100 sein. Jeder und auch die Traps haben 
einen eigenen Vector und _ISR ist ein Systemmakro (daher der Unterstrich 
am Anfang) das erledigt das meisste. Geh mal mit gedrückter 
Control-Taste mit der Maus über das Symbol, dann kannst du sehen, wie es 
expandiert aussieht.

Das Interruptflag brauchst du nicht abzufragen, wenn du im 
Interrupthandler angekommen bist, ist es auf jeden Fall gesetzt. Nur 
löschen sollte man es.

Dieter W. schrieb:
> Mit XC16 hab ich noch nicht gearbeitet.

Ist nur eine neue Bezeichnung für den C30, damit die Namen einheitlicher 
sind: MPLABX, XC8, XC16, XC32, wobei die beiden großen der gcc ist.

MfG Klaus

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