Arduino-like analogRead() and timing functions for the MSP430
- March 9th, 2011
- Posted in Launchpad . MSP430
- Write comment
I saw this article on Hack a Day today for a library that supports some Arduino-like functions. I thought I’d share a couple of code snippets I have for analogRead(), millis(), and delayMillis(). The delay function on the HaD article used a software delay loop. My millis() and delayMillis() use the WDT.
Here’s my take on the time functions:
#include "msp430g2231.h"
#define MCLK_FREQUENCY 1000000
#define WDT_DIVIDER 512
const unsigned long WDT_FREQUENCY = MCLK_FREQUENCY / WDT_DIVIDER;
volatile unsigned long wdtCounter = 0;
unsigned long millis(){
return wdtCounter / ((float)WDT_FREQUENCY / 1000);
}
void delayMillis(unsigned long milliseconds){
unsigned long wakeTime = wdtCounter + (milliseconds * WDT_FREQUENCY / 1000);
while(wdtCounter < wakeTime);
}
void main(void){
DCOCTL = CALDCO_1MHZ;
BCSCTL1 = CALBC1_1MHZ;
WDTCTL = WDTPW + WDTTMSEL + WDTIS1;
IE1 |= WDTIE;
_BIS_SR(GIE);
// toggle pin every second
P1DIR |= BIT0;
while(1){
P1OUT ^= BIT0;
delayMillis(1000);
}
}
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void){
wdtCounter++;
}
And here’s the analog functions:
#include "msp430g2231.h"
#define ANALOG_PIN 4
unsigned int analogRead(){
ADC10CTL0 |= ADC10SC;
while(ADC10CTL1 & ADC10BUSY);
return ADC10MEM;
}
void analogPinSelect(unsigned int pin){
if(pin < 8){
ADC10CTL0 &= ~ENC;
ADC10CTL1 = pin << 12;
ADC10CTL0 = ADC10ON + ENC + ADC10SHT_0;
}
}
void main(void){
unsigned int analogValue;
DCOCTL = CALDCO_1MHZ;
BCSCTL1 = CALBC1_1MHZ;
WDTCTL = WDTPW + WDTHOLD;
// read adc repeatedly
analogPinSelect(ANALOG_PIN);
while(1){
analogValue = analogRead();
}
}
They’re not pure Arduino, but close.

I love the analogRead() function. Would you be willing to contribute it to the TIWrap library?
Thanks,
mike hogan
Thanks, Mike! You absolutely can add it to TIWrap.
Thanks for the millis() function. Makes it easy to use the WDT as a timer for a angular rate function I’m working on.
Thanks alot for the analogRead fuction. Works like a charm.