Tutorial: Using the Internal Temperature Sensor on a MSP430

The value line series (g series) chips that come with the MSP430 Launchpad are pretty cool and has almost all the required peripherals to work with..The best on is ( for those with the newer version v1.5 or later, that comes with pre-soldered Male headers ) MSP430G2553, It has pretty much everything to get you started. Since, I was a little curious i bought the MSP430 launchpad quite a while back..Mine came with a g2231 and g2211..Of which G2231 is the one that has an ADC. The MSP430 boasts of an internal temperature sensor which is probably new to me who has worked earlier on AVR. So, I went on and tested the ” <Accuracy>”  of the sensor.

For you to proceed you need to have this (user`s guide) and refer the pages 559-564.

post1

So setting the bits in the INCHx to 0b1010 (i.e 10 in decimal) the MSP430 allows us to use its internal temperature sensor.

We have chosen the reference voltage to be 1.5V in order to have an ADC Value that is more or less immune to the Voltage Fluctuations.

The code is as follows:

#include<msp430g2231.h>
void tempInit()
{
	ADC10CTL0=SREF_1 + REFON + ADC10ON + ADC10SHT_3 ; //1.5V ref,Ref on,64 clocks for sample
	ADC10CTL1=INCH_10+ ADC10DIV_3; //temp sensor is at 10 and clock/4
}
int tempOut()
{
	int t=0;
	__delay_cycles(1000);              //wait 4 ref to settle
	ADC10CTL0 |= ENC + ADC10SC;      //enable conversion and start conversion
	while(ADC10CTL1 & BUSY);         //wait..i am converting..pum..pum..
	t=ADC10MEM;                       //store val in t
	ADC10CTL0&=~ENC;                     //disable adc conv
	return(int) ((t * 27069L - 18169625L) >> 16); //convert and pass
}
void main(void)
{   volatile int temp;    //initialise
	WDTCTL = WDTPW + WDTHOLD; //stop..bow..boww
	temp=0;
	tempInit();//initialise adc
	while(1)
	{
		__delay_cycles(500); //wait and set break point
		temp=tempOut();           //read temp
		__delay_cycles(500);  //wait and set breakpoint

	}
}

Code is under this licence .  😀

So, when you flash this code using CCS the breakpoints need to be set(Not compulsory et`all). What breakpoints really do is that it stops the program there and allows you to see the value of the watch expression and then when you press the pause/play button again..it will run until the next breakpoint..Its a pretty cool feature..and many use it to analyse code behavior.

This is how you set a breakpoint in the CCS-Edit window:

post2

Just click on the bar next to the line number bar..(Currently highlighted in blue).

These are the results you get by setting the “Watch Expression” to the Temp variable..

post3

The temperature it reads is 23 Degrees Celsius..while my room temperature measured by a standard thermometer is  20 Degrees. which is a relative error of 15%. So, scientifically that`s not accurate..but i dont think that is what it is designed for..I think it is designed for just to give an “Idea” of what the temperature is about..So we can see if we are getting colder or hotter.

The code is pretty well commented and i find it self-explanatory..But still if you have any query ..I am just a “Comment” away!

You can also find the complete CCS project in this repo on github!

Cheers and Greetings!

Indian Tinker!

Advertisements

TI MSP430 Dice( and other experiments)

7 Segmented Displays are pretty low tech and have been around for quite a while.They have a lot of wiring clutter with them..But still they are by far the most easiest(and cheapest) way to give out a (alpha)numerical output..I had interfaced 7segs with MSP430 a while back directly but owing to the low current capabilities of MSP430 the display wasn`t very good and clear . We were recently ‘taught’ about the BCD-7 segmented display in our semester..So i thought about interfacing the 7 segmented with the CD4511..This will save some precious pins and plus drive the 7 seg directly. The CD4511 IC can run from 3V Supply..So no power supply issues and the logic high(input) is about 2V which is also apt as on MSP430 we have this about 3.3V.

The datasheet is available  here

The only thing that was bad was the wiring clutter  has increased and there were (as always) a few loose connections.After a few minutes,I was up and running with the display.

The Fritzing Schematic is given below:

cd4511

Do everything according to the picture above for the code to run. If the Schematic is not clear..then refer to datasheet linked above.Everything has been done according to it..The LT(bar) and BI(bar) have been connected to +VCC and LE to ground.The display is powered from the ‘board’.

The connections (from the MSP430 end to CD4511) are:

P1.4 -D

P1.5-C

P1.6-B

P1.7-A

#define D BIT4
#define S BIT5
#define B BIT6
#define A BIT7

The code to drive the CD4511 “According” to the above config is:

void CD4511(int numb)
{
switch(numb){
				case 0:P1OUT&=~(B+A+S+D);
				break;
				case 1:P1OUT|=(A);
				       P1OUT&=~(B+S+D);
                break;
				case 2:P1OUT|=(B);
				       P1OUT&=~(A+S+D);
                break;
				case 3:P1OUT|=(A+B);
				       P1OUT&=~(S+D);
                break;
				case 4:P1OUT|=(S);
				       P1OUT&=~(A+D+B);
                break;
				case 5:P1OUT|=(A+S);
				       P1OUT&=~(B+D);
                break;
				case 6:P1OUT|=(S+B);
				       P1OUT&=~(A+D);
                break;
				case 7:P1OUT|=(S+B+A);
				       P1OUT&=~(D);
                break;
				case 8:P1OUT|=(D);
				       P1OUT&=~(B+S+A);
                break;
				case 9:P1OUT|=(A+D);
				       P1OUT&=~(B+S);
                break;
				default:P1OUT&=~(B+A+S+D);
				break;
}
}

Just to clarify :The code uses ‘S’ instead of ‘C’ because C was being used as an internal macro in the header file!

The video is down here..It first shows the simple counter..then the push to change count and then the Dice.
To get the complete source code..you can comment below..The comments are moderated so you email will not be leaked.
Thanks for passing by!
🙂
#Sorry for the bad cam! 😛