Actualmente estoy usando el MSP430FR4133 para hacer un sistema de medición ultrasónico para el volumen de una habitación y me gustaría poder verificar la temperatura de una habitación para calcular la velocidad del sonido antes de realizar cualquier cálculo. Estoy tratando de usar el código en el "Ejemplo de software listo para usar" que usa el sensor de temperatura para mostrar la temperatura en grados Celsius y Fahrenheit. Esta carpeta se encuentra en: link .
Mi código es el siguiente:
main.c
#include <msp430.h>
#include <driverlib.h>
#include "hal_LCD.h"
#include "InputOutput.h"
#include "Temp.h"
#include "Displays.h"
#define PORT1_VECTOR (47 * 2u)
#define TIMER1_A0_VECTOR (54 * 2u)
char introduction[6] = "HELLO";
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
tempInit();
InitInputs();
InitOutputs();
Init_LCD();
double speedofsound = tempInit();
displayScrollText(introduction);
// Disable the GPIO power-on default high-impedance mode
// to activate previously configured port settings
PMM_unlockLPM5();
while(1)
{
double distance[3];
double time[3];
double volume = 0;
displayLength();
SW1();
displayWait();
time[0] = SW2();
displayWidth();
SW1();
displayWait();
time[1] = SW2();
displayHeight();
SW1();
displayWait();
time[2] = SW2();
for(int i =0;i<3;i++)
{
distance[i] = time[i]*speedofsound;
}
volume = distance[0]*distance[1]*distance[2];
displayVolume(volume);
}
}
Temp.c
#include <msp430.h>
#include <driverlib.h>
#include "hal_LCD.h"
#include "Temp.h"
#define CALADC_15V_30C *((unsigned int *)0x1A1A) // Temperature Sensor Calibration-30 C
#define CALADC_15V_85C *((unsigned int *)0x1A1C) // Temperature Sensor Calibration-85 C
volatile unsigned char * tempUnit = &BAKMEM4_H;
volatile int *degC = &BAKMEM5; // Celcius measurement
volatile unsigned char * tempSensorRunning = &BAKMEM3_H; // Temp Sensor running flag
int deg;
Timer_A_initUpModeParam initUpParam_A1 =
{
TIMER_A_CLOCKSOURCE_ACLK, // ACLK Clock Source
TIMER_A_CLOCKSOURCE_DIVIDER_1, // ACLK/1 = 32768Hz
0x2000, // Timer period
TIMER_A_TAIE_INTERRUPT_DISABLE, // Disable Timer interrupt
TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE , // Disable CCR0 interrupt
TIMER_A_DO_CLEAR // Clear value
};
Timer_A_initCompareModeParam initCompParam =
{
TIMER_A_CAPTURECOMPARE_REGISTER_1, // Compare register 1
TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE, // Disable Compare interrupt
TIMER_A_OUTPUTMODE_RESET_SET, // Timer output mode 7
0x1000 // Compare value
};
double tempInit()
{
*tempSensorRunning ^= 0x01;
*tempSensorRunning =1;
//Initialize the ADC Module
/*
* Base Address for the ADC Module
* Use Timer trigger 1 as sample/hold signal to start conversion
* USE MODOSC 5MHZ Digital Oscillator as clock source
* Use default clock divider of 1
*/
ADC_init(ADC_BASE,ADC_SAMPLEHOLDSOURCE_2,ADC_CLOCKSOURCE_ADCOSC,ADC_CLOCKDIVIDER_1);
ADC_enable(ADC_BASE);
//Configure Memory Buffer
/*
* Base Address for the ADC Module
* Use input A12 Temp Sensor
* Use positive reference of Internally generated Vref
* Use negative reference of AVss
*/
ADC_configureMemory(ADC_BASE,ADC_INPUT_TEMPSENSOR,ADC_VREFPOS_INT,ADC_VREFNEG_AVSS);
ADC_clearInterrupt(ADC_BASE, ADC_COMPLETED_INTERRUPT);
// Enable the Memory Buffer Interrupt
ADC_enableInterrupt(ADC_BASE,ADC_COMPLETED_INTERRUPT);
ADC_startConversion(ADC_BASE, ADC_REPEATED_SINGLECHANNEL);
// Enable internal reference and temperature sensor
PMM_enableInternalReference();
PMM_enableTempSensor();
// TimerA1.1 (125ms ON-period) - ADC conversion trigger signal
Timer_A_initUpMode(TIMER_A1_BASE, &initUpParam_A1);
//Initialize compare mode to generate PWM1
Timer_A_initCompareMode(TIMER_A1_BASE, &initCompParam);
// Start timer A1 in up mode
Timer_A_startCounter(TIMER_A1_BASE, TIMER_A_UP_MODE);
// Delay for reference settling
__delay_cycles(300000);
while(*tempSensorRunning)
{
__bis_SR_register(LPM3_bits | GIE); // LPM3 with interrupts enabled
//__no_operation(); // Only for debugger
// Calculate Temperature in degree C and F
signed short temp = (ADCMEM0 - CALADC_15V_30C);
*degC =((long)temp * 10 * (85-30) * 10)/((CALADC_15V_85C-CALADC_15V_30C)*10) + 300;
*tempSensorRunning = 0;
}
double speed = 331+0.6*(*degC);
return speed;
};
He hecho pequeños ajustes en el código para encontrar la velocidad del sonido para la temperatura de la habitación, sin embargo, este código no parece funcionar. Recibo una advertencia a value of type "unsigned short volatile *" cannot be used to initialize an entity of type "int volatile *"
(línea 10 de Temp.c) que no creo que esté afectando mi código, sin embargo no estoy seguro de cómo corregir esto.
Cuando establezco puntos de interrupción dentro del código, se ve que en if(*tempSensorRunning)
el código se ejecuta en un bucle sin fin. ¿Alguien por favor me puede dar algún consejo para este problema?
EDITAR:
He cambiado el código de Temp.c ligeramente para ilustrar los cambios sugeridos. Habiendo establecido puntos de interrupción en todo el código, puedo ver que el problema está ocurriendo en signed short temp = (ADCMEM0 - CALADC_15V_30C);
. El código se detiene aquí y no se mueve más allá de este punto. El desmontaje se mantiene en el punto:
?reset_vector:
010000
¿Alguien puede explicar lo que está pasando aquí?