This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430g2553 and ADC [problem] [launchpad]

Other Parts Discussed in Thread: MSP430G2553, LM35

Hi people!

 

I try to save 3 conversion of my DAC (3 sensors), but I have a problem. I only can save 1 of them.

When i try to save, for example, the temperature sensor (P1.5), It's save succesful, but, when I try to save the humedity sensor (P1.4) I cant save that and i dont know why :/

 

There is the codes: (and sorry for my bad english)

functions.c (funciones.c)

#include <msp430g2553.h>

//#include "variables.h"
 
/*
Subprograma conf_WTD
 
· Especificaciones
  - El WatchDog quedará configurado como un Timer
  - Activar el flag con interrupción cada ACLK/512: 12000/512 --> (aprox): 42.67 ms.
  - Reloj del WatchDog asociado al ACLK ~12 kHz.
 
· Descripcion
  - El WatchDog configurado como timer será el encargado de activar al módulo de
  - ADC10 ha que realice una muestra.
*/
 
void conf_WDT() {
WDTCTL = WDTPW + WDTTMSEL + WDTSSEL + WDTCNTCL + WDTIS1; // Configuramos el WTD como Timer
IE1 |= WDTIE;  // Habilitamos la interrupción por el WatchDog
}
 
/*
Subprograma conf_IO
 
· Especificaciones
  - Configuración de los puertos de entrada y salida del MSP.
  - Configuraremos tanto el puerto 1.5 del MSP para realizar la medición de la temperatura
    gracias al LM35 como de los puertos 1.1 y 1.2 para el protocolo I2C.
*/
 
void conf_IO() {     // Falta configurar bien los puertos dedicados al I2C
//P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4+BIT6+BIT7; // Puertos 1.0, 1.1, 1.2, 1.3, 1.4, 1.6 y 1.7 como salida
P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT6+BIT7; // prueba
P1DIR &= ~BIT5;  // Puero 1.5 como entrada (lectura del LM35)
P1DIR &= ~BIT4;  // Lectura del divisor de tensión
}
 
 
/*
Subprograma conf_CLK
 
· Especificaciones
  - Configuración del reloj interno DCO a aproximadamente 8Mhz
  - Activación del reloj auxiliar ACLK para su uso con el WatchDog
 */
 
void conf_CLK() {
DCOCTL = CALDCO_8MHZ;
BCSCTL1 = CALBC1_8MHZ;
 
BCSCTL3 = LFXT1S1;
}
 
/*
Subprograma conf_ADC
 
· Especificaciones
  - Valores de referencia del conversor: VR+ --> Vref+, VR- --> Vss
  - Muestreo 64 x reloj del ADC
  - Valor de referencia interno del MSP430 (2.5 V)
  - Activaremos flag con interrupción
  - El puerto configurado para la lectura analógica del ADC sera el 1.5
  - Reloj interno del ADC: 5Mhz / 3 = (aprox) 1.67 Mhz
 
· Descripción:
  - El modulo ADC10 implementado en nuestro MSP430 será el encargado de realizar
    la medición analógica de nuestro sensor monolítico LM35.
  - Según la hoja de caracteristicas proporcionada podemos observar que la lectura
    que obtendremos en el registro del ADC10 obedecerá a la siguiente expresión:
    N_ADC = 1023·(V_IN - V_R-)/(V_R+ - V_R-)
 */
 
void conf_ADC() {
char degC;  // Variable utilizada para aplicar un retardo SW
 
ADC10CTL0 = SREF_1 + ADC10SHT_3 + ADC10ON + ADC10IE + REFON + REF2_5V;  // Configuracion de los parametros del ADC, voltajes
//ADC10CTL1 = INCH_5 + ADC10DIV_3;                                        // de referencia, activando dichos valores, etc...
 
for(degC = 240; degC > 0; degC--);  // Retrado para poder establecer la referencia de forma correcta.
ADC10AE0 |= BIT5+BIT4; // Habilitamos el ADC por el puerto 1.5
}
 
int conf_ADCP(int seleccion) {
 
switch(seleccion) {
case 1:
ADC10CTL1 = INCH_5 + ADC10DIV_3;
ADC10AE0 = 0x20;
seleccion = 0;
break;
case 0:
ADC10CTL1 = INCH_4 + ADC10DIV_3;
ADC10AE0 = 0x10;
seleccion = 1;
break;
}
return seleccion;
}

