Previously I had developed a simple demonstrator of timer interrupts on the MSP430 Launchpad with Energia. This sort of worked but I failed to acknowledge the interrupt in the timer control register so the foreground function (loop) never ran. This version fixes that and tidies up the code a little. In this program the foreground function toggles the red LED and the interrupt service routine toggle the green LED.
#include <msp430.h> void setup() { // put your setup code here, to run once: pinMode(P1_6,OUTPUT); // make the LED pin outpu pinMode(P1_0,OUTPUT); setupTimer(1000); // set timer period to 1000 micro seconds } void loop() { digitalWrite(P1_0,HIGH); delay(100); digitalWrite(P1_0,LOW); delay(100); } void OnTimer() { static int msCount=0;// Count milliseconds to allow a 1 second pulse static int state=0; // Remember LED state for toggling purposes msCount++; if (msCount >= 1000) { msCount = 0; digitalWrite(P1_6,state); // Write to LED state=~state; // toggle state } } void setupTimer(unsigned Period) { // Configuration word // Bits 15-10: Unused // Bits 9-8: Clock source select: set to SMCLK (16MHz) // Bits 7-6: Input divider: set to 8 // Bits 5-4: Mode control: Count up to TACCRO and reset // Bit 3: Unused // Bits 2: TACLR : set to initially clear timer system // Bit 1: Enable interrupts from TA0 // Bit 0: Interrupt (pending) flag : set to zero (initially) TA0CTL=0b0000001011010010; TACCR0=Period*2; // Set TACCR0 = Period*2 (2MHz clock) TACCTL0=BIT4; // Enable interrupts when TAR = TACCR0 } // The address function that follows this vector statement is placed in the specified location Interrupt Vector table #pragma vector=TIMER0_A0_VECTOR __interrupt void timerA0ISR(void) { // Timer A0 Interrupt service routine OnTimer(); TA0CTL &= ~BIT0; // Acknowledge the interrupt }