Lectura de múltiples canales utilizando ADC10 y DTC

5

Estoy intentando leer los valores de voltaje en dos canales en eZ430-RF2500T, y transferir el resultado al AP conectado a una PC. Aunque puedo leer con éxito desde un solo canal, no puedo hacerlo usando dos canales.

Aquí está mi código:

int * readPtr = (int *)0x200;
ADC10CTL1 = INCH_2 + CONSEQ_1;
ADC10CTL0 = REF2_5V + SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;
for (countDown = 240; countDown > 0; countDown--); //delay to allow references to settle

ADC10AE0 |= 0x06; //110

ADC10DTC1 = 0x02;                         // 2 conversions
ADC10SA = 0x200;                        // Data buffer start, same as readPtr above

ADC10CTL0 |= ENC + ADC10SC; //Sampling and conversion start
while(!(ADC10CTL0 & ADC10IFG)); // wait till the block conversion is complete
ADC10CTL0 &= ~ADC10IFG; //reset ADC10IFG
//code for reading from readPtr

Tenga en cuenta que no se están utilizando interrupciones; los resultados se leen después de que se establece el bit ADC10IFG.

No obtengo ningún resultado con este código. La parte de 'reading from readPtr' nunca se alcanza.

Sin embargo, si configuro ADC10DTC1 en 0x01, puedo leer desde el pin ordenado más alto. Es decir. dado que ADC10DTC1 es 0x01, puedo leer de A2 si se selecciona INCH_2, y de A1 si se selecciona INCH_1.

No puedo obtener conversiones para ambos A2 y A1, sin embargo.

Cualquier ayuda será muy apreciada.

¡Gracias!

EDITAR: Ahora estoy tratando de hacer que esta interrupción se base. Aunque no estoy seguro de cómo codificarlo.

    
pregunta Chaitanya

1 respuesta

3

Ahora tengo este trabajo. La parte ADC10 ahora es similar a las muestras de TI.

Este es el código que puede leer correctamente desde 4 pines simultáneamente:

unsigned int res[5]; //for holding the conversion results
void main (void)
{ 

  //code for connecting to AP

  //reading voltage
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  ADC10CTL1 = INCH_4 + CONSEQ_1;            // A4/A3/A2/A1/A0, once multi channel
  ADC10CTL0 = REF2_5V + ADC10SHT_2 + MSC+ REFON + ADC10ON + ADC10IE; //2.5 reference voltage
  ADC10AE0 = 0x1F;                          // P2.0,1,2,3,4 ADC option select
  ADC10DTC1 = 0x5;                         // 5 conversions
  P1DIR |= 0x01;                            // Set P1.0 output

  for (;;)
  {
    P1OUT |= 0x01;                          // Set P1.0 LED on
    ADC10CTL0 &= ~ENC;
    while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active
    ADC10SA = (int)res;                        // Data buffer start
    ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion ready
    __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
    P1OUT &= ~0x01;                         // Clear P1.0 LED off
  }

}

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
    //code from reading from res and sending it to AP
  __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
}

¡Gracias por la ayuda!

    
respondido por el Chaitanya

Lea otras preguntas en las etiquetas