Forum: Mikrocontroller und Digitale Elektronik RR + Interrupts MSP430


von RalPeg (Gast)


Lesenswert?

Hallo!

Ich habe folgendes Programm, welches eigentlich nur den Tastendruck am 
Launchpad einlesen und dann die LED umschalten soll - funktioniert aber 
nicht. Weiß jemand warum?

#include <msp430.h>

/*
 * main.c
 */
int press;

int main(void) {
    WDTCTL = WDTPW | WDTHOLD;  // Stop watchdog timer

    P1DIR|=BIT0+BIT6;
    P1REN|=BIT3;
    P1OUT|=BIT0+BIT6;
    P1IE|=BIT3;
    P1IES|=BIT3;
    P1IFG&=~BIT3;

    _bis_SR_register(LPM4_bits+GIE);

    while(42)
    {
      if(press)
      {
        P1OUT^=(BIT0+BIT6);
        press=0;
      }

    }

}

#pragma vector=PORT1_VECTOR
__interrupt void P1_ISR(void)
{
  press=1;
  P1IFG&=~BIT3;
}

von Jim M. (turboj)


Lesenswert?

Mach LPM4 nicht so ziemlich alles aus? Versuch das mal ohne Low Power 
Mode.

von RalPeg (Gast)


Lesenswert?

tatsache, ohne lmp4_bits funktionierts.

danke!

von Clemens L. (c_l)


Lesenswert?

Und solange die CPU schläft, kann sie die while-Schleife nicht 
ausführen.

Du könntest auch die CPU nach dem Ende des Interrupts aufwecken, und am 
Ende der Schleife wieder schlafen lassen.

von RalPeg (Gast)


Lesenswert?

das hieße in der isr _bis_SR_register(GIE); aufzurufen und in der 
whileschleife nach der ausführung dann wieder _bis_SR_register(GIE); 
oder?

von Clemens L. (c_l)


Lesenswert?

GIE hat mit dem Schlafen nichts zu tun.

Beim Ausführen eines Interrupts speichert die CPU SR auf dem Stack, und 
löscht GIE. Beim Beenden des Interrupt-Handlers wird der alte Wert von 
SR vom Stack geladen.

Das gleiche passiert mit den LPM-Bits: Beim Ausführen eines Interrupts 
wird die CPU aufgeweckt, und beim Beenden des Interrupt-Handlers wird SR 
wieder hergestellt; wenn also die LPM-Bits gesetzt waren, schläft die 
CPU weiter.

Um zu erreichen, dass die CPU nach dem Interrupt weiter läuft, müssen 
also die LPM-Bits in der SR-Kopie auf dem Stack gelöscht werden. Das 
geht mit __bic_SR_register_on_exit().

von RalPeg (Gast)


Lesenswert?

achso. ja ich meinte nur, weil ich ja scheinbar irgendwie nicht so 
direkt ins statusregister schreiben kann, wie in die anderen, jedenfalls 
habe ich da so auf die schnelle nichts zu gefunden. eigentlich sollte 
oben als zweites auch wieder das lpm4_bits in den argumenten stehen.

von Clemens L. (c_l)


Lesenswert?

RalPeg schrieb:
> weil ich ja scheinbar irgendwie nicht so
> direkt ins statusregister schreiben kann, wie in die anderen

Doch, du kannst das. Das komplette Register zu ändern wäre aber nicht 
sinnvoll, deswegen gibt es Funktionen wie _bi*_SR_register(), um 
einzelne Bits zu setzen/löschen.

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.