MSP430G2553 as a watchdog
From emboxit
- 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:
- CCS5 and IAR Embedded Workbench 5.6 (kickstart license) code
<cpp> //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
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
}
- 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:
}
- 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>