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; }
Mach LPM4 nicht so ziemlich alles aus? Versuch das mal ohne Low Power Mode.
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.
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?
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().
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.