Forum: Mikrocontroller und Digitale Elektronik MSP430 LPM Verzweiflung


von sleep_msp_sleep (Gast)


Lesenswert?

Hallo zusammen,

ich habe vor ein paar Tagen schon mal einen Artikel verfasst, weil ich 
mit meinem MSP430FR5729 nicht in den Sleep Mode LPM3.5 kam.

Das hat sich nun erledigt. Aber schon stehe ich vor der nächsten 
Herausforderung:

Die Uhr läuft im Tiefschlafmodus nicht weiter. Hier zunächst mal die 
entscheidenden Stellen:

Gehe in LPM3.5:
1
void enter_lpm35()
2
{
3
  WDTCTL = WDTPW + WDTHOLD;                   // Stop WDT
4
5
  __disable_interrupt();
6
7
  P1DIR = 0xFF;
8
  P1OUT = 0x00;
9
  P2OUT = 0x00;
10
  P2DIR = 0xFF;
11
  P3OUT = 0x00;
12
  P3DIR = 0xFF;
13
  P4OUT = 0x00;
14
  P4DIR = 0xFF;
15
16
  // Configure RTC
17
  PJOUT = 0x00;
18
  PJSEL0 |= BIT4 | BIT5;
19
  PJDIR = 0xFFFF;
20
  RTCCTL01 &= ~(RTCHOLD);                   // Start RTC
21
22
    // Configure Wake-Up Pin
23
  P1DIR &= ~BIT0;
24
  P1IE |= BIT0;
25
  P1IFG &= ~BIT0;
26
27
  PMMCTL0_H = PMMPW_H;                // Open PMM Registers for write
28
  PMMCTL0_L |= PMMREGOFF + SVSHE + SVSLE;             // and set PMMREGOFF
29
30
  // Enter LPM4 Note that this operation does not return. The LPM4.5
31
  // will exit through a RESET event, resulting in a re-start
32
  // of the code.
33
  //__bis_SR_register(LPM4_bits | GIE);
34
  __bis_SR_register(LPM4_bits | GIE);
35
}


Wache nach Neustart wieder auf:
1
if (SYSRSTIV == SYSRSTIV_LPM5WU)
2
{
3
    init_board();
4
5
    // Re-Init RTC
6
    PJOUT = 0x00;
7
    PJSEL0 |= BIT4 | BIT5;
8
    PJDIR = 0xFFFF;
9
    RTCCTL01 &= ~(RTCHOLD);                   // Start RTC
10
11
    PM5CTL0 &= ~LOCKLPM5;
12
}
13
else
14
{
15
      init_board();
16
}
17
18
__enable_interrupt();

Der MSP430 geht definitiv schlafen und durchläuft beim aufwachen auch 
die if/else Bedingung. Das habe ich ausführlich getestet.

Ich verstehe nur nicht warum die Uhr nicht weiter läuft. Laut Datenblatt 
geht er automatisch in den LPM3.5, sobald:
1
 RTCCTL01 &= ~(RTCHOLD);                   // Start RTC
gesetzt ist.

Ich hoffe sehr, dass mir Jemand den entscheidenden Tipp geben kann.

#Verzweiflung :D

von Clemens L. (c_l)


Lesenswert?

sleep_msp_sleep schrieb:
> Laut Datenblatt geht er automatisch in den LPM3.5, sobald:
>  RTCCTL01 &= ~(RTCHOLD);                   // Start RTC
> gesetzt ist.

Falls du Abschnitt 13.2.6 Nr. 3 des User's Guide (nicht des Datenblatts) 
meinst: das "if the RTC is enabled with RTCHOLD = 0" bezieht sich nur 
auf den Teilsatz ab dem "except".

Und kannst du dich bitte endlich mal entscheiden, ob du LPM3.5 oder 
LPM4.5 willst?

von sleep_msp_sleep (Gast)


Lesenswert?

Hi Clemens

> Und kannst du dich bitte endlich mal entscheiden, ob du LPM3.5 oder
>LPM4.5 willst?

Ich brauche die RTC, also möchte ich ganz klar LPM 3.5


Ich stolpere auch immer wieder über folgende Zeile:
1
__bis_SR_register(LPM4_bits | GIE);

Aber die Tiefschlaf-Modi werden doch darüber erreicht? 3.5 oder 4.5 
hängt dann davon ab, ob die RTC konfiguriert ist oder nicht.

Verstehe ich das richtig?

von Clemens L. (c_l)


Lesenswert?

sleep_msp_sleep schrieb:
> __bis_SR_register(LPM4_bits | GIE);
>
> Aber die Tiefschlaf-Modi werden doch darüber erreicht?

Darüber wird LPM4 erreicht (oder LPM4.5, wenn PMMREGOFF gesetzt ist).

LPM3 (oder .5) erreicht man durch setzen der LPM3_bits.

> 3.5 oder 4.5 hängt dann davon ab, ob die RTC konfiguriert ist
> oder nicht.

Nein, das ist davon unabhängig. Du kannst die RTC immer konfigurieren, 
aber wenn du dann in LPM4 gehst, läuft sie halt nicht.

: Bearbeitet durch User
von sleep_msp_sleep (Gast)


Lesenswert?

Hi Clemens,

AHA! Ich habe mich hierbei an den TI Code-Beispielen orientiert, und die 
sehen beim LPM3.5 wie folgt aus:
1
void EnterLPM35(void)
2
{
3
  PMMCTL0_H = PMMPW_H;                      // Open PMM Registers for write
4
  PMMCTL0_L |= PMMREGOFF;                   // and set PMMREGOFF
5
6
  // Enter LPM3.5 mode with interrupts enabled. Note that this operation does
7
  // not return. The LPM3.5 will exit through a RESET event, resulting in a
8
  // re-start of the code.
9
  __bis_SR_register(LPM4_bits | GIE);
10
}

Ich probiere das gleich mal mit den LPM3_bits aus. Das hatte ich sogar 
schon mal, allerdings ist er dann über das Port-Interrupt nicht mehr 
aufgewacht ...

von Clemens L. (c_l)


Lesenswert?

sleep_msp_sleep schrieb:
> Ich habe mich hierbei an den TI Code-Beispielen orientiert

Welches Beispiel ist das?

von sleep_msp_sleep (Gast)


Angehängte Dateien:

Lesenswert?

Es gibt mehrere zum MSP430FR5xx. Das angefügte ist bloß eines von 
vielen.

von Clemens L. (c_l)


Lesenswert?

Das ist nicht für FR57, sondern für FR59.

(Was nichts daran ändert, dass der falsche LPM benutzt wird. Bitte melde 
den Fehler an TI.)

von sleep_msp_sleep (Gast)


Lesenswert?

Hi,

der FR59 und der FR57 besitzen das Gleiche RTC_B Modul. Deshalb habe ich 
die Beispiele benutzen können.

Ich werde TI morgen mal anschreiben ;-)

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.