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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.