MSP430 aus LPM3 aufwecken

OP #1750369
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?
Gast #1750378
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.
Gast #1750380
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren