MSP430G2553 as a watchdog

From emboxit
Revision as of 06:38, 18 March 2014 by NikoSysop (Talk)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  • TI launchpad 430 is supplied with [MSP430G2553 in DIP20 package] on board.
  • Below is the code for a simple watchdog,
  • P1.6 output is activated every ~12hours
  • P1.4 polls for an active signal that resets (pets) the watchdog timer every 10ms.
  • The output line P1.6 is used to drive a mosfet switch that is controlling the system power-supply, so it is HIGH most of the time and goes LOW for 10s every 12 hours (if not reset by P1.4 line)
  • Current consumption measured at 70uA
  • Tested with CCS5, IAR and Energia
  • line P1.0, ~10ms interrupt measurement: Msp430g2553 switch.JPG



  • CCS5 and IAR Embedded Workbench 5.6 (kickstart license) code

<cpp> //BUOY TIMER

  1. include <msp430g2553.h>
  2. define ten_ms 115 //230
  3. define one_sec 20000
  4. define time2reset 4320000 //2160000 //4320000 // 43200 sec is 3600sec/hour x 12 hours, int is at 10Hz
  5. define time2set 4321000 //2160500 //4321000 // 10 seconds active output

volatile unsigned long counter = 4319000; // TESTING AT POWER ON, TURNS BUOY OFF FOR 10sec, 10sec after power-on

void main(void) {

 DCOCTL = CALDCO_1MHZ;            // Set DCO to 1MHz
 BCSCTL1 = CALBC1_1MHZ;           // Set DCO to 1MHz
 BCSCTL3 |= LFXT1S_2;             // Select VLO for ACLK
 WDTCTL = WDTPW + WDTHOLD;        // Stop watchdog timer, WILL BE ACTIVATED BY ISR
 P1REN = BIT7+BIT5+BIT4+BIT3+BIT2+BIT1;  // ENABLE P1 inputs PULL UP/DOWN
 P1OUT = 0;                       // P1 inputs  PULL-DOWN
 P2REN = BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5;  // ENABLE P2 (6 available on chip) PULL UP/DOWN
 P1DIR |= BIT0;                   // Set P1.0 to output direction
 P1OUT &= ~BIT0;                  // Set the red LED off
 P1DIR |= BIT6;                   // Set P1.6 to output direction, contols the MOSFET-SWITCH
 P1OUT |= BIT6;                   // OUTPUT HIGH, BUOY IS ACTIVE
 TA0CCR0 = ten_ms;                // Count limit (16 bit), set the Interrupt period
 TA0CCTL0 = 0x10;                 // Enable Timer A0 interrupts, bit 4=1
 TA0CTL = TASSEL_1 + MC_1;        // Timer A0 with ACLK, count UP
_BIS_SR(LPM3_bits + GIE);        // set LPM3,  interrupts enabled

}

  1. pragma vector=TIMER0_A0_VECTOR // Timer0 A0 interrupt service routine
 __interrupt void Timer0_A0 (void) {
  WDTCTL = WDTPW + WDTCNTCL ;      //pet the dog
  P1OUT ^= BIT0;                   //isr is active, to oscilloscope
  counter = counter + 1;
  if (P1IN & BIT4) counter = 0;    // 10ms Polling for a timer-clear signal
  if (counter == time2reset)  {
    P1OUT &= ~BIT6;                // RESET output
  }
  else if (counter > time2set) {
    P1OUT |= BIT6;                 // SET output
    counter = 0;
  }

} </cpp>


  • Energia (sketch) code

<cpp> volatile unsigned long counter = 4319000; // TESTING AT POWER ON, TURNS BUOY OFF FOR 10sec, 10sec after power-on

void setup() { //BUOY TIMER

#include <msp430g2553.h>
#define ten_ms    115 //230
#define one_sec   20000
#define time2reset 4320000 //2160000  //4320000 // 43200 sec is 3600sec/hour x 12 hours, int is at 10Hz
#define time2set   4321000 //2160500  //4321000 // 10 seconds active output

 DCOCTL = CALDCO_1MHZ;            // Set DCO to 1MHz
 BCSCTL1 = CALBC1_1MHZ;           // Set DCO to 1MHz
 BCSCTL3 |= LFXT1S_2;             // Select VLO for ACLK

 WDTCTL = WDTPW + WDTHOLD;        // Stop watchdog timer, WILL BE ACTIVATED BY ISR
 P1REN = BIT7+BIT5+BIT4+BIT3+BIT2+BIT1;  // ENABLE P1 inputs PULL UP/DOWN
 P1OUT = 0;                       // P1 inputs  PULL-DOWN
 P2REN = BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5;  // ENABLE P2 (6 available on chip) PULL UP/DOWN
 P1DIR |= BIT0;                   // Set P1.0 to output direction
 P1OUT &= ~BIT0;                  // Set the red LED off
 P1DIR |= BIT6;                   // Set P1.6 to output direction, contols the MOSFET-SWITCH
 P1OUT |= BIT6;                   // OUTPUT HIGH, BUOY IS ACTIVE
 TA0CCR0 = ten_ms;                // Count limit (16 bit), set the Interrupt period
 TA0CCTL0 = 0x10;                 // Enable Timer A0 interrupts, bit 4=1
 TA0CTL = TASSEL_1 + MC_1;        // Timer A0 with ACLK, count UP
_BIS_SR(LPM3_bits + GIE);        // set LPM3,  interrupts enabled

}

void loop() {

 // put your main code here, to run repeatedly:  

}

  1. pragma vector=TIMER0_A0_VECTOR // Timer0 A0 interrupt service routine
 __interrupt void Timer0_A0 (void) {
  WDTCTL = WDTPW + WDTCNTCL ;      //pet the dog
  P1OUT ^= BIT0;                   //isr is active, to oscilloscope
  counter = counter + 1;
  if (P1IN & BIT4) counter = 0;    // 10ms Polling for a timer-clear signal
  if (counter == time2reset)  {
    P1OUT &= ~BIT6;                // RESET output
  }
  else if (counter > time2set) {
    P1OUT |= BIT6;                 // SET output
    counter = 0;
  }

} </cpp>