============================================================================================================================

#define VARIABLES_H_

 
void conf_WDT();  // Configuracion del WatchDog
void conf_CLK();  // Configuracion del Reloj
void conf_ADC(); // Configuracion del conversor Analogico --> Digital
void conf_IO();  // Configuración de los puertos de entrada y salida
int conf_ADCP(int seleccion);  // Configuración de prueba
 
 
int seleccion = 0;
float medida1 = 0;
float tempFinal, Vinput = 0;
float temp = 0;  // En esta variable guardaremos el valor de la temperatura
unsigned int CalcTempFlag, tempCont = 0;  // Valor a guardar del tiempo de refresco de la medicion de la
  // temperatura
 
#endif /* VARIABLES_H_ */

============================================================================================================================

main.c

/*

 
|                                                                                                 |
|  |
|         / \  |
|          |    -----------------  |
|          |    |     MSP430    |  |
|          ---- | vcc      p1.5 | -----------------  Sensor LM35  (temperature)                                 |
|               |          p1.4 | -----------------  humidity sensor                              |
| Tranmision -- | p1.1          |  |
| datos I2C  -- | p1.2          |    |
|               |               |      |
|               |               |  |
|               |               |  |
|               |               |  |
|               -----------------  |
|  |
| NOTA: Falta la implementación del protocolo I2C.  |
|  |
O-------------------------------------------------------------------------------------------------O
*/
#include <msp430g2553.h>
#include <stdio.h>
//#include "stdbool.h"
#include "variables.h"
//#include "funciones.c"
 
int main(void) {
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
 
    // Llamamos a las funciones desarrolladas anteriormente
conf_CLK();  // Llamada a la configuración del reloj
conf_ADC();  // Llamada a la configuracion del ADC
conf_IO();  // Llamada a la configuración de los puertos de entrada/salida
 
_enable_interrupts();
conf_WDT(); // Llamada a la nueva configuracion del WatchDog
 
ADC10CTL0 |= ENC + ADC10SC; // Iniciamos la conversión de nuestro ADC (LM35)
do{
   if (CalcTempFlag == 1)  // Promediado realizado
   {
     temp = 0;               // Reset de ...
     CalcTempFlag = 0;
     tempCont = 0;           // ... variables.
     }
} while(1);
//return 0;
}
/*
Rutina de interrupción del ADC
 
· Funcionamiento
  - Se produce una interrupción cada aproximadamente unos 42 ms, momento en el cual
    actualizamos la variable temp, que será la que guarde el valor medido.
*/
 
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void) {
WDTCTL = WDTPW + WDTHOLD; // Paramos el WatchDog
 
if(tempCont == 70) { // Puesto que ahora realiza dos mediciones, será x2 el numero de iteraciones
//if(tempCont == 35) { // Ha hecho el promediado de las 35 mediciones
CalcTempFlag = 1;
tempFinal = temp/(tempCont*5);
temp = 0;
} else {
seleccion = conf_ADCP(seleccion);
switch(seleccion) {
case 0:
Vinput = ADC10MEM*0.002444;  // Voltaje a la entrada de la patilla 1.5
temp += Vinput*1000;  // Puesto que Vinput es el voltaje, para pasar a ºC hay que multiplicar por 1000.
break;
case 1:
Vinput = ADC10MEM*0.002444;
medida1 = Vinput;
break;
}
//Vinput = ADC10MEM*0.002444;  // Voltaje a la entrada de la patilla 1.5
//temp += Vinput*1000;  // Puesto que Vinput es el voltaje, para pasar a ºC hay que multiplicar por 1000.
tempCont++;
}
conf_WDT();
}
 
/*
Rutina de interrupcion del WatchDog
 
· Funcionamiento
  - Cuando se produzca una interrupcion por parte del WatchDog, esta rutina se encargará
    de que volvamos a activar la conversión del convertidor Analógico-Digital
 */
 
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void) {
//seleccion = conf_ADCP(seleccion); // prueba de selección correcta
ADC10CTL0 |= ENC + ADC10SC; // Iniciamos la conversión
 
}

**Attention** This is a public forum