Forum: Mikrocontroller und Digitale Elektronik Problem mit ISR beim ext. Interrupt (PIC24)


von Hannes (Gast)


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
}

von Pascal Würzer (Gast)


Lesenswert?

Also im User Guide zum XC16 
(http://ww1.microchip.com/downloads/en/DeviceDoc/50002071E.pdf) steht 
das mit _attribute_ drin (Kapitel 14)

Verwechselst du die Schreibweise mit XC8?

von Klaus (Gast)


Lesenswert?

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

void _ISR _INT0Interrupt(void);

MfG Klaus

von Hannes (Gast)


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 
:-(

von Hannes (Gast)


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.

von Dieter W. (dds5)


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.

: Bearbeitet durch User
von Klaus (Gast)


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

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.