TC72 SPI Thermometer
TC72 is a SPI slave device reading and converting analog temperature to digital formats. The temperature reading ranges from -55 to +125 degree Celsius. With these temperature values, it also has a fraction temperature value. The fraction is 0.25 degree Celsius per step. Fraction reading has only 3 points, 0.25, 0.50 and 0.75 degree Celsius.I don't cover its technical detail here. In the previous post, I put some detail of this device with programming interface to PIC16F818.
00:00 / 00:00
In this example, I use ATMega32 functioning as a master SPI reading temperature from TC72 and displays the temperature.
![]() |
a sample of this program The temperature reading is -32.00 degree Celsius. |
Programming For TC72
The overall programming interface lists below:
- Set up the SPI to master mode
- Select SPI clock and data sampling mode
- Set up digital output for display
- Send the command to TC72
- Read temperature from TC72
- Display the result
Atmel Studio 7 C source code lists here.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* spi_tc72_ssd.c | |
* | |
* Created: 7/25/2020 4:13:58 PM | |
* Author : aki-technical | |
*/ | |
#include <avr/io.h> | |
#define F_CPU 4000000UL | |
#include <util/delay.h> | |
void masterInit(void){ | |
/*Set MOSI, SCK and SS Output*/ | |
DDRB=(1<<7)|(1<<5)|(1<<4); | |
/*Enable SPI Master set clock rate fck/128 data is | |
sample at falling edge*/ | |
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)|(1<<CPHA); | |
//SPSR|=(1<<0); | |
} | |
void masterTransmit(char spiData){ | |
//PORTB&=~(1<<5); | |
/*Start the transmission*/ | |
SPDR=spiData; | |
/*Wait for completion*/ | |
while(!(SPSR&(1<<SPIF))); | |
//PORTB&=~(1<<5); | |
} | |
char masterReceive(void){ | |
/*Wait for the SPI buffer's full*/ | |
while(!(SPSR&(1<<SPIF))); | |
/*return SPI Buffer*/ | |
return SPDR; | |
} | |
void tc72Init(void){ | |
PORTB|=(1<<4); | |
/*Select Control Register*/ | |
masterTransmit(0x80); | |
/*Select Continuous temperature Conversion*/ | |
masterTransmit(0x04); | |
PORTB&=~(1<<4); | |
_delay_ms(150); | |
} | |
void displayTemperature(char msb,char lsb){ | |
char ssd[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D, | |
0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; | |
char sign; | |
lsb>>=6; | |
if(msb&0x80) { | |
msb=(~msb)+1; | |
sign=1; | |
if(lsb!=0) lsb=75/lsb; | |
} | |
else { | |
sign=0; | |
lsb*=25; | |
} | |
PORTD=0x00; | |
if(sign==1) PORTC=0x40; | |
else if(msb>=100) PORTC=ssd[msb/100]; | |
else PORTC=0x00; | |
PORTD=(1<<0); | |
_delay_ms(5); | |
PORTD=0x00; | |
if(msb>=10) | |
PORTC=ssd[(msb%100)/10]; | |
else PORTC=0; | |
PORTD=(1<<1); | |
_delay_ms(5); | |
PORTD=0x00; | |
PORTC=ssd[msb%10]|0x80; | |
PORTD=(1<<2); | |
_delay_ms(5); | |
PORTD=0x00; | |
PORTC=ssd[lsb/10]; | |
PORTD=(1<<3); | |
_delay_ms(5); | |
PORTD=0x00; | |
PORTC=ssd[lsb%10]; | |
PORTD=(1<<4); | |
_delay_ms(5); | |
PORTD=0x00; | |
PORTC=0x63; | |
PORTD=(1<<5); | |
_delay_ms(5); | |
PORTD=0x00; | |
PORTC=ssd[12]; | |
PORTD=(1<<6); | |
_delay_ms(5); | |
} | |
int main(void) | |
{ | |
char msb,lsb; | |
DDRC=0xFF; | |
DDRD=0xFF; | |
DDRA=0xFF; | |
masterInit(); | |
tc72Init(); | |
_delay_ms(150); | |
while (1) | |
{ | |
PORTB|=(1<<4); | |
/*Read the MSB*/ | |
masterTransmit(0x02); | |
/*Issue one more clock frame | |
to force data out*/ | |
masterTransmit(0x00); | |
PORTB&=~(1<<4); | |
_delay_ms(1); | |
msb=masterReceive(); | |
PORTB|=(1<<4); | |
/*Read The LSB*/ | |
masterTransmit(0x01); | |
/*Issue one more clock frame | |
to force data out*/ | |
masterTransmit(0x00); | |
PORTB&=~(1<<4); | |
_delay_ms(1); | |
lsb=masterReceive(); | |
PORTA=lsb; | |
displayTemperature(msb,lsb); | |
} | |
} |
Schematic Diagram
![]() |
Schematic Diagram of this example |
No comments:
Post a Comment