La finalidad de este ejercicio es la medición de la temperatura con el sensor TC77, utilizando el bus SPI para la comunicación entre el sensor y el PIC18F4550.
Lo primero que hay que hacer es mirar en el datasheet para saber la configuración del sensor. Una vez estudiado la configuración y el funcionamiento del TC77 comenzaremos a realizar el código para la visualización de la temperatura en el LCD.
////////////////////////////////////////////////////////////////////////////////////
// AUTOR: Clara Alonso Fernández Abril/2011
////////////////////////////////////////////////////////////////////////////////////
// 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: virtual DEBUGGER: virtual
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// LEER LA Tº DEL SENSOR TC77
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h>
#fuses INTHS //Selecciona el oscilador interno
#use delay(internal=8Mhz) // Selecciona la velocidad del oscilador interno
#include <LCD.c>
////////////////////////////////////////////////////////////////////////////////////
// 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,"VOLTIOS=-%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,"VOLTIOS=%3lu",parte_entera);
printf(lcd_putc,".%3luC",parte_decimal);
}
}
}
Una vez hecho el código pasaremos a realizar el esquemático con la ayuda del simulador de PROTEUS. El esquemático consta del PIC18F4550, de el sensor TC77, de una pantalla LCD y de un módulo SPI.
Os voy a mostrar cómo quedaría el esquemático.
El siguiente paso es realizar la PCB en el ares. Yo utilizo el "autoruter" para cablear más rápido.
Y si queremos también podemos ver la PCB en 3D con la herramienta "output 3D", que nos ayudará a hacernos una idea de como es la PCB de forma real.
Aquí os dejo un enlace con el código, el esquemático y el datasheet: http://cid-64f7131e50857260.office.live.com/self.aspx/MEDIDOR%20TEMPERATURA%20TC77/TC77.rar
0 comentarios:
Publicar un comentario