Forum: Mikrocontroller und Digitale Elektronik MSP430: Interrupts und __bis_status_register_on_exit


von MS (Gast)


Lesenswert?

Hallo,

ich versuche gerade alten, ursprünlich mit IAR kompilierten Code mit 
msp430-gcc zu bauen. Dabei muss ich unter anderem die Interrupt-Routinen 
anders deklarieren. So sieht die neue Lösung aus:
1
ISR(ADC12_VECTOR, ADC12Int)             
2
{                                       
3
        __low_power_mode_off_on_exit();
4
        ADC12IFG = 0;
5
}

Dabei ist __low_power_mode_off_on_exit ein Makro:
1
#define __low_power_mode_off_on_exit() __bis_status_register_on_exit(LPM4_bits);

Leider beschwert sich der msp-g++:
1
Dev.c: In function void ADC12Int():
2
Dev.c:487:2: error: __bis_status_register_on_exit invalid outside of function with interrupt attribute

Hat jemand eine Idee, weshalb das so auftritt?

Viele Grüße

Marvin

von MS (Gast)


Lesenswert?

Kleines addendum, nach dem Präprozessor:
1
# 486 "Dev.c"
2
static void Adc12Int()
3
{
4
 __bis_status_register_on_exit(((0x0080)+(0x0040)+(0x0020)+(0x0010)));;
5
 ADC12IFG = 0;
6
}

Offenbar wird das interrupt-attribut tatsächlich ignoriert.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

MS schrieb:
> ISR(ADC12_VECTOR, ADC12Int)


MS schrieb:
> Kleines addendum, nach dem Präprozessor:
> static void Adc12Int()

Da stimmt was nicht. ADC12Int ./. Adc12Int

Irgendwo in Deinem Code eine Doublette?

von Clemens L. (c_l)


Lesenswert?

Der Fehler ist offensichtlich in dem "ISR"-Makro. Das du geheim gehalten 
hast.

von MS (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Da stimmt was nicht. ADC12Int ./. Adc12Int
>
> Irgendwo in Deinem Code eine Doublette?
Danke - aber schön wärs. Das zweite posting kam nur von einem Test, wo 
ich ISR manuell aufgelöst hatte um das attribut direkt anzufügen. Dabei 
hatte ich den ISR aus versehen umbenannt.

von Aha Aha (Gast)


Lesenswert?

Also, zuerst mal verstehen
http://mspgcc.sourceforge.net/manual/x918.html

dann Fehler beheben

MS schrieb:
> #define __low_power_mode_off_on_exit()
> __bis_status_register_on_exit(LPM4_bits);

low power off geht mit *__bic...* und nicht mit *__bis...*

und wie funktionierts

Vor Eintritt in die ISR wird das PSW auf dem Stack gesichert. Mit der 
__bic... Funktion wird das PSW auf dem Stack modifiziert. Mit dem Reti 
wird das PSW mit dem Wert vom Stack restauriert.
Wird __bic... ausserhalb der ISR aufgerufen, modifiziert man das PSW 
direkt.

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.