RR + Interrupts MSP430

Gast #4695889
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;
}
#4696230
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().
Gast #4696302
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.

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