Skip to content

MSP430 - Watchdog Timer

  • Watchdog / "Wachhund" Timer: Komponenten zur Überwachung der Funktion andere Systemkomponenten
  • Im Fehlerfall kann ein Interrupt oder ein System-Reset durchgeführt werden.
  • WDT des MSP430 kann im Intervall-Modus als kontinuierlicher Timer verwendet werden.

alt:"Register des Watchdog Timers", src: "Family Guide S. 347", w:75

Watchdog-Modus

Watchdog-Timer im Watchdog-Modus (5_2a_watchdog)

int main(void) {
  WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer

  P1DIR |= BIT0;
  P1OUT |= BIT0;
  __delay_cycles(100000L);
  P1OUT &= ~BIT0;

  P2IES |= BIT0;
  P2IFG &= ~BIT0;
  P2IE |= BIT0;

  WDTCTL = WDTPW + WDTCNTCL + WDTSSEL;

  __enable_interrupt();

  while (1) {
    __low_power_mode_3();
  }
}

#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR() {
  if (P2IFG & BIT0) {
    P2IFG &= ~BIT0;
    WDTCTL = WDTPW + WDTCNTCL + WDTSSEL;
  }
}

Intervall-Modus

  • kontinuierlich ausgeführter Interrupt
  • Interrupt-Enable:

alt:"Register IE1 für den Watchdog-Timer-Interrupt", src: "Family Guide S. 348", w:75

Watchdog-Timer im Intervall-Modus (5_2b_watchdog_interval)

int main(void) {
  WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer

  P1DIR |= BIT0;
  P1OUT &= ~BIT0;

  WDTCTL = WDTPW + WDTTMSEL + WDTCNTCL + WDTSSEL;
  IE1 |= WDTIE;

  __enable_interrupt();

  while (1) {
    __low_power_mode_3();
  }
}

#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR() {
  P1OUT ^= BIT0;
}

Watchdog Timer Interval Select

WDTISx Divider Interval @ACLK=32.768 kHz Interval @SMCLK=1 MHz
00 /32768 1000 ms 32.768 ms
01 /8192 250 ms 8.192 ms
10 /512 15.625 ms 512 µs
11 / 64 ≈ 1.95 ms 64 µs

Aufgabe

Veränderen Sie das Programm von oben so, dass die LED mit einer Frequenz von 1 Hz blinkt.