Saturday, July 25, 2020

ATMega32 interfaces to TC72 SPI temperature-to-digital converter

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.

SPI Serial Peripheral interface AVR ATMega32 SSD TC72 temperature sensor display project Proteus Multiplexing common cathode Microchip thermometer
a sample of this program
The temperature reading is -32.00 degree Celsius.

Programming For TC72

The overall programming interface lists below:

  1. Set up the SPI to master mode
  2. Select SPI clock and data sampling mode
  3. Set up digital output for display
  4. Send the command to TC72
  5. Read temperature from TC72
  6. Display the result
Atmel Studio 7 C source code lists here.

/*
* 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);
}
}
view raw m32tc72ssdMux.c hosted with ❤ by GitHub
Schematic Diagram

Schematic Diagram
Schematic Diagram of this example






No comments:

Post a Comment

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (56) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (47) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (71) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (3) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (31) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)