Forum: Mikrocontroller und Digitale Elektronik MSP430F4250 und Watchdog


von Roy .. (royw)


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

von Frank Koch (Gast)


Lesenswert?

Also ich kann den Sinn darin grad nicht erkennen. Wieso sollte der 
Watchdog zuschlagen, wenn er gerade erst gestoppt wurde?

von Frank Koch (Gast)


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...

von Roy .. (royw)


Lesenswert?

Der Watchdog wird erst nach dieser Routine scharf gemacht !
Das bedeutet wenn er dann im Fehlerfall zuschlägt soll er nach dem 
Watchdog Reset in diese Endlosschleife springen.

von Jörg S. (joerg-s)


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?

von Roy .. (royw)


Lesenswert?

ja das denke ich , Die Firmware läuft wohl direkt in die Endlosschleife 
rein, nach Power On ....

(Das mit dem "+" habe ich auch nicht ganz verstanden ... )

von Dennis (Gast)


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

von Roy .. (royw)


Lesenswert?

Da hast du natürlich recht, aber bei diesen Bit Operationen muss man 
natürlich aufpassen welches Bit man setzt bzw. rücksetzt.
Doppelte Bits sollten dann nicht vorkommen.

Aber viel wichtiger ist mir das mit dem Watchdog ....

von Jörg S. (joerg-s)


Lesenswert?

Dennis schrieb:
> 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.
Mag sein, aber die Defines sind von IAR bzw. TI vorgegeben. Bugs in dem 
Bereich kann man wohl zu 99,999999999% ausschliessen.

von Jörg S. (joerg-s)


Lesenswert?

Roy ........ schrieb:
> ja das denke ich , Die Firmware läuft wohl direkt in die Endlosschleife
> rein, nach Power On ....
Tja, man müsste halt erst mal ausschliessen das es nicht doch zu einem 
Watchdog Reset kommt.
Kannst den Watchdog ja mal in den Timer Mode schalten und dir einen 
Breakpoint in die ISR setzen.

von Roy .. (royw)


Lesenswert?

ja das hab ich bereits getan, bzw. den Watchdog garnicht erst scharf 
gemacht.
Dann kommt er trotzdem in die Schleife rein ...

von Christian R. (supachris)


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
}

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.