I am testing ADC of MSP430F479. I could success in using A3, and A4 analog input
reading from the DAC output.
However, the similar program does not work for A0 and A1 analog input. A0 and A1
are assigned to P6.0, 6.1 and P6.3 and 6.4. The value obtained from them are
very small value instead of 0.6V.
I connected A0- and A1- to the GND same as the A4- to the GND.
Following is the program used to check the analog A1 input.. Does someone
find some mistake in this?
-----------------------------------------------------
#include "msp430xG47x.h"
#define Num_of_Results 8
unsigned int results[Num_of_Results];
float g_ad;
void main(void)
{
volatile unsigned int i; // Use volatile to prevent removal
// by compiler optimization
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
SD16CTL = SD16REFON;
for (i = 0; i < 10000; i++); // Delay for 32 kHz crystal
DAC12_0CTL = DAC12IR + DAC12SREF_3 + DAC12AMP_5 + // SD16 Ref,
DAC12OPS + DAC12ENC + DAC12CALON;
FLL_CTL0 |= XCAP14PF; // Configure load caps
P1SEL |= 0x40; // DAC P1.6
P1SEL |= 0x04 + 0x08; // AD4 P1.2, 1.3
P6SEL |= 0x01 + 0x02; // AD1 P6.0, 6.1
P6SEL |= 0x08 + 0x10; // AD0 P6.3, 6.4
for (i = 0; i < 10000; i++); // Delay for 32 kHz crystal to
// stabilize
SD16CTL = SD16REFON + SD16SSEL0; // 1.2V ref, SMCLK
SD16CCTL0 |= SD16IE + SD16UNI ;
SD16INCTL0 |= SD16INTDLY_0 + SD16INCH_1; // INCH_0,1,4
_EINT();
for (i = 0; i < 0x3600; i++); // Delay for 1.2V ref startup
SD16CCTL0 |= SD16SC; // Set bit to start conversion
DAC12_0DAT = 0x800; // 2048h
for(;;) {
__bis_SR_register(LPM0_bits+GIE);
}
}
#pragma vector=SD16A_VECTOR
__interrupt void SD16ISR(void)
{
static unsigned int index = 0;
switch (SD16IV)
{
case 2: // SD16MEM Overflow
break;
case 4: // SD16MEM0 IFG
results[index] = SD16MEM0;
g_ad = results[index] * 0.6 / 0xFFFF; // unipolar
if (++index == Num_of_Results)
{
index = 0;
}
break;
}
__bic_SR_register_on_exit(LPM0_bits); // Enter LPM0
}