MSP430F4250 und Watchdog

OP #1837141
Lesenswert?

Hallöchen,

ich habe ein Problem ...
Und zwar soll der Watchdog des MSPs benutzt werden und nach einem Reset 
soll die Firmware in einen bestimmten Zustand gehen, aber nicht den 
normalen Start durchführen .

Hier mein aktueller Stand :
1
void main (void)
2
{
3
  WDTCTL  = WDTPW + WDTHOLD;      // Stop watchdog timer
4
  if ((IFG1 & (WDTIFG + PORIFG + RSTIFG)) == WDTIFG ) { // Test ob der   Watchdog zugeschlagen hat .... oder ob normaler Reset
5
    // wenn Watchdog , dann wird der mV Output auf 0V gezogen !
6
    WDTCTL  = WDTPW + WDTHOLD;      // Stop watchdog timer
7
    P1SEL &=~ BIT4;
8
    P1DIR |= BIT4;
9
    P1OUT &= ~BIT4;
10
    P5DIR |= BIT1;
11
    P5OUT &= ~BIT1;
12
    while (1) {};  // Endlosschleife
13
  }
Doch leider scheint es damit Start-Schwierigkeiten zu geben.
manchmal funktioniert es manchmal nicht.
Eigentlich sollte der Watchdog garnicht zuschlagen, aber es schein so 
als ob die Firmware doch in diese Endlosschleife gelangt.

Habt ihr noch eine andere bzw. bessere Idee ?

Danke im Voraus für eure Mühe.

Gruß

Roy
Gast #1837162
Lesenswert?

Ach und noch was: Auch wenn es in den TI-Examples überall so drin steht 
- diese Verknüpfungen mit "+" würde ich mir ganz schnell abgewöhnen und 
durch ein normales "|" ersetzen. Dieses "+" gibt es eigentlich garnicht, 
wird wohl irgendwo definiert...
#1837265
Lesenswert?

>Dieses "+" gibt es eigentlich garnicht
Wieso sollte es keine Addition geben?


>Eigentlich sollte der Watchdog garnicht zuschlagen, aber es schein so
>als ob die Firmware doch in diese Endlosschleife gelangt.
D.h. du meinst es gab keinen Watchdog Reset, der MSP hat aber trotzdem 
das WDTIFG Flag gesetzt und bleibt in der while(1) Schleife hängen?
Gast #1837322
Lesenswert?

Jörg S. schrieb:
> Wieso sollte es keine Addition geben?

Ja rechne dir doch mal ein paar Sachen Bitweise...das geht oft auf, 
jedoch nicht immer.

Nimm z.B. zweimal das gleiche Bit, also es passiert irgendwo folgendes:

(0000 0010 + 0000 0010) = 0000 0100

mit oder:

(0000 0010 | 0000 0010) = 0000 0010
#1837570
Lesenswert?

Hast du eventuell ein großes Datenarray deklariert? In diesem Fall kann 
es sein, dass der WDT schon im CStartup Code zuschlägt. Wenn man viele 
Variablen und große Arrays hat, muss man den WDT davor ausschalten. Wie 
das bei dem entsprechenden Kompiler geht, steht im Manual. Beim MSPGCC 
gehts zum Beispiel mit:
1
void low_level_init(void)__attribute__((__naked__, __section__(".init3")));
2

3
void low_level_init(void)
4
{
5
  WDTCTL = WDTPW | WDTHOLD;
6
}

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