Other Parts Discussed in Thread: LM35, MSP-EXP430G2ET, MSP430G2553
器件型号:MSP-EXP430FR2311-design-files
主题中讨论的其他器件: LM35、 MSP-EXP430G2ET、 MSP430G2553
#include <msp430.h>
volatile unsigned int VT=0;
float Vin=0.0;
char buffer[20];
unsigned int temp_entera;
unsigned int temp_decimal;
unsigned int temp_x100=0;
//LPM0 = Lower Power Mode 0
//------------------------------------------------------------------------------
// FUNCIONES
//--------------------------------------------------------------------------
void UART_CONFIG(void)
{
if (CALBC1_1MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings, DCOx=0 MODx=0
BCSCTL1 = CALBC1_1MHZ; // Configura el DCO en 1MHz, selecciona el rango de operación del DCO
DCOCTL = CALDCO_1MHZ; // Ajuste fino del DCO para ~1 MHz DCOx MODx calibrados
P1SEL = BIT1 + BIT2 ; // Configura la funcion especial de UART para P1.1 = RXD y P1.2=TXD
P1SEL2 = BIT1 + BIT2 ; // Configura la funcion especial de UART para P1.1 = RXD y P1.2=TXD
UCA0CTL1 |= UCSWRST; // UCSWRST = 0, UART en reset
UCA0CTL1 |= UCSSEL_2; // usa SMCLK (referencia de los perifericos) (pone en uno el bit de UCSSEL_2)
UCA0BR0 = 104; // 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1 ajusta el baudrate
UCA0CTL1 &= ~UCSWRST; // UCSWRST = 0 inicializa la maquina de estados para UART en el USCI, UART empieza a funcionar
// IE2 |= UCA0RXIE; // habilita la interrupción de recepción
}
void ADC_CONFIG(void)
{
ADC10CTL0 &= ~ENC; //Deshabilita el ADC para poder cambiar su configuración (ENC = 0)
ADC10CTL0 = ADC10SHT_2 + ADC10ON; //Configura el muestreo del ADC a 16 ciclos + enciende el ADC
ADC10CTL1 = INCH_3; // Selecciona el canal del ADC a usar, en este caso A3 = P1.3
ADC10AE0 |= 0x08; // habilita el pin como entrada analógica
ADC10CTL0 |= ENC + ADC10SC; //Habilita el ADC + empieza una conversión
}
void serial_in(const unsigned char data) //Envia por UART un dato a la vez
{
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF = data;
}
void send_uint(unsigned int n) //convierte un dato en caracter y lo envía por UART
{
char buf[6];
int i = 0;
if (n == 0)
{
serial_in('0');
return;
}
while (n > 0)
{
buf[i++] = (n % 10) + '0';
n /= 10;
}
while (i--)
serial_in(buf[i]);
}
//------------------------------------------------------------------------------
// MAIN
//---------------------------------------------------------------------------
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
UART_CONFIG();
ADC_CONFIG();
unsigned long aux;
while(1)
{
ADC10CTL0 |= ADC10SC; // inicia conversión
while (ADC10CTL1 & ADC10BUSY); // espera a que termine
VT = ADC10MEM; //el valor del ADC se guarda en la variable VT
Vin=(VT/1023)*(3.3);
temp_entera = Vin / 10; //divide el valor de VT entre 10 para obtener la parte entera de la temperatura
temp_decimal = Vin % 10; // obtiene el residuo de la división entera de VT entre 10
send_uint(temp_entera);
serial_in('.');
if (temp_decimal < 10) serial_in('0');
send_uint(temp_decimal);
serial_in('\r'); //retorno de carro
serial_in('\n'); //salto de linea
}
}
//------------------------------------------------------------------------------
// ISR
//---------------------------------------------------------------------------
/*
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(LPM0_bits);
}
*/