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
}
|