xref: /btstack/port/archive/msp-exp430f5438-cc2564b/firmware/hal_adc.c (revision 1664436fd643daf66517dc309e6cc72448e8a86d)
1*1664436fSMatthias Ringwald /**
2*1664436fSMatthias Ringwald  * @file  hal_adc.c
3*1664436fSMatthias Ringwald  *
4*1664436fSMatthias Ringwald  *  Copyright 2008 Texas Instruments, Inc.
5*1664436fSMatthias Ringwald ***************************************************************************/
6*1664436fSMatthias Ringwald 
7*1664436fSMatthias Ringwald #include "hal_adc.h"
8*1664436fSMatthias Ringwald 
9*1664436fSMatthias Ringwald #include <msp430x54x.h>
10*1664436fSMatthias Ringwald #include "hal_compat.h"
11*1664436fSMatthias Ringwald 
12*1664436fSMatthias Ringwald static int SavedADC12MEM0 = 0, SavedADC12MEM1 = 0, SavedADC12MEM2 = 0;
13*1664436fSMatthias Ringwald static int Acc_x = 0, Acc_y = 0, Acc_z = 0;
14*1664436fSMatthias Ringwald static int Acc_x_offset = 0, Acc_y_offset = 0, Acc_z_offset = 0;
15*1664436fSMatthias Ringwald static long int Vcc = 0, Temperature = 0;
16*1664436fSMatthias Ringwald static long int temperatureOffset = CELSIUS_OFFSET;
17*1664436fSMatthias Ringwald static unsigned char conversionType = CELSIUS, adcMode = ADC_OFF_MODE;
18*1664436fSMatthias Ringwald static unsigned char exit_active_from_ADC12 = 0;
19*1664436fSMatthias Ringwald 
20*1664436fSMatthias Ringwald /************************************************************************
21*1664436fSMatthias Ringwald  * @brief  Turns on and initializes ADC12, accelerometer in order to
22*1664436fSMatthias Ringwald  *         sample x, y, z-axis inputs.
23*1664436fSMatthias Ringwald  *
24*1664436fSMatthias Ringwald  * @param  none
25*1664436fSMatthias Ringwald  *
26*1664436fSMatthias Ringwald  * @return none
27*1664436fSMatthias Ringwald  *************************************************************************/
halAccelerometerInit(void)28*1664436fSMatthias Ringwald void halAccelerometerInit(void)
29*1664436fSMatthias Ringwald {
30*1664436fSMatthias Ringwald   adcMode = ADC_ACC_MODE;
31*1664436fSMatthias Ringwald   ACC_PORT_SEL |= ACC_X_PIN + ACC_Y_PIN;    //Enable A/D channel inputs
32*1664436fSMatthias Ringwald   ACC_PORT_DIR &= ~(ACC_X_PIN + ACC_Y_PIN + ACC_Z_PIN);
33*1664436fSMatthias Ringwald   ACC_PORT_DIR |= ACC_PWR_PIN;              //Enable ACC_POWER
34*1664436fSMatthias Ringwald   ACC_PORT_OUT |= ACC_PWR_PIN;
35*1664436fSMatthias Ringwald 
36*1664436fSMatthias Ringwald   //Sequence of channels, once, ACLK
37*1664436fSMatthias Ringwald   ADC12CTL0 = ADC12ON + ADC12SHT02 + ADC12MSC;
38*1664436fSMatthias Ringwald   ADC12CTL1 = ADC12SHP + ADC12CONSEQ_1 + ADC12SSEL_0;
39*1664436fSMatthias Ringwald   ADC12CTL2 = ADC12RES_2;
40*1664436fSMatthias Ringwald   ADC12MCTL0 = ACC_X_CHANNEL;
41*1664436fSMatthias Ringwald   ADC12MCTL1 = ACC_Y_CHANNEL;
42*1664436fSMatthias Ringwald   ADC12MCTL2 = ACC_Z_CHANNEL + ADC12EOS;
43*1664436fSMatthias Ringwald 
44*1664436fSMatthias Ringwald   // Allow the accelerometer to settle before sampling any data
45*1664436fSMatthias Ringwald 
46*1664436fSMatthias Ringwald   // 4.5.3-20110706-2 doesn't allow for 32-bit delay cycles
47*1664436fSMatthias Ringwald   int i;
48*1664436fSMatthias Ringwald   for (i=0;i<10;i++){
49*1664436fSMatthias Ringwald       __delay_cycles(20000);
50*1664436fSMatthias Ringwald   }
51*1664436fSMatthias Ringwald   UCSCTL8 |= MODOSCREQEN;
52*1664436fSMatthias Ringwald }
53*1664436fSMatthias Ringwald 
54*1664436fSMatthias Ringwald /************************************************************************
55*1664436fSMatthias Ringwald  * @brief  Calibrates the offset values for x, y, and z axes.
56*1664436fSMatthias Ringwald  *
57*1664436fSMatthias Ringwald  * @param  none
58*1664436fSMatthias Ringwald  *
59*1664436fSMatthias Ringwald  * @return none
60*1664436fSMatthias Ringwald  *************************************************************************/
halAccelerometerCalibrate(void)61*1664436fSMatthias Ringwald void halAccelerometerCalibrate(void)
62*1664436fSMatthias Ringwald {
63*1664436fSMatthias Ringwald   unsigned char tempQuit;
64*1664436fSMatthias Ringwald 
65*1664436fSMatthias Ringwald   tempQuit = exit_active_from_ADC12;
66*1664436fSMatthias Ringwald   halAdcSetQuitFromISR( 1 );
67*1664436fSMatthias Ringwald   halAdcStartRead();
68*1664436fSMatthias Ringwald 
69*1664436fSMatthias Ringwald   __bis_SR_register(LPM3_bits + GIE);
70*1664436fSMatthias Ringwald   __no_operation();
71*1664436fSMatthias Ringwald 
72*1664436fSMatthias Ringwald   halAccelerometerReadWithOffset(&Acc_x_offset, &Acc_y_offset, &Acc_z_offset);
73*1664436fSMatthias Ringwald   halAdcSetQuitFromISR( tempQuit );
74*1664436fSMatthias Ringwald }
75*1664436fSMatthias Ringwald 
76*1664436fSMatthias Ringwald /************************************************************************
77*1664436fSMatthias Ringwald  * @brief  Set function for the calibrated offsets for the x, y, and z axes.
78*1664436fSMatthias Ringwald  *
79*1664436fSMatthias Ringwald  * @param  x Calibrated offset for the x-axis
80*1664436fSMatthias Ringwald  *
81*1664436fSMatthias Ringwald  * @param  y Calibrated offset for the y-axis
82*1664436fSMatthias Ringwald  *
83*1664436fSMatthias Ringwald  * @param  z Calibrated offset for the z-axis
84*1664436fSMatthias Ringwald  *
85*1664436fSMatthias Ringwald  * @return none
86*1664436fSMatthias Ringwald  *************************************************************************/
halAccelerometerSetCalibratedOffset(int x,int y,int z)87*1664436fSMatthias Ringwald void halAccelerometerSetCalibratedOffset( int x, int y, int z )
88*1664436fSMatthias Ringwald {
89*1664436fSMatthias Ringwald   Acc_x_offset = x;
90*1664436fSMatthias Ringwald   Acc_y_offset = y;
91*1664436fSMatthias Ringwald   Acc_z_offset = z;
92*1664436fSMatthias Ringwald }
93*1664436fSMatthias Ringwald 
94*1664436fSMatthias Ringwald /************************************************************************
95*1664436fSMatthias Ringwald  * @brief  Get function for the x, y, and z axes calibrated offsets
96*1664436fSMatthias Ringwald  *
97*1664436fSMatthias Ringwald  * @param  x Pointer to the calibrated offset for the x-axis
98*1664436fSMatthias Ringwald  *
99*1664436fSMatthias Ringwald  * @param  y Pointer to the calibrated offset for the y-axis
100*1664436fSMatthias Ringwald  *
101*1664436fSMatthias Ringwald  * @param  z Pointer to the calibrated offset for the z-axis
102*1664436fSMatthias Ringwald  *
103*1664436fSMatthias Ringwald  * @return none
104*1664436fSMatthias Ringwald  *************************************************************************/
halAccelerometerGetCalibratedOffset(int * x,int * y,int * z)105*1664436fSMatthias Ringwald void halAccelerometerGetCalibratedOffset(int *x, int *y, int *z)
106*1664436fSMatthias Ringwald {
107*1664436fSMatthias Ringwald   *x = Acc_x_offset;
108*1664436fSMatthias Ringwald   *y = Acc_y_offset;
109*1664436fSMatthias Ringwald   *z = Acc_y_offset;
110*1664436fSMatthias Ringwald }
111*1664436fSMatthias Ringwald 
112*1664436fSMatthias Ringwald /************************************************************************
113*1664436fSMatthias Ringwald  * @brief  Get function for the x, y, and z accelerometer samples,
114*1664436fSMatthias Ringwald  *         including the calibrated offsets.
115*1664436fSMatthias Ringwald  *
116*1664436fSMatthias Ringwald  * @param  x Pointer to the accelerometer reading (x-axis)
117*1664436fSMatthias Ringwald  *
118*1664436fSMatthias Ringwald  * @param  y Pointer to the accelerometer reading (y-axis)
119*1664436fSMatthias Ringwald  *
120*1664436fSMatthias Ringwald  * @param  z Pointer to the accelerometer reading (z-axis)
121*1664436fSMatthias Ringwald  *
122*1664436fSMatthias Ringwald  * @return none
123*1664436fSMatthias Ringwald  *************************************************************************/
halAccelerometerRead(int * x,int * y,int * z)124*1664436fSMatthias Ringwald void halAccelerometerRead(int *x, int *y, int *z)
125*1664436fSMatthias Ringwald {
126*1664436fSMatthias Ringwald   Acc_x = SavedADC12MEM0;
127*1664436fSMatthias Ringwald   Acc_y = SavedADC12MEM1;
128*1664436fSMatthias Ringwald   Acc_z = SavedADC12MEM2;
129*1664436fSMatthias Ringwald 
130*1664436fSMatthias Ringwald   *x = Acc_x - Acc_x_offset;
131*1664436fSMatthias Ringwald   *y = Acc_y - Acc_y_offset;
132*1664436fSMatthias Ringwald   *z = Acc_z - Acc_z_offset;
133*1664436fSMatthias Ringwald }
134*1664436fSMatthias Ringwald 
135*1664436fSMatthias Ringwald /************************************************************************
136*1664436fSMatthias Ringwald  * @brief  Get function for the x, y, and z accelerometer samples,
137*1664436fSMatthias Ringwald  *         excluding the calibrated offsets.
138*1664436fSMatthias Ringwald  *
139*1664436fSMatthias Ringwald  * @param  x Pointer to the accelerometer reading (x-axis)
140*1664436fSMatthias Ringwald  *
141*1664436fSMatthias Ringwald  * @param  y Pointer to the accelerometer reading (y-axis)
142*1664436fSMatthias Ringwald  *
143*1664436fSMatthias Ringwald  * @param  z Pointer to the accelerometer reading (z-axis)
144*1664436fSMatthias Ringwald  *
145*1664436fSMatthias Ringwald  * @return none
146*1664436fSMatthias Ringwald  *************************************************************************/
halAccelerometerReadWithOffset(int * x,int * y,int * z)147*1664436fSMatthias Ringwald void halAccelerometerReadWithOffset(int *x, int *y, int *z)
148*1664436fSMatthias Ringwald {
149*1664436fSMatthias Ringwald   *x = SavedADC12MEM0;
150*1664436fSMatthias Ringwald   *y = SavedADC12MEM1;
151*1664436fSMatthias Ringwald   *z = SavedADC12MEM2;
152*1664436fSMatthias Ringwald }
153*1664436fSMatthias Ringwald 
154*1664436fSMatthias Ringwald /************************************************************************
155*1664436fSMatthias Ringwald  * @brief  Disables the ADC12, accelerometer that sampled x, y, z-axis inputs.
156*1664436fSMatthias Ringwald  *
157*1664436fSMatthias Ringwald  * @param  none
158*1664436fSMatthias Ringwald  *
159*1664436fSMatthias Ringwald  * @return none
160*1664436fSMatthias Ringwald  *************************************************************************/
halAccelerometerShutDown(void)161*1664436fSMatthias Ringwald void halAccelerometerShutDown(void)
162*1664436fSMatthias Ringwald {
163*1664436fSMatthias Ringwald   //Turn off ADC Module
164*1664436fSMatthias Ringwald   ADC12CTL0 &= ~( ADC12ON + ADC12ENC );
165*1664436fSMatthias Ringwald   ACC_PORT_OUT &= ~ACC_PWR_PIN;             //Disable ACC_POWER
166*1664436fSMatthias Ringwald 
167*1664436fSMatthias Ringwald   //Disable A/D channel inputs
168*1664436fSMatthias Ringwald   ACC_PORT_SEL &= ~(ACC_X_PIN + ACC_Y_PIN + ACC_Z_PIN);
169*1664436fSMatthias Ringwald   ACC_PORT_DIR |= (ACC_X_PIN + ACC_Y_PIN + ACC_Z_PIN + ACC_PWR_PIN);
170*1664436fSMatthias Ringwald   ACC_PORT_OUT &= ~(ACC_X_PIN + ACC_Y_PIN + ACC_Z_PIN + ACC_PWR_PIN);
171*1664436fSMatthias Ringwald 
172*1664436fSMatthias Ringwald   adcMode = ADC_OFF_MODE;
173*1664436fSMatthias Ringwald }
174*1664436fSMatthias Ringwald 
175*1664436fSMatthias Ringwald /*----------------------------------------------------------------------------*/
176*1664436fSMatthias Ringwald /************************************************************************
177*1664436fSMatthias Ringwald  * @brief  Intializes the ADC12 to sample Temperature and Vcc.
178*1664436fSMatthias Ringwald  *
179*1664436fSMatthias Ringwald  * @param  none
180*1664436fSMatthias Ringwald  *
181*1664436fSMatthias Ringwald  * @return none
182*1664436fSMatthias Ringwald  *************************************************************************/
halAdcInitTempVcc(void)183*1664436fSMatthias Ringwald void halAdcInitTempVcc(void)
184*1664436fSMatthias Ringwald {
185*1664436fSMatthias Ringwald   //Sequence of channels, once,
186*1664436fSMatthias Ringwald   adcMode = ADC_TEMP_MODE;
187*1664436fSMatthias Ringwald   UCSCTL8 |= MODOSCREQEN;
188*1664436fSMatthias Ringwald   ADC12CTL0 = ADC12ON + ADC12SHT0_15 + ADC12MSC + + ADC12REFON + ADC12REF2_5V;
189*1664436fSMatthias Ringwald   ADC12CTL1 = ADC12SHP + ADC12CONSEQ_1 + ADC12SSEL_0;
190*1664436fSMatthias Ringwald   ADC12CTL2 = ADC12RES_2;
191*1664436fSMatthias Ringwald 
192*1664436fSMatthias Ringwald   ADC12MCTL0 = ADC12SREF_1 + TEMP_CHANNEL;
193*1664436fSMatthias Ringwald   ADC12MCTL1 = ADC12SREF_1 + VCC_CHANNEL + ADC12EOS;
194*1664436fSMatthias Ringwald }
195*1664436fSMatthias Ringwald 
196*1664436fSMatthias Ringwald /************************************************************************
197*1664436fSMatthias Ringwald  * @brief  Turns off / disable the ADC12.
198*1664436fSMatthias Ringwald  *
199*1664436fSMatthias Ringwald  * @param  none
200*1664436fSMatthias Ringwald  *
201*1664436fSMatthias Ringwald  * @return none
202*1664436fSMatthias Ringwald  *************************************************************************/
halAdcShutDownTempVcc(void)203*1664436fSMatthias Ringwald void halAdcShutDownTempVcc(void)
204*1664436fSMatthias Ringwald {
205*1664436fSMatthias Ringwald   ADC12CTL0 &= ~ ( ADC12ON + ADC12ENC + ADC12REFON );
206*1664436fSMatthias Ringwald   adcMode = ADC_OFF_MODE;
207*1664436fSMatthias Ringwald }
208*1664436fSMatthias Ringwald 
209*1664436fSMatthias Ringwald /************************************************************************
210*1664436fSMatthias Ringwald  * @brief  Sets the conversion type to either Farenheit (F) or Celsius (C).
211*1664436fSMatthias Ringwald  *
212*1664436fSMatthias Ringwald  * @param  conversion The #define constant CELSIUS or FAHRENHEIT.
213*1664436fSMatthias Ringwald  *
214*1664436fSMatthias Ringwald  * @return none
215*1664436fSMatthias Ringwald  *************************************************************************/
halAdcSetTempConversionType(unsigned char conversion)216*1664436fSMatthias Ringwald void halAdcSetTempConversionType(unsigned char conversion)
217*1664436fSMatthias Ringwald {
218*1664436fSMatthias Ringwald   conversionType = conversion;
219*1664436fSMatthias Ringwald }
220*1664436fSMatthias Ringwald 
221*1664436fSMatthias Ringwald /************************************************************************
222*1664436fSMatthias Ringwald  * @brief  Set function for the calibrated temperature offset.
223*1664436fSMatthias Ringwald  *
224*1664436fSMatthias Ringwald  * @param  offset The temperature offset.
225*1664436fSMatthias Ringwald  *
226*1664436fSMatthias Ringwald  * @return none
227*1664436fSMatthias Ringwald  *************************************************************************/
halAdcSetTempOffset(long offset)228*1664436fSMatthias Ringwald void halAdcSetTempOffset(long offset)
229*1664436fSMatthias Ringwald {
230*1664436fSMatthias Ringwald   temperatureOffset = offset;
231*1664436fSMatthias Ringwald }
232*1664436fSMatthias Ringwald 
233*1664436fSMatthias Ringwald /************************************************************************
234*1664436fSMatthias Ringwald  * @brief  Get function for the current temperature value.
235*1664436fSMatthias Ringwald  *
236*1664436fSMatthias Ringwald  * @param  none
237*1664436fSMatthias Ringwald  *
238*1664436fSMatthias Ringwald  * @return The current temperature value.
239*1664436fSMatthias Ringwald  *************************************************************************/
halAdcGetTemp(void)240*1664436fSMatthias Ringwald int halAdcGetTemp(void)
241*1664436fSMatthias Ringwald {
242*1664436fSMatthias Ringwald   return Temperature;
243*1664436fSMatthias Ringwald }
244*1664436fSMatthias Ringwald 
245*1664436fSMatthias Ringwald /************************************************************************
246*1664436fSMatthias Ringwald  * @brief  Get function for the current Vcc value.
247*1664436fSMatthias Ringwald  *
248*1664436fSMatthias Ringwald  * @param  none
249*1664436fSMatthias Ringwald  *
250*1664436fSMatthias Ringwald  * @return The current Vcc value.
251*1664436fSMatthias Ringwald  *************************************************************************/
halAdcGetVcc(void)252*1664436fSMatthias Ringwald int halAdcGetVcc(void)
253*1664436fSMatthias Ringwald {
254*1664436fSMatthias Ringwald   return Vcc;
255*1664436fSMatthias Ringwald }
256*1664436fSMatthias Ringwald 
257*1664436fSMatthias Ringwald /************************************************************************
258*1664436fSMatthias Ringwald  * @brief  Converts the Vcc and Temp readings from the ADC to BCD format.
259*1664436fSMatthias Ringwald  *
260*1664436fSMatthias Ringwald  * @param  none
261*1664436fSMatthias Ringwald  *
262*1664436fSMatthias Ringwald  * @return none
263*1664436fSMatthias Ringwald  *************************************************************************/
halAdcConvertTempVccFromADC(void)264*1664436fSMatthias Ringwald void halAdcConvertTempVccFromADC(void)
265*1664436fSMatthias Ringwald {
266*1664436fSMatthias Ringwald   long multiplier, offset;
267*1664436fSMatthias Ringwald 
268*1664436fSMatthias Ringwald   // Convert Vcc
269*1664436fSMatthias Ringwald   Vcc = SavedADC12MEM1;
270*1664436fSMatthias Ringwald   Vcc = Vcc * 50;
271*1664436fSMatthias Ringwald   Vcc = Vcc / 4096;
272*1664436fSMatthias Ringwald 
273*1664436fSMatthias Ringwald   // Convert Temperature
274*1664436fSMatthias Ringwald   if (conversionType == CELSIUS)
275*1664436fSMatthias Ringwald   {
276*1664436fSMatthias Ringwald     multiplier = CELSIUS_MUL;
277*1664436fSMatthias Ringwald     offset = temperatureOffset;
278*1664436fSMatthias Ringwald   }
279*1664436fSMatthias Ringwald   else
280*1664436fSMatthias Ringwald   {
281*1664436fSMatthias Ringwald     multiplier = (long) CELSIUS_MUL * 9 /5 ;
282*1664436fSMatthias Ringwald     offset = (long) temperatureOffset * 9 / 5 - 320;
283*1664436fSMatthias Ringwald   }
284*1664436fSMatthias Ringwald   Temperature = (long) SavedADC12MEM0 * multiplier/4096 - offset;
285*1664436fSMatthias Ringwald }
286*1664436fSMatthias Ringwald 
287*1664436fSMatthias Ringwald /************************************************************************
288*1664436fSMatthias Ringwald  * @brief  Get function for the temperature and Vcc samples in "xxx^C/F" and
289*1664436fSMatthias Ringwald  *         "x.xV" format.
290*1664436fSMatthias Ringwald  *
291*1664436fSMatthias Ringwald  * @param  TemperatureStr The string that holds the temperature reading
292*1664436fSMatthias Ringwald  *
293*1664436fSMatthias Ringwald  * @param  Vcc            The string that holds the Vcc reading
294*1664436fSMatthias Ringwald  *
295*1664436fSMatthias Ringwald  * @return none
296*1664436fSMatthias Ringwald  *************************************************************************/
halAdcReadTempVcc(char * TemperatureStr,char * VccStr)297*1664436fSMatthias Ringwald void halAdcReadTempVcc(char *TemperatureStr, char *VccStr)
298*1664436fSMatthias Ringwald {
299*1664436fSMatthias Ringwald   unsigned char i, leadingZero = 0;
300*1664436fSMatthias Ringwald   long int dummyTemperature, dummyVcc;
301*1664436fSMatthias Ringwald 
302*1664436fSMatthias Ringwald   halAdcConvertTempVccFromADC();
303*1664436fSMatthias Ringwald   dummyTemperature = Temperature;
304*1664436fSMatthias Ringwald   dummyVcc = Vcc;
305*1664436fSMatthias Ringwald   for (i = 0; i < 6; i++)
306*1664436fSMatthias Ringwald 	  TemperatureStr[i] = '\0';
307*1664436fSMatthias Ringwald 	i=0;
308*1664436fSMatthias Ringwald   //Check for negative
309*1664436fSMatthias Ringwald   if (Temperature < 0)
310*1664436fSMatthias Ringwald   {
311*1664436fSMatthias Ringwald   	TemperatureStr[i++]='-';
312*1664436fSMatthias Ringwald   	Temperature = -Temperature;
313*1664436fSMatthias Ringwald   }
314*1664436fSMatthias Ringwald   TemperatureStr[i] ='0';
315*1664436fSMatthias Ringwald   if (Temperature >= 1000)
316*1664436fSMatthias Ringwald   {
317*1664436fSMatthias Ringwald   	TemperatureStr[i]='1';
318*1664436fSMatthias Ringwald   	Temperature -=1000;
319*1664436fSMatthias Ringwald   	leadingZero = 1;
320*1664436fSMatthias Ringwald   }
321*1664436fSMatthias Ringwald   if (leadingZero == 1)
322*1664436fSMatthias Ringwald     i++;
323*1664436fSMatthias Ringwald   //100s digit
324*1664436fSMatthias Ringwald   TemperatureStr[i] = '0';
325*1664436fSMatthias Ringwald   if  (Temperature >= 100)
326*1664436fSMatthias Ringwald   {
327*1664436fSMatthias Ringwald     do
328*1664436fSMatthias Ringwald 	{
329*1664436fSMatthias Ringwald 	  TemperatureStr[i]++;
330*1664436fSMatthias Ringwald 	  Temperature -=100;
331*1664436fSMatthias Ringwald 	}
332*1664436fSMatthias Ringwald 	while (Temperature >=100);
333*1664436fSMatthias Ringwald 	leadingZero =  1;
334*1664436fSMatthias Ringwald   }
335*1664436fSMatthias Ringwald   if (leadingZero == 1)
336*1664436fSMatthias Ringwald     i++;
337*1664436fSMatthias Ringwald   //10s digit
338*1664436fSMatthias Ringwald   TemperatureStr[i] = '0';
339*1664436fSMatthias Ringwald   if (Temperature >=10)
340*1664436fSMatthias Ringwald   {
341*1664436fSMatthias Ringwald 	  do
342*1664436fSMatthias Ringwald 	  {
343*1664436fSMatthias Ringwald 	    TemperatureStr[i]++;
344*1664436fSMatthias Ringwald 	    Temperature -=10;
345*1664436fSMatthias Ringwald 	  }
346*1664436fSMatthias Ringwald 	  while (Temperature >=10);
347*1664436fSMatthias Ringwald   }
348*1664436fSMatthias Ringwald 
349*1664436fSMatthias Ringwald   TemperatureStr[++i] = '^';
350*1664436fSMatthias Ringwald   if (conversionType == CELSIUS)
351*1664436fSMatthias Ringwald   	TemperatureStr[++i]='C';
352*1664436fSMatthias Ringwald   else
353*1664436fSMatthias Ringwald   	TemperatureStr[++i]='F';
354*1664436fSMatthias Ringwald 
355*1664436fSMatthias Ringwald   VccStr[0] = '0';
356*1664436fSMatthias Ringwald   VccStr[2] = '0';
357*1664436fSMatthias Ringwald   while (Vcc >= 10)
358*1664436fSMatthias Ringwald   {
359*1664436fSMatthias Ringwald   	VccStr[0]++;
360*1664436fSMatthias Ringwald   	Vcc -= 10;
361*1664436fSMatthias Ringwald   }
362*1664436fSMatthias Ringwald   VccStr[2] += Vcc;
363*1664436fSMatthias Ringwald   Temperature = dummyTemperature;
364*1664436fSMatthias Ringwald   Vcc = dummyVcc;
365*1664436fSMatthias Ringwald }
366*1664436fSMatthias Ringwald 
367*1664436fSMatthias Ringwald /*----------------------------------------------------------------------------*/
368*1664436fSMatthias Ringwald /************************************************************************
369*1664436fSMatthias Ringwald  * @brief  Starts the ADC conversion.
370*1664436fSMatthias Ringwald  *
371*1664436fSMatthias Ringwald  * @param  none
372*1664436fSMatthias Ringwald  *
373*1664436fSMatthias Ringwald  * @return none
374*1664436fSMatthias Ringwald  *************************************************************************/
halAdcStartRead(void)375*1664436fSMatthias Ringwald void halAdcStartRead(void)
376*1664436fSMatthias Ringwald {
377*1664436fSMatthias Ringwald   ADC12IFG &= ~(BIT1+BIT0);                 // Clear any pending flags
378*1664436fSMatthias Ringwald 
379*1664436fSMatthias Ringwald   if (adcMode == ADC_ACC_MODE)
380*1664436fSMatthias Ringwald   {
381*1664436fSMatthias Ringwald   	ADC12CTL0 |=  ADC12ENC | ADC12SC ;
382*1664436fSMatthias Ringwald   	ADC12IE |= BIT2;
383*1664436fSMatthias Ringwald   }
384*1664436fSMatthias Ringwald   else
385*1664436fSMatthias Ringwald   {
386*1664436fSMatthias Ringwald     ADC12CTL0 |= ADC12REFON;                // Turn on ADC12 reference
387*1664436fSMatthias Ringwald 
388*1664436fSMatthias Ringwald     // Delay to stabilize ADC12 reference assuming the fastest MCLK of 18 MHz.
389*1664436fSMatthias Ringwald     // 35 us = 1 / 18 MHz * 630
390*1664436fSMatthias Ringwald     __delay_cycles(630);
391*1664436fSMatthias Ringwald 
392*1664436fSMatthias Ringwald 	ADC12IE |= BIT1;                        // Enable interrupt
393*1664436fSMatthias Ringwald   	ADC12CTL0 |=  ADC12ENC | ADC12SC;
394*1664436fSMatthias Ringwald   }
395*1664436fSMatthias Ringwald }
396*1664436fSMatthias Ringwald 
397*1664436fSMatthias Ringwald /************************************************************************
398*1664436fSMatthias Ringwald  * @brief  Sets the flag that causes an exit into active CPU mode from
399*1664436fSMatthias Ringwald  *         the ADC12 ISR.
400*1664436fSMatthias Ringwald  *
401*1664436fSMatthias Ringwald  * @param  quit
402*1664436fSMatthias Ringwald  *
403*1664436fSMatthias Ringwald  * - 1 - Exit active from ADC12 ISR
404*1664436fSMatthias Ringwald  * - 0 - Remain in LPMx on exit from ADC12ISR
405*1664436fSMatthias Ringwald  *
406*1664436fSMatthias Ringwald  * @return none
407*1664436fSMatthias Ringwald  *************************************************************************/
halAdcSetQuitFromISR(unsigned char quit)408*1664436fSMatthias Ringwald void halAdcSetQuitFromISR(unsigned char quit)
409*1664436fSMatthias Ringwald {
410*1664436fSMatthias Ringwald   exit_active_from_ADC12 = quit;
411*1664436fSMatthias Ringwald }
412*1664436fSMatthias Ringwald 
413*1664436fSMatthias Ringwald /*----------------------------------------------------------------------------*/
414*1664436fSMatthias Ringwald 
415*1664436fSMatthias Ringwald #ifdef __GNUC__
416*1664436fSMatthias Ringwald __attribute__((interrupt(ADC12_VECTOR)))
417*1664436fSMatthias Ringwald #endif
418*1664436fSMatthias Ringwald #ifdef __IAR_SYSTEMS_ICC__
419*1664436fSMatthias Ringwald #pragma vector=ADC12_VECTOR
420*1664436fSMatthias Ringwald __interrupt
421*1664436fSMatthias Ringwald #endif
ADC12_ISR(void)422*1664436fSMatthias Ringwald void ADC12_ISR(void)
423*1664436fSMatthias Ringwald {
424*1664436fSMatthias Ringwald     SavedADC12MEM0 = ADC12MEM0;             // Store the sampled data
425*1664436fSMatthias Ringwald 	SavedADC12MEM1 = ADC12MEM1;
426*1664436fSMatthias Ringwald 	SavedADC12MEM2 = ADC12MEM2;
427*1664436fSMatthias Ringwald     ADC12IFG = 0;                           // Clear the interrupt flags
428*1664436fSMatthias Ringwald 	ADC12CTL0 &= ~( ADC12ENC | ADC12SC | ADC12REFON);
429*1664436fSMatthias Ringwald     if (exit_active_from_ADC12) __bic_SR_register_on_exit(LPM3_bits);
430*1664436fSMatthias Ringwald }
431