Guten Abend, im LPM3 vom MSP430 ist der CPU inaktiv. Wenn ich im DebugerModus den LPM3 aktiviere kann ich trotzdem die nächsten Befehle ausführen(LED blinken lassen). Wenn CPU off ist! Wie werden dann die Befehle ausgeführt? Habe ich irgendwie ein Denkfehler? Kann mir bitte Jemanden Das erklären Danke
Dazu wird natürlich die CPU aktiviert. Sieht man auch am Stromverbrauch. Im Debug-Modus, wenn du Einzelschittbetrieb oder solche Sachen machst, übernimmt der Debugger die komplette Kontrolle über die CPU. Wenn du nicht debugst, und den LPM3 aktivierst, hält die CPU definitiv an dem Befehl an. Erst wenn du durch einen Interrupt die CPU weckst, gehts weiter(zumindest in der ISR erst mal).
Auch nicht im Debug Modus blinkt die LED weiter nach dem einschlaten des LPM3. C Code: main{ ... LPM3;// while(1){ LED1_ON; delay_ms(1000); LED_off;} ... } Irgenwie komisch oder? Wie kann die LED blinken wenn CPU aus ist. Merken: Alle Interrupts aus.
Dann ersetze doch mal das Macro in Deinem Quelltext durch dessen Inhalt:
1 | main
|
2 | {
|
3 | ...
|
4 | LPM3;// |
5 | while(1) |
6 | {
|
7 | LED1_ON; |
8 | delay_ms(1000); |
9 | LED_off; |
10 | }
|
1 | main
|
2 | {
|
3 | ...
|
4 | (SCG1+SCG0+CPUOFF);// |
5 | while(1) |
6 | {
|
7 | LED1_ON; |
8 | delay_ms(1000); |
9 | LED_off; |
10 | }
|
Merkst Du was?
Wenn dann bitte so:
1 | asm(bis.w LPM3,SR); |
Oder über die von TI vergefertigten Funktionen. Findeste in der IAR Doku oder in den Examples von TI. mfg Alex
In TI Example wird auch das Macro LPMx benutzt sieh Anhang Zeile 145. Andereseits hat den Assembler Befehl in der Funktion nichts geändert(die LED leuchtet weiter)!
> Merkst Du was?
Anscheinend war der Zaunpfahl nicht ausreichend groß.
(SCG1+SCG0+CPUOFF);
Das sind einfach nur ein paar numerische Werte, die Bits im
Statusregister beschreiben:
#define CPUOFF (0x0010)
#define SCG0 (0x0040)
#define SCG1 (0x0080)
Allerdings hast Du die Headerdatei nicht richtig gelesen, die von Dir
erwähnte Macrodefinition ist für Assembler. Die in der gleichen
Headerdatei vorhandene Macrodefinition für C sieht so aus:
#define LPM3_bits (SCG1+SCG0+CPUOFF)
#define LPM3 _BIS_SR(LPM3_bits) /* Enter Low Power Mode 3 */
_BIS_SR() ist eine Funktion, die den übergebenen Wert ins Statusregister
schreibt.
Damit führt LPM3; sehr wohl das aus, was es soll. Könnte es sein, daß Du
"nicht im Debug modus" falsch verstanden hast und damit Release- statt
Debug-Code meinst, Dein Programm aber sehr wohl noch unter Kontrolle des
Debuggers läuft?
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.