Forum: Mikrocontroller und Digitale Elektronik MSP430 aus LPM3 aufwecken


von Lukas K. (carrotindustries)


Lesenswert?

Hallo Zusammen,
ich bin gerade dabei eine eigene Firmware für meine ez430 Chronos zu 
schreiben. Damit die Knopfzelle lange hält, soll der Prozessor zur 
größten Zeit im Stromsparmodus(LPM3) verbleiben. Zum Testen habe ich 
folgenden Code gschrieben (MSPGCC)
1
#include  "cc430x613x.h"
2
#include <signal.h>
3
#include <stdlib.h>
4
#include "lcd.h"
5
6
7
8
interrupt (WDT_VECTOR) WDTServiceRoutine(void) {
9
  SFRIFG1 &= ~WDTIFG;  
10
}
11
12
void main(void)
13
{
14
  P5SEL |= 0x03;                            // Select XIN, XOUT on P5.0 and P5.1
15
  UCSCTL6 &= ~XT1OFF;                  // XT1 On, Highest drive strength
16
  //UCSCTL6 &= ~XCAP_3;  
17
  do
18
  {
19
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
20
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
21
  } while ((SFRIFG1 & OFIFG));  
22
  PMMCTL0_H  = 0xA5;
23
  PMMCTL0_L |= PMMHPMRE;
24
  PMMCTL0_H  = 0x00;  
25
26
  WDTCTL =  WDT_ADLY_1000; //WDT auf 1 sec aufziehen
27
  SFRIE1 |= WDTIE; // WDT int ein
28
  initlcd();
29
  _EINT(); //INTs aktivieren
30
  LCDM1 |= (1<<5);
31
  while(1) {
32
    LCDM1 ^= (1<<7);
33
    LPM3; //schlafen legen
34
  
35
    
36
    
37
38
  }
39
  __no_operation();  // For debugger
40
}
Dieser soll im 1sec-Takt ein Segment toggeln. Das segment bleibt jedoch 
an.
Wenn ich das Seg-Togglen in den INT verlager, dann geht's. In der 
Originalen Firmware sieht das ganze aber ungefähr so aus:
1
while(1)
2
3
  {
4
5
    // When idle go to LPM3
6
7
      idle_loop();
8
9
10
11
      // Process wake-up events
12
13
      if (button.all_flags || sys.all_flags) wakeup_event();
14
15
      
16
17
      // Process actions requested by logic modules
18
19
      if (request.all_flags) process_requests();
20
21
      
22
23
      // Before going to LPM3, update display
24
25
      if (display.all_flags) display_update();  
26
27
   }
idle_loop(); macht de facto nichts anderes als LPM3;
Was mache ich falsch bzw. welches Bit in welchem Register habe ich 
übersehen.
PS: Kann mir jemand ein GUTES und tiefgängiges MSP430-Tutorial von 
ähnlicher Qualität wie das AVR(GCC)-Tutorial empfehlen?

von Christian C. (Gast)


Lesenswert?

In Deiner ISR musst Du dafür sorgen, dass der MSP nach dem RETI auch 
aufwacht. Dazu müssen die LPM3-Bits im Statusregister (SR) nach dem RETI 
gelöscht sein. Das machst Du, in dem Du sowas wie "bic.w #LPM3, 0(SP)" 
machst. Das löscht die LPM3-Bits des auf dem Stack geretteten SR.
Nach dem RETI wird das SR wieder mit dem Inhalt aus dem Stack 
beschrieben und der MSP wacht auf.

Programmiere das Teil nur in Assembler. Das müsstest Du dann in C 
genauso machen. Vielleicht hat der IAR ja auch einen eigenen Befehl 
dafür.

von siegmar (Gast)


Lesenswert?

Hallo,

die family guides sind eigentlich sehr umfangreich.
Auch in den Applikationsbeispielen, fndest Du alles was Du brauchst.
Kostet halt etwas Zeit um sich einzuarbeiten.
Ansonsten kannst Du auch das Yahoo Forum durchsuchen.
Hab leider keine Uhr zur Hand, sonst ......
"Ohne Fleiß, keine Preis"
gilt auch hier !
Viel Spaß beim Lesen der Datenblätter... steht alles drin!
Noch einen schönen Abend
Gruß
Siegmar

von Lukas K. (carrotindustries)


Lesenswert?

Vielen Dank, jetzt läuft's keksfreu
MSPGCC hat dafür ein Makro LPM3_EXIT
Nen wirklich GUTES Tutorial hat's aber keines?

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
Noch kein Account? Hier anmelden.