I am using a MSP430G2553 launchpad and an ADXL 335 accelerometer. The goal is to have the LEDs on the launchpad toggle whenever the accelerometer senses movement. I am able to get an initial read, and calibration done but I seem to be unable to trigger a new read. Below is the code. I do plan to use all three axese but I've coded the interrupt for just one axis thus far just for proof of concept.
#include <msp430.h>
#include <stdint.h>
/*
* main.c
*/
void SetupACC(void);
void CalibrateACC(void);
unsigned int ADC_counter = 0;
unsigned int ADCResult_X, ADCResult_Y, ADCResult_Z;
unsigned int CalVal_X, CalVal_Y, CalVal_Z, temp;
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
BCSCTL1 = CALBC1_16MHZ; // DCO = 16 MHz
DCOCTL = CALDCO_16MHZ;
unsigned int CV_x, ADC_x;
//Enable LEDs
P1OUT &= ~(BIT0 + BIT6);
P1DIR |= (BIT0 + BIT6);
//Accelerometer inputs
P1OUT &= ~(BIT3 + BIT4 + BIT5);
P1DIR &= ~(BIT3 + BIT4 +BIT5);
P1REN |= BIT3 + BIT4 + BIT5;
P1SEL |= BIT3 + BIT4 + BIT5;
P1SEL2 |= BIT3 + BIT4 + BIT5;
SetupACC();
CalibrateACC();
ADC10CTL0 |= ENC | ADC10SC;
__bis_SR_register(GIE);
CV_x = CalVal_X;
ADC_x = ADCResult_X;
while(1) {
if (CV_x > ADC_x)
P1OUT ^= BIT6;
else
P1OUT ^= BIT0;
}
}
void SetupACC(void) {
ADC10CTL0 &= ~ENC;
ADC10CTL0 = ADC10ON + ADC10SHT_2 + SREF_0;
ADC10CTL1 = SHS_0 + CONSEQ_0 + ADC10SSEL_0 + INCH_3;
ADC10AE0 |= BIT3;
ADC10CTL0 |= ADC10IE;
__enable_interrupt();
}
void CalibrateACC(void) {
uint16_t CalibCounter = 0;
unsigned int Value = 0;
__disable_interrupt();
ADC10CTL0 &= ~ENC;
ADC10CTL1 = SREF_0 + INCH_3;
while(CalibCounter < 50) {
P1OUT ^= BIT0;
CalibCounter++;
ADC10CTL0 |= ENC | ADC10SC;
while (ADC10CTL1 & BUSY);
Value += ADC10MEM;
}
CalVal_X = Value/50;
ADC10CTL0 &= ~ENC;
__enable_interrupt();
}
#pragma vector = ADC10_VECTOR
__interrupt void ADC10_ISR(void) {
if (ADC_counter == 0) {
ADC10CTL0 &= ~ENC;
ADC10CTL1 = SREF_0 + INCH_3;
ADCResult_X = ADC10MEM;
ADC10CTL0 |= ENC | ADC10SC;
}
ADC_counter = 0;
}