ELECTRONIC MEMORIES

TC77

Posted by discobolo100 en 15 marzo, 2011

TC77

Finalidad: usando el bus SPI, se ha de realizar una medición con el sensor de temperatura TC77 de 13 bits y el pic 18f4550.

Para ello estudiaremos la configuración del TC77, dejo el datasheet, para acceder a él solo teneís que hacer click aquí .

Una vez sabemos como configurar el componente y el modo de trabajo del mismo pasamos a la realización del código para poder visualizar la temperatura que nos indica el sensor en un LCD alfanumérico.


////////////////////////////////////////////////////////////////////////////////////
// AUTOR: Ismael Muriedas Saro ///Marzo/2011///
////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA: LEER Tº DEL TC77 VERSIÓN: 1.0
// DISPOSITIVO: PIC18F4550 COMPILADOR: CCS vs4.088
// Entorno IDE: SIMULADOR: Proteus 7.7 sp2
// TARJETA DE APLICACIÓN: DEBUGGER: ICD3
////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
// 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)

*/
////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h>
#fuses INTHS //Selecciona el oscilador interno
#use delay(internal=8Mhz) // Selecciona la velocidad del oscilador interno
#include
/*
Mientras no empleemos el bus USB, se utilizará el oscilador interno para simplificar
la configuración de reloj y reducir componentes externos.
*/
////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void main()
{
long int parte_entera;
long int parte_decimal;
int temp_H;
int temp_L;

setup_spi(spi_MASTER | spi_L_to_H | spi_clk_div_16| SPI_XMIT_L_TO_H);

lcd_init();
lcd_putc('\f'); //Borra pantalla
lcd_gotoxy(1,1);

//Secuencia para leer el Fabricante-----------------------------------------
//1º.- CS goes low to initiate the communication cycle.
output_low(PIN_A0);

//2º.- Read 16 bits of temperature data from the Temperature register
spi_read(0);
spi_read(0);

//3º.- Write 16 bits of data (i.e. XXFF hex) to the Configuration register to enter Shutdown mode.
spi_write(0xff);
spi_write(0xff);

//4º.- Read the 16 bits from the Manufacturer's ID register (C15:C8 = 54 hex)
// to verify that the sensor is a Microchip device.
spi_read(0);
spi_read(0);

//5º.- Write 8 to 16 bits of data (00 or 0000 hex) to enter Continuous Conversion Mode.
spi_write(0x0);
spi_write(0x0);

//6º.- Return CS high to terminate the communication cycle.
output_high(PIN_A0);

delay_ms(500); //Retardo para que al sensor le de tiempo a actualizar su registro de temperatura

for (;;)
{
parte_entera=0;
parte_decimal=0;

output_low(PIN_A0);
//Leo el byte alto y bajo del registro de temperatura y sumo el peso de cada bit. El resultado
//lo guardo en las variables "parte_entera" y "parte_decimal"
temp_H=spi_read(0x00);

if(bit_test(temp_H,6)){parte_entera=parte_entera+128.0;}
if(bit_test(temp_H,5)){parte_entera=parte_entera+64.0;}
if(bit_test(temp_H,4)){parte_entera=parte_entera+32.0;}
if(bit_test(temp_H,3)){parte_entera=parte_entera+16.0;}
if(bit_test(temp_H,2)){parte_entera=parte_entera+8.0;}
if(bit_test(temp_H,1)){parte_entera=parte_entera+4.0;}
if(bit_test(temp_H,0)){parte_entera=parte_entera+2.0;}

temp_L=spi_read(0x00); //En proteus, esta lectura sale como ?? porque los
//dos bits de menor peso quedan indefinidos
if(bit_test(temp_L,7)){parte_entera=parte_entera+1.0;}
if(bit_test(temp_L,6)){parte_decimal=parte_decimal+500;}
if(bit_test(temp_L,5)){parte_decimal=parte_decimal+250;}
if(bit_test(temp_L,4)){parte_decimal=parte_decimal+125;}

output_high(PIN_A0);
delay_ms(100);
lcd_gotoxy(1,1);
//Si el nº es negativo
//le resto 2^9 para encontrar el nº que representa la parte entera.
//(nº+)-(2^n)=(nº-)El nº positivo menos 2^n es igual al nº negativo, en C2, que representa
//La variable de la parte decimal contiene el complemento de las 3 cifras. Es decir, si la temperatura es 4,625ºC
//la variable contiene 275. Por ello, restamos 1000-parte_decimal y obtenemos el valor real.
if(bit_test(temp_H,7))
{
parte_entera=511-(parte_entera+256);
printf(lcd_putc,"TC77-->-%3lu",parte_entera);

parte_decimal=1000-parte_decimal;
printf(lcd_putc,".%3luC",parte_decimal);
}
//Si el nº es positivo no hago nada y muestro el contenido de las variables
else{
printf(lcd_putc,"TC77-->%3lu",parte_entera);
printf(lcd_putc,".%3luC",parte_decimal);
}

 

}
}

Una vez realizado el código pasamos a la realización del esquemático con ayuda del entorno de trabajo de Proteus, nuestro esquema estará compuesto de un pic de la gama alta 18f4550, un Lcd alfanumérico, una regleta de 2 para las alimentaciones, un circuito simple para el reset del pic, y como no, el componente al que va dedicada esta entrada,el sensor de temperatura TC77.

El esquema quedaría algo parecido como el de la fotografía de abajo.

 

Al simular nos salta una pantalla que nos indica las tramas de datos que van pasando entre el pic y el TC77 mediante el bus SPI, las primeras tramas del pic a TC77 son para la configuración y las siguientes solo para fijar el modo de trabajo (en nuestro caso, continuo)del TC77, por parte del componente, las tramas que manda gran parte de ellas sale en proteus como “??” eso es debido a que los dos últimos bits de la trama están indefinidos. En la siguiente captura de pantalla muestro la pantalla a la que me refería anteriormente y las tramas que se ven en ella.

 

La simulación del circuito la mostraré con un video para que se pueda apreciar como varia en el LCD alfanumérico los valores de la temperatura al variar los valores de la temperatura del TC77.

Después de la simulación debemos pasar al ARES para la realización del PCB de nuestro circuito, tal y como he sugerido otras veces podemos usar el autoplacer y el autoruter para realizar la ubicación y el rutado de una manera mucho más rápida y cómoda para nosotros, aunque algo menos profesional. Una vez rutada la placa y haber generado el plano de masa para evitar ruidos debería quedar algo así:

Usando la herramienta de output 3D que nos permite visualizar nuestra placa en 3 dimensiones nos quedaría algo como lo que paso a mostrar en estas dos ultimas fotografías de la capa de los componentes(top) y de la capa de las pistas(botton).

Para descargar el ejercicio hacer clik en el siguiente enlace: http://cid-2d81d75b5f40e144.office.live.com/self.aspx/.Public/SPI/TC77.rar

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

 
A %d blogueros les gusta esto: