MSP430 Watchdog Interruptflag

OP #2003954
Lesenswert?

Hallo,

Ich wollte den Watchdog-Timer in meinem Programm implementieren um einen 
Reset zu erzwingen, falls sich die Software irgendwo auf gehangen hat.
Bei einem Neustart durch einen Watchdog-Reset erhoffe ich mir, meine 
verwendeten Variablen beim Neustart zurück zu setzen.

Der Watchdog besitzt im IFG1-Register ein WDTIFG-Flag doch irgendwie ist 
dieses immer gesetzt und zurücksetzen funktioniert nicht. (Der Watchdog 
ist bis jetzt noch deaktiviert, ich habe nur erstmal dieses Flag 
versucht auszulesen und zu löschen)

Gibt es noch eine Möglichkeit die anderen Reset-Varianten bei einem 
Neustart auszuwerten(Bsp.-weise einen Brown-Out oder Power-On-Reset)?

Verwendeter Controller ist der MSP430F169.

Ich danke schon mal für die Tipps und Ratschläge.
Persönliche Seite #2004469
Lesenswert?

Im User's Guide der entsprechenden MSP430-Familie ist der Watchdog Timer 
ausführlich beschrieben.
Beim 'F169 ist das slau049*. Dort in Kapitel 10, das auf Seite 192 
beginnt.

Die Brown-Out-Detection erfolgt über den SVS, Kapitel 6, ab Seite 148.
Für Dich ist das auf Seite 154 beschriebene Register SVSCTL und dort das 
Bit SVSFG interessant.

*) 
http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=slau049f&fileType=pdf
OP #2005219
Lesenswert?

Hallo,

ich habe mir jetzt mal ein TI-example zum Thema Watchdog zur Hand 
genommen und dieses etwas modifiziert.
Damit wollte ich testen wann das Interrupt-Flag vom Watchdog zurück 
gesetzt wird.
Ich habe gelesen, dass das Interruptflag nach verlassen der 
Serviceroutine zurueck gesetzt wird, leider konnte ich das bei mir nicht 
bestätigen. Auch Softwareseitiges zurücksetzen des IFG bringt keinen 
Erfolg.

Entweder habe ich es überlesen oder man benötigt das Passwort nur wenn 
man in das Watchdog-Control-Register schreiben möchte und nicht wenn man 
auf das Interrupt-Flag-Register zugreift

Sieht jemand einen Fehler in meinem Testprogramm?
Ich bin für jeden Tipp dankbar.

Programm-Code:
1
#include  <msp430f169.h>
2

3
  unsigned char a='0';    // Test-Variable
4
  unsigned char b='0';    // Test-Variable
5

6
void main(void)
7
{
8
    WDTCTL = WDT_MDLY_32;    // Set Watchdog Timer interval to ~30ms
9
    IE1 |= WDTIE;            // Enable WDT interrupt
10
    P4DIR |= 0x04;           // Set P4.3 to output direction
11

12
  while(1)
13
  {
14
    b='0';
15
    if(WDTIFG)
16
    {b='1';}                // >BREAKPOINT<
17
      else
18
      {b='2';}  
19
      _BIS_SR(LPM0_bits + GIE);   //  interrupt
20
  }
21
}
22

23
// Watchdog Timer interrupt service routine
24
#pragma vector=WDT_VECTOR
25
__interrupt void watchdog_timer(void)
26
{
27
  if(WDTIFG)
28
  {a='1';}                 // >BREAKPOINT<
29
  
30
    P4OUT ^= 0x04;                  // Toggle P4.3 
31
  
32
    IFG1 &= ~WDTIFG;    // Interruptflag soll geloescht werden
33
    
34
    if(WDTIFG)  
35
  {a='2';}
36
    else
37
    {a='3';}    // Auswertung ob es wirklich gelöscht wurde            
38
    _BIC_SR_IRQ(LPM0_bits);    // >BREAKPOINT<
39
}
PS: Die Breakpoints haben den Programmablauf angehalten und meine 
Variablenüberwachung im CodeComposerStudio aktualisiert!

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