Hi all. I'm having trouble with the ADC10 in my msp430g2553. I want to have 2 signals as outputs in P1.1 and P1.2, and want to measure an external voltage using P1.5. I want to do all this at a rate of about 3Hz, which I am achieving. I have pasted lots of external codes that work separately into one, but they don't work altogether. Here is my code, if anyone could tell me what is wrong it would be greatly appreciated. There might be several mistakes as I am just learning how to program in C.
#include <msp430g2553.h>
#define LED0 BIT0
#define LED1 BIT6
unsigned int esp;
unsigned int value=0;
void ConfigureAdc(void)
{
/* Configure ADC Channel */
ADC10CTL1 = INCH_5 + ADC10SSEL_3; // Channel 5, Elijo SMCLK
ADC10CTL0 = SREF_1 + ADC10SHT_3 + ADC10ON + ADC10IE; //Vcc & Vss as reference
ADC10AE0 |= BIT5; //P1.5 ADC option
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
//Calibrate DCO for 1MHz operation
// if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
// {
// while(1); // If cal constants erased, trap CPU!!
// }
// BCSCTL1 = CALBC1_1MHZ;
// DCOCTL = CALDCO_1MHZ;
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO
IFG1 &= ~OFIFG; // Clear OSCFault flag
//_BIS_SR(SCG1 + SCG0); // Stop DCO
BCSCTL2 |= SELM_3 + SELS; // SMCLK = MCLK = VLO = 12kHz
P1SEL |= 0x16; // P1.1 - P1.2, P1.4 option select
P1SEL2 |= 0x10; // P1.4 option select
P1DIR |= 0x17; // P1.0 - P1.2, P1.4 outputs
P1OUT = 0;
TACCTL0 = OUTMOD_4 + CCIE; // CCR0 toggle, interrupt enabled
TACCTL1 = OUTMOD_4 + CCIE; // CCR1 toggle, interrupt enabled
TACCTL2 = OUTMOD_4 + CCIE; // CCR2 toggle, interrupt enabled
TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, Contmode, int enabled
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
//WDTCTL = WDTPW + WDTHOLD; // Stop WDT
//BCSCTL1 = CALBC1_1MHZ; // Set range
//DCOCTL = CALDCO_1MHZ;
//BCSCTL2 &= ~(DIVS_3); // SMCLK = DCO = 1MHz
P1DIR |= LED0 + LED1;
P1SEL |= BIT5; //ADC Input pin P1.5
//P1OUT &= ~(LED0 + LED1);
ConfigureAdc();
__enable_interrupt(); // Enable interrupts.
while(1)
{
__delay_cycles(1000); // Wait for ADC Ref to settle
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled
value = ADC10MEM;
if (value>200)
{
P1OUT &= ~(LED0 + LED1);
P1OUT |= LED0;
}
else
{
P1OUT &= ~(LED0 + LED1);
P1OUT |= LED1;
}
}
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
if(TACCTL0 & CCI) // If output currently high
{
if (esp == 0){
TACCR0 += 2250;
//esp += 1;
}
else{
TACCR0 += 2000; // 50% high
}
}
else
{
TACCR0 += 1750; // 50% low
}
}
// Timer A1 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A1(void)
{
switch( TA0IV )
{
case 2: if(TACCTL1 & CCI) // If output currently high
{
TACCR1 += 500; // 12.5% high
}
else
{
TACCR1 += 3500; // 87.5% low
}
break;
case 4: if(TACCTL2 & CCI) // If output currently high
{
TACCR2 += 1000; // 25% high
}
else
{
TACCR2 += 3000; // 75% low
}
break;
//case 10: P1OUT ^= 0x01; // Timer overflow
//break;
default: break;
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
__bic_SR_register_on_exit(CPUOFF); // Return to active mode
}
Thanks a lot in advance.