mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RR + Interrupts MSP430


Autor: RalPeg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Jim M. (turboj)
Datum:

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

Autor: RalPeg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tatsache, ohne lmp4_bits funktionierts.

danke!

Autor: Clemens L. (c_l)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: RalPeg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Clemens L. (c_l)
Datum:

Bewertung
0 lesenswert
nicht 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().

Autor: RalPeg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Clemens L. (c_l)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.