Other Parts Discussed in Thread: LM35,
Tool/software: Code Composer Studio
Hello all,
I am trying to set up ADC12 to read data from a temperature sensor LM35. I have an interrupt that will gather the data and then i do my conversion once I get the info but it seems like it is not leaving the ISR once it is triggered.
I've looked everywhere and even compared my code to the example TI puts out for each MSP430 controller. I am new to programming these controllers beyond turning on the LEDs.
Below is my code. Any help would be appreciated.
#include <msp430fr6989.h> #include <msp430.h> #include <stdio.h> //void Initialize_LCD(); //void display_num_lcd(); void ADC_SETUP(); #define redLED BIT0 // Red at P1.0 //Temperature sensor unsigned int temp; volatile int IntDegF; volatile int IntDegC; /** * main.c */ int main(void) { //--------------------------------------- volatile unsigned int n; int x = 0; WDTCTL = WDTPW + WDTHOLD; // stop watchdog timer PM5CTL0 &= ~LOCKLPM5; //======================================= P1DIR |= redLED; // Pins as output P1OUT &= ~redLED; // Red off P1SEL1 |= BIT3; // Select P1.3 for analog input P1SEL0 |= BIT3; ADC_SETUP(); // ADC set-up call function call ADC12CTL0 |= ADC12ENC; while(x==0) { ADC12CTL0 |= ADC12SC | ADC12ENC; //Start conversion software-trigger? _bis_SR_register(CPUOFF + GIE); //Enables Low powered mode 0 and enables global interrupts after returning __no_operation(); //From interrupt routine //CPUOFF = Low powered mode //GIE = General Interrupt Enable interrupts x++; } //conversion IntDegF = temp * 1200 / 4095; IntDegF = IntDegF/10; //IntDegF = (ADC_value * 1200 mV)/4095 * 1/10 //Reference voltage is 1.2 or 1200 mV //2^12 - 1 = 4095 (ADC is 12 bits) //Gain or slope of LM35 is 10 mV / C //Rearrange the numbers and you get: 1200 mV / 10 mV per C = 1200 P1OUT ^= redLED; return 0; } //Tell the compiler that the next //Function is an ISR //Code taken from examples #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector = ADC12_VECTOR __interrupt void ADC12_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void) #else #error Compiler not supported! #endif { switch(__even_in_range(ADC12IV, ADC12IV_ADC12RDYIFG)) { case ADC12IV_NONE: break; // Vector 0: No interrupt case ADC12IV_ADC12OVIFG: break; // Vector 2: ADC12MEMx Overflow case ADC12IV_ADC12TOVIFG: break; // Vector 4: Conversion time overflow case ADC12IV_ADC12HIIFG: break; // Vector 6: ADC12BHI case ADC12IV_ADC12LOIFG: break; // Vector 8: ADC12BLO case ADC12IV_ADC12INIFG: break; // Vector 10: ADC12BIN case ADC12IV_ADC12IFG0: // Vector 12: ADC12MEM0 Interrupt temp = ADC12MEM0; // Exit from LPM0 and continue executing main __bic_SR_register_on_exit(LPM4_bits); break; case ADC12IV_ADC12IFG1: break; // Vector 14: ADC12MEM1 case ADC12IV_ADC12IFG2: break; // Vector 16: ADC12MEM2 case ADC12IV_ADC12IFG3: break; // Vector 18: ADC12MEM3 case ADC12IV_ADC12IFG4: break; // Vector 20: ADC12MEM4 case ADC12IV_ADC12IFG5: break; // Vector 22: ADC12MEM5 case ADC12IV_ADC12IFG6: break; // Vector 24: ADC12MEM6 case ADC12IV_ADC12IFG7: break; // Vector 26: ADC12MEM7 case ADC12IV_ADC12IFG8: break; // Vector 28: ADC12MEM8 case ADC12IV_ADC12IFG9: break; // Vector 30: ADC12MEM9 case ADC12IV_ADC12IFG10: break; // Vector 32: ADC12MEM10 case ADC12IV_ADC12IFG11: break; // Vector 34: ADC12MEM11 case ADC12IV_ADC12IFG12: break; // Vector 36: ADC12MEM12 case ADC12IV_ADC12IFG13: break; // Vector 38: ADC12MEM13 case ADC12IV_ADC12IFG14: break; // Vector 40: ADC12MEM14 case ADC12IV_ADC12IFG15: break; // Vector 42: ADC12MEM15 case ADC12IV_ADC12IFG16: break; // Vector 44: ADC12MEM16 case ADC12IV_ADC12IFG17: break; // Vector 46: ADC12MEM17 case ADC12IV_ADC12IFG18: break; // Vector 48: ADC12MEM18 case ADC12IV_ADC12IFG19: break; // Vector 50: ADC12MEM19 case ADC12IV_ADC12IFG20: break; // Vector 52: ADC12MEM20 case ADC12IV_ADC12IFG21: break; // Vector 54: ADC12MEM21 case ADC12IV_ADC12IFG22: break; // Vector 56: ADC12MEM22 case ADC12IV_ADC12IFG23: break; // Vector 58: ADC12MEM23 case ADC12IV_ADC12IFG24: break; // Vector 60: ADC12MEM24 case ADC12IV_ADC12IFG25: break; // Vector 62: ADC12MEM25 case ADC12IV_ADC12IFG26: break; // Vector 64: ADC12MEM26 case ADC12IV_ADC12IFG27: break; // Vector 66: ADC12MEM27 case ADC12IV_ADC12IFG28: break; // Vector 68: ADC12MEM28 case ADC12IV_ADC12IFG29: break; // Vector 70: ADC12MEM29 case ADC12IV_ADC12IFG30: break; // Vector 72: ADC12MEM30 case ADC12IV_ADC12IFG31: break; // Vector 74: ADC12MEM31 case ADC12IV_ADC12RDYIFG: break; // Vector 76: ADC12RDY default: break; } } //********************************************************** void ADC_SETUP(void) { ADC12CTL0 &= ~ADC12ENC; // Disable ADC12 ADC12CTL1 = ADC12VRSEL_1 + ADC12INCH_3; //Use SMCLK ADC12CTL1 |= ADC12SHP; ADC12CTL0 = ADC12SHT0_2 + ADC12ON; //16 clock ticks sample and hold time, ADC on ADC12CTL2 |= ADC12RES_2; // 12-bit conversion results //ADC12IER0 |= ADC12IE0 ; //Interrupt enable register: 1 turns it on (P1.3?) ADC12IER0 = 0x001; }