Forum: Compiler & IDEs MSP430 Interrupt; Aufruf falsch?


von m@is (Gast)


Lesenswert?

Hallo @all:

hoffe einen Tip zu bekommen. Ich will auf eine Änderung am Port 2 mit
einem Interrupt reagieren.
Dieser soll dann einzelne Pins abfragen.

Allerdings bricht der COMPILER schon nach dem "interrupt" ab, also
vor der Klammer. Error[16] Identifier expected

Ich arbeite mit IAR Embedded Workbench und C-Spy auf Win XP.



void _EINT(void);

interrupt (PORT2_VECTOR) CHNG-INFO (void)
{
SDA = (P2IN & 0x02);        //soll P2.1 einlesen
    if (SDA != 0)

    //mach was

    else

    //was anderes

}

Gruß m@is

von OldBug (Gast)


Lesenswert?

Hi!

interrupt (PORT2_VECTOR) CHNG-INFO (void)

...das sieht aus, wie eine MSP-GCC deklaration einer ISR, die vom IAR
Compiler sieht meines Wissens nach etwas anders aus (da waren glaub ich
irgendwo eckige klammern)...

Genaues weis ich da aber leider nicht...

Gruß,
Patrick...

von m@is (Gast)


Lesenswert?

@OldBug:
Danke für den hint mit den Klammern. Immer diese Syntax-Fehler. Für nen
Anfänger wie mich super schwer.
Habe jetzt nach knapp 3 Std. die Lösung :-(
Für heute reicht's, ab ins WE.

Hier noch der richtige Aufruf:


interrupt [PORT2_VECTOR] void CHNGINFO (void)

von m@is (Gast)


Lesenswert?

ok, mit den eckigen Klammern kommt kein Compiler-Fehler mehr, aber der
Interrupt läuft trotzdem nicht. Ich kan an den entsprechenden Ports
machen was ich will, die Interrupttroutine wird nicht aufgerufen.

Doch noch was falsch?

von OldBug (Gast)


Lesenswert?

Hast Du den Port richtig initialisiert?
Ist der Pin Interruptfähig?

von m@is (Gast)


Lesenswert?

ich hoffe doch ;-)

auf eine fallende Flanke soll P2.1 mit einem Interrupt reagieren, dann
sollen P2.1 und P2.2 ausgewertet werden.


int main (void)
...
P2IE = 0x02;
P2SEL = 0x00;              // Set IO-Function
P2DIR = 0x06;              // set P2.1 and P2.2 to input direction
...

Soweit ich das gelesen habe sind nur die PIN's von Port1 nicht
Interruptfähig.

von OldBug (Gast)


Lesenswert?

Interrupts enabled? ;)

von m@is (Gast)


Lesenswert?

ich habe folgende Zeile dafür vorgesehen:

void _EINT(void);

Das müsste doch alles sein, um einen Interrupt auslösen zu können!?!

von OldBug (Gast)


Lesenswert?

Das ist der Prototyp einer Funktion.
Nachdem Du Deine und den Rest des Controllers initialisiert hast, musst
Du die noch aufrufen:

int main (void)
...
P2IE = 0x02;
P2SEL = 0x00;              // Set IO-Function
P2DIR = 0x06;              // set P2.1 and P2.2 to input direction
...
_EINT();                   // Enable global interrupts

Dann sollte das gehen...

von OldBug (Gast)


Lesenswert?

hups, da fehlt das "Ports" hinter "Nachdem Du Deine..."

von Micha (Gast)


Lesenswert?

P2IFG auf Null setzen, sonst wird permanent die ISR angesrungen.

von m@is (Gast)


Lesenswert?

@OldBug: danke, habe in main tatsächlich nicht die Pseudofunktion _EINT
nochmal aufgerufen, wohl zuviel hin- und her editiert.

@Micha: danke für den Hinweis, habe die Zeile vor P2IE eingefügt.



Danke für Eure Hilfe!

m@is

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.