TC77 SENSOR TEMPERATURA SPI

 

En la siguiente practica vamos a realizar un sensor de temperatura por SPI mediante el sensor TC77:

Como observamos, dicho sensor tiene un solo pin de comunicación pues en su transferencia de datos solo se va a realiza la lectura del mismo. El recogerá la temperatura y el PIC 18F4550 leerá los valores.

Aquí podemos ver el código de programación realizado para la captura de la temperatura y muestreo en el LCD 16×2.

////////////////////////////////////////////////////////////////////////////////////

// AUTOR:Daniel Villegas Diaz 2012

///////////////////////////////////////////////////

// PROGRAMA: LEER Tº DEL TC77 VERSIÓN: 1.0

// DISPOSITIVO: PIC18F4550 COMPILADOR: CCS vs4.088

// Entorno IDE: MPLAB 8.56 SIMULADOR: Proteus 7.7 sp2

// TARJETA DE APLICACIÓN: 2010/2011 DEBUGGER: ICD2

////////////////////////////////////////////////////////////////////////////////////

 

////////////////////////////////////////////////////////////////////////////////////

// LEER LA Tº DEL SENSOR TC77

////////////////////////////////////////////////////////////////////////////////////

/*

El sensor consta de tres registros (CONFIGURACIÓN-TEMPERATURA-FABRICANTE)

Puede trabajar en dos modos:

.-SHUTDOWN (0xFFH)

.-CONTINUO (0x00H)

Para configurar los modos hace falta leer 16bit(en dos veces) y luego escribir otros 16

EJEMPLO:

1. CS goes low to initiate the communication cycle.

2. Read 16 bits of temperature data from the

Temperature register.

3. Write 16 bits of data (i.e. XXFF hex) to the Configuration

register to enter Shutdown mode.

4. Read the 16 bits from the Manufacturer’s ID register

(C15:C8 = 54 hex) to verify that the sensor

is a Microchip device.

5. Write 8 to 16 bits of data (00 or 0000 hex) to

enter Continuous Conversion Mode.

6. Return CS high to terminate the communication

cycle.

————————————————————————————

El registro da la temperatura en complemento a 2 y trabaja de la siguiente forma:

bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

T15 T14 T13 T12 T11 T10 T9 T8 T7 T6 T5 T4 T3 T2 T1 T0

2^8 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3 2^-4 * X X

EJEMPLO:

Temperature = 85.125°C

Temperature Register = 00101010 10010111b

= 2^6 + 2^4 + 2^2 + 2^0 + 2^-3

= 64 + 16 + 4 + 1 + 0.125

= 85.125°C

*/

////////////////////////////////////////////////////////////////////////////////////

// CABECERA ////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////

#include <18F4550.h>

#FUSES HS //External clock

#FUSES MCLR //Master Clear pin enabled

#fuses nowdt,noprotect,nolvp,nodebug,usbdiv,pll5,cpudiv1,novregen

#use fast_io(c)

#use fast_io(b)

#use delay(clock=20000000)

#define CS PIN_A0

//#fuses INTHS //Selecciona el oscilador interno

//#use delay(internal=1Mhz) // Selecciona la velocidad del oscilador interno

#include <C:\Users\CARMEN\Desktop\programas_C\SPI_TEMPERATURA\LCD_SIS.c>

 

 

////////////////////////////////////////////////////////////////////////////////////

// VARIABLES GLOBALES //////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////

int Templ=0;

int Temph=0;

signed int16 Temp16Bits=0;

float decimales=0;

float enteros=0;

int1 banderanegativo=0;

float Temperatura;

char A4[7];

////////////////////////////////////////////////////////////////////////////////////

// FUNCIONES ///////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////

 

////////////////////////////////////////////////////////////////////////////////////

// PRINCIPAL ///////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////

 

void main()

{

lcd_init();

set_tris_b(0b00000001); // establecemos bit rb0 como entrada

set_tris_c(0X00); //puerto c como salida

setup_spi(spi_master|spi_l_to_h| spi_ss_disabled);

 

while(1)

{

 

output_low(CS); //puesta en habilitación de cs

Temph=spi_read(0);//obtenemos el Temp alto del registro de temperatura

Templ=spi_read(0);//obtenemos el Temp bajo del registro de temperatura

output_high(CS); // puesta inhabilitación de chip

Temp16Bits=make16(Temph,Templ);//convertimos a un registro de 16Bits

banderanegativo=0;//

if (Temp16Bits<0)

{

banderanegativo=1;

Temp16Bits=~Temp16Bits+8;

 

}//si es negativo lo complementamos a 2 y le sumamos 8

Temp16Bits=Temp16Bits>>3;//descartamos los 3 bits menos significativos

decimales=(float)(Temp16Bits&0b0000000000001111)*0.0625;//damos formato a los decimales

enteros=(float)(Temp16Bits>>4); //damos formato a los enteros, solo descartando los decimales

if (banderanegativo)

{

Temperatura=-1*(enteros+decimales);

}

else

{

Temperatura=(enteros+decimales);

}

lcd_gotoxy(1,1);

printf(lcd_putc,”HAY = %3.2fC”,Temperatura);

delay_ms(100);

}}

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s