Sei sulla pagina 1di 11

Bus I2C: Sensor de Temperatura MCP9800 con PIC16F628A y LCD

Ral Alvarez

El protocolo de bus serial I2C puede parecer complicado de implementar para quienes nunca han usado previamente buses seriales, y en verdad lo es, si se trata de manejar el protocolo al nivel ms bajo de la especificacin. Sin embargo, el uso de libreras de alto nivel que se encarguen de ocultar las complejidades de bajo nivel en la implementacin de protocolo I2C, permiten a un "principiante" lograr de manera ms sencilla e inmediata la implementacin de una aplicacin simple con un dispositivo que se comunica mediante este bus serial. En este tutorial implementamos un termmetro digital con pantalla LCD haciendo uso del sensor MCP9800 de Microchip que se comunica mediante I2C, un microcontrolador PIC16F628A y una pantalla universal de cristal lquido (LCD) de 16x2 (16 columnas por 2 filas). El software se ha desarrollado en lenguaje C para el compilador PICC de Hi-Tech haciendo uso de las librerasy ejemplos provistos por este ltimo, tanto para la interfaz con el LCD como para la interfaz serial con el sensor de temperatura.

Descripcin de los Componentes Principales

Microcontrolador PIC16F628A
Las caractersticas del El PIC16F628A ms relevantes al proyecto son las siguientes:

Microcontrolador de 8 bits Oscilador interno de 4 MHz calibrado en fbrica a +/-1% 16 pines de E/S con control individual de direccin Tres mdulos temporizadores Memoria flash de 2K, RAM de 224 bytes y EEPROM de 128 bytes. PIC16F628A (Ver este producto en nuestra Tienda Virtual

En este proyecto el PIC se ha programado para trabajar con su oscilador interno de 4 MHz, minimizando as el conteo de componentes externos. Debido a que el microcontrolador no cuenta con un mdulo de comunicacin serial I2C, la comunicacin se realizar mediante el mtodo "bit banging" por software; para ello, el compilador PICC de Hi Tech provee libreras ejemplo, las cuales se han usado para la realizacin de dicha comunicacin.

Pantalla de Cristal Lquido (LCD)


El LCD es un display alfanumrico genrico de interfaz paralela. Utiliza bsicamente 3 lneas para control y 8 lneas para datos, aunque tambin puede funcionar con solamente 4 lneas de datos. Se ha escogido esta ltima modalidad a fin de ahorrar las 4 lneas adicionales. La comunicacin del PIC con el LCD es manejada Pantalla LCD (Ver este producto en nuestra Tienda Virtual) totalmente por una librera correspondiente incluida tambin en los archivos de ejemplo del compilador PICC.

Sensor de Temperatura con Conexin Serial I2C


El sensor MCP9800 de Microchip es un sensor de bajo costo, bajo consumo de potencia y alta resolucin que puede ser usado en aplicaciones de propsito general y en sistemas complejos (servidores, computadoras, equipos de comunicaciones, equipo de oficina y otros). Sus caractersticas ms sobresalientes son las siguientes: Sensor de Temperatura MCP9800 (Ver este producto en nuestra Exactitud mxima de +/- 0.5C con 12 bits de resolucin Resolucin seleccionable por el usuario: 9-12 bits Voltaje de operacin: 2.7V a 5.5V Interfaz de 2 hilos: I2C/SMBus Compatible Bajo consumo de corriente. Tienda Virtual)

Diagrama del Circuito

Seccin LCD del Circuito


El LCD maneja su interfaz de comunicacin mediante tres lneas de control:

RS: Selector de Registro (Register Select) conectado en este caso al pin RA3 del PIC. Con un "0" lgico en este pin, el LCD espera recibir un comando, y con un "1" lgico espera recibir un dato.

R/W: Lectura/Escritura (Read/Write). Conectado al pin RA2, con un 1 lgico el LCD se habilita para lectura y con un 0 lgico, para escritura. E: Habilitacin (Enable). Conectado al pin RA1. Habilita al LCD para reconocer los comandos y datos enviados y/o solicitados.

Dado que el LCD posee dos modos de funcionamiento: con bus de datos de 8 bits y con bus de datos de 4 bits, se ha escogido este ltimo para minimizar el tamao del circuito. Los pines RB3-RB0 del PIC se han conectado respectivamente a los pines D7-D4 del LCD, esto ltimo segn especifica el manual para el modo de funcionamiento con bus de datos de 4 bits. Bsicamente se puede usar casi cualquier grupo de pines, tanto del puerto A como del puerto B para la interconexin con el LCD, siempre que todas las lineas de control estn conectadas a un puerto y las lineas de datos conectados a otro puerto distinto (no ubicar lineas de control y datos en el mismo puerto), de otro modo las libreras para la comunicacin con el LCD podran no funcionar correctamente.

Seccin Microcontrolador

Como ya se explic anteriormente, el circuito del PIC se simplifica grandemente con el uso de su reloj interno, obviando as componentes externos para el circuito de reloj. El circuito es muy simple como se puede apreciar en la figura.

Seccin Sensor de Temperatura

El sensor de temperatura trabaja solamente en modo Esclavo, por lo cual el PIC debe trabajar en en modo Maestro (Para ms detalles ver las especificaciones oficiales del protocolo I2C). El bus serial maneja dos lneas/seales:

SDA: Datos Seriales (Serial Data), a travs de la cual el Esclavo manda y recibe los datos requeridos por el dispositivo Maestro. SCL: Reloj Serial (Serial Clock), a trevs de la cual recibe del Maestro la seal de reloj necesaria para la sincronizacin de la comunicacin.

Adicionalmente este sensor posee una salida ALERT (alerta) la cual provee una seal de salida cuando la temperatura sobrepasa un valor programado por el usuario. No hacemos uso de esta caracterstica en el presente tutorial, pero es tambin de muy fcil implementacin.

Preparacin del Sensor El sensor viene en un empaque SOT-32 y es muy pequeo; para poder usarlo en el breadboard tuvimos que prepararlo convenientemente:

1. Pegamos el sensor en un pequeo pedazo de cartn con un pegamento de carpintera. Se puede usar cualquier pegamento que pegue plstico y metal, pero que sea no conductivo. 2. Pegamos alambres de extensin alinendolos con las terminales del chip. 3. Despus de dejar secar el pegamento por un tiempo, soldamos cuidadosamente las uniones entre los alambres de extensin y las terminales. 4. Doblamos los alambres y ya est listo para conectarse al breadboard.

Breve Definicin del Protocolo I2C


El protocolo de bus est definido de la siguiente manera:

Master (Maestro): Dispositivo que controla el bus serial, usualmente un microcontrolador. Slave (Esclavo): El dispositivo direccionado por el maestro (el MCP9800 en este caso). Transmitter (Transmisor): Dispositivo que enva datos al bus. Receiver (Receptor): Dispositivo que recibe datos del bus. Start (Inicio): Una seal nica enviada por el Maestro para iniciar la interconexin serial con un Esclavo. Stop (Terminacin): Una seal nica enviada por el Maestro para terminar la interconexin serial con un Esclavo. Read/Write (Lectura/Escritura): Una lectura o escritura realizada a los registros internos del MCP9800. ACK: El receptor Reconoce (Acknowledge = Reconocimiento) la recepcin de cada byte mediante consulta repetitiva (polling) del bus. NAK: El receptor No Reconoce (Not-Acknowledge = No reconoce), o libera el bus para mostrar la condicin EOD (End of Data = Fin de Datos). Busy (Ocupado): La comunicacin no es posible debido a que el bus est en uso (Se pueden conectar varios dispositivos al mismo bus). Not Busy (No Ocupado): El bus est en estado pasivo, ambas lneas SDA y SCL permanecen altas. Data Valid (Dato Vlido): SDA debe permanecer estable antes de que SCL suba (1 lgico), a fin de que un bit de datos sea considerado vlido. Durante trasnferencias normales de datos, SDA solo cambia de estado cuando SCL est bajo (0 lgico).

Para una informacin ms detallada del protocolo consultar la Hoja de Datos del sensor MCP9800 y las especificaciones oficiales del protocolo I2C.

Listado del Programa


view source print?

001./* ********************************************************************** ********* 002. * Sensor Serial de Temperatura I2C con PIC16F6248A y LCD Ver. 1.0 003. * 004. * Recibe la lectura de temperatura del sensor MCP9800 (Microchip) 005. * mediante I2C y lo visualiza en un LCD genrico de 16x2. 006. * Hace uso de las libreras y cdigo ejemplo provistos por el compilador 007. * PICC de HI-tech. 008. * 009. * Hardware: PIC16F628A, MCP9800, LCD 16x2 genrico. 010. * Funciones: Software ejemplo para el sensor digital de temperatura MCP9800 011. * Versin: 1.0 (1 De febrero de 2011)

012. * Autor: Raul Alvarez Torrico (www.TecBolivia.com) 013. * 014. * Descargado de www.TecBolivia.com - Ingresa al sitio para ms ejemplos similares. 015.****************************************************************** ****************/ 016. 017.#include <htc.h> 018.#include <stdlib.h> // Necesario para la funcin itoa() 019.#include <stdio.h> // Necesario para la funcin itoa() 020.#include "lcd.h" // Librera para comunicacin con el LCD incluida con el compilador PICC 021.#include "delay.h" // Librera para retardos incluida con el compilador PICC 022.#include "i2c.h" // Librera para comunicacin I2C incluida con el compilador PICC 023. 024./* Palabra de configuracion para el PIC16F628A, versin PICC 9.70 */ 025.//__CONFIG(UNPROTECT & UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO); 026. 027./* Palabra de configuracion para el PIC16F628A para versiones del compilador PICC desde 028. la Version 9.81 en adelante */ 029.__CONFIG(CPD_OFF & CP_OFF & LVP_OFF & BOREN_ON & MCLRE_ON & PWRTE_ON & WDTE_OFF & FOSC_INTOSCIO); 030. 031./* A partir de la versin 9.81 del compilador PICC las definiciones de los bits de configuracin 032. han sido cambiadas. Todas las definiciones para el PIC16F628A estn ubicadas en el archivo: 033. (Directorio Archivos de Programa)\HI-TECH Software\PICC\9.xx\include\pic16f628a.h 034.*/ 035. 036.void mostrar_temp (signed char * msb, char * lsb, char fila); 037. 038.void 039.main(void) 040.{ 041.char aux; 042. /* La parte entera de la lectura viene en complemento a 2, por lo cual 043. es necesaria una variable con signo */ 044. signed char byteMSB = 0; 045. char byteLSB = 0; 046. 047. CMCON = 0x07; // Configurar Puerto A como digital I/O 048. /* Habilitar Pull-ups en el Puerto B, de este modo se obvian las resistencias 049. * de Pull-up en las lneas SDA y SCL para la comunicacin I2C */ 050. RBPU = 0; // Habilitar pull-ups en el Puerto B

051. 052. lcd_init(); // Funcin de inicializacion del LCD 053. 054. /* Supuestamente la funcin i2c_SendAddress() se encarga de fijar el 055. bit R/W a 1 o 0 lgico, segun se use i2cWriteTo() o i2c_ReadFrom(), 056. sin embargo no es as. La funcin 12c_WriteTo() por ejemplo, solo funciona 057. bien si se especifica apropiadamente un '0' en el LSB de la direccin de 058. escritura. En nuestro caso, 0x90 para escritura y 0x91 para lectura. 059. Aparentemente hay un error en la funcin i2C_Open() de la librera*/ 060. 061. aux = 0; // Variable auxiliar para comprobar comunicaciones 062. 063. /* Escribir nuevo CONFIG */ 064. do { 065. aux = i2c_WriteTo(0x90); // Direccion de escritura 10010000 066. i2c_PutByte(0x01); // Puntero al registro TA 067. i2c_PutByte(0x40); // Configurar 0010 0000 (11 bits o 0.125C de resolucin) 068. i2c_Stop(); 069. /* Ojo: Estas libreras retornan un valor FALSE con una escritura exitosa */ 070. } while (aux != FALSE); 071. 072. while (1) { // Ciclo infinito 073. 074. aux = i2c_WriteTo(0x90); // Direccion de escritura 10010000 075. i2c_PutByte(0x00); // Puntero al registro TA 076. i2c_ReadFrom(0x91); // Direccion de lectura 10010001 077. byteMSB = i2c_GetByte(I2C_MORE); // Leer 1 byte, hay ms por leer 078. byteLSB = i2c_GetByte(I2C_LAST); // Leer el ltimo byte 079. i2c_Stop(); 080. 081. /* Conversin de la parte decimal a un entero sin el "0." */ 082. byteLSB = 100*byteLSB/256; 083. 084. /* Mostrar la temperatura en el LCD */ 085. mostrar_temp(&byteMSB, &byteLSB, 0); 086. 087. DelayMs(996); // Dos retardos de casi 1 segundo 088. DelayMs(996); 089. } 090.} 091. 092./***************************************************************** ************** 093.* MUESTRA LA TEMPERATURA EN EL LCD 094.*

095.* Descripcin : Muestra en el LCD los caracteres correspondientes a la 096.* temperatura. 097.* Argumentos : signed char * msb puntero al byte del entero 098.* char * lsb puntero al byte del decimal 099.* char fila la fila para la escritura de la temperatura 100.* Retorna : Nada 101.* Notas : El byte MSB viene como numero en complemento a 2 (con signo) 102.* y el byte LSB viene como entero sin el "0." 103.****************************************************************** **************/ 104. 105.void mostrar_temp (signed char * msb, char * lsb, char fila) 106.{ 107. char buf[3]; // Buffer temporal para conversin entero a cadena de caracteres 108. 109. lcd_goto(fila); // Posicionar el cursor del LCD en la fila correspondiente 110. lcd_puts("Temp:"); 111. itoa(buf, *msb, 10); // Convertir byte MSB (complemento a 2) a cadena de caracteres 112. lcd_puts(buf); // Manda la parte entera a LCD 113. lcd_putch('.'); 114. 115. itoa(buf, (*lsb), 10); // Convertir byte LSB a cadena de caracteres 116. lcd_puts(buf); // Mandar la parte decimal a LCD 117. lcd_goto(0x0A); 118. lcd_puts(" C"); 119.}

Descripcin de las Partes Ms Relevantes del Cdigo


view source print?

1.CMCON = 0x07; // Configurar Puerto A como digital I/O 2./* Habilitar Pull-ups en el Puerto B, de este modo se obvian las resistencias 3.* de Pull-up en las lneas SDA y SCL para la comunicacin I2C */ 4.RBPU = 0; // Habilitar pull-ups en el Puerto B

El Puerto A del PIC16F628A se configura como entradas anlogas por defecto despus de un reset; es necesario especificar su configuracin como puerto digital. Importante: Si no se habilitan los pull-ups de los pines SDA y SCL configurados en el Puerto B, se debe aadir dos resistencias pull-up a ambas lneas del bus, las cuales son requeridas para el funcionamiento del protocolo I2C.

---------------------------------------------------------------------------------------view source print?

1.do { 2. aux = i2c_WriteTo(0x90); // Direccion de escritura 10010000 3. i2c_PutByte(0x01); // Puntero al registro TA 4. i2c_PutByte(0x40); // Configurar 0010 0000 (11 bits o 0.125C de resolucin) 5. i2c_Stop(); 6. /* Ojo: Estas libreras retornan un valor FALSE con una escritura exitosa */ 7.} while (aux != FALSE);

Con el segmento de cdigo anterior se realiza la configuracin del MPC9800 en cuatro pasos: 1. Mandar la direccin de escritura al MCP9800 para ser reconocida por el mismo. Los 7 bits ms significativos de la direccin son fijos y vienen predeterminados de fbrica (ver Hoja de Datos del MCP9800). El bit menos significativo en la direccin es el bit R/W (lectura/escritura). Con un 0 lgico en este bit, se especifica que se quiere escribir en los registros internos del sensor, y con un 1 lgico se especifica que se quiere leer de los mismos. 2. Mandar el puntero al registro interno del MCP9800 El sensor posee 4 registros internos direccionable mediante un puntero de 8 bits, en el cual se usan efectivamente los 2 bits menos significativos y los 6 bits restantes deben estar a 0 lgico. Los registros y sus punteros son los siguientes:

Registro TA (Temperatura Ambiente, solo lectura): Provee el dato de la temperatura ambiente en un formato de 9 hasta 12 bits programable por el usuario. La temperatura se la obtiene en dos lecturas sucesivas de 8 bits. Puntero de acceso: 0000 0000

Registro CONFIG (Configuracin, lectura/escritura): Permite la configuracin para el funcionamiento del sensor para, por ejemplo: ciclo de trabajo del sensor, seal ALERT de salida, desactivacin del sensor y resolucin de bits. En este tutorial solamente estamos configurando la resolucin de bits, sin embargo el resto de las funciones pueden ser configuradas de la misma manera (ver Hoja de Datos de sensor).

Registro THYST (Histresis de Temperatura, lectura/escritura): Registro de 16 bits que permite la configuracin de una determinada histresis para el lmite de temperatura TSET (ver ms abajo). Para ello se puede escribir en este registro un valor de temperatura lmite mmina de 9 bits en formato de complemento a 2.

Registro TSET (Lmite de temperatura, lectura/escritura): Registro de 16 bits que permite la configuracin de un determinado valor mximo lmite de la temperatura. Si este lmite es sobrepasado, una seal ALERT (pin 3 del MCP9800) es enviada afuera. Este lmite de temperatura mxima se la programa con un dato de 9 bits en formato de complemento a 2.

3. Mandar la palabra de configuracin Los bits 5-6 del registro CONFIG definen la resolucin de bits segn la siguiente tabla: 00 = 9 bit o 0.5C (Por defecto) 01 = 10 bit o 0.25C

10 = 11 bit o 0.125C 11 = 12 bit o 0.0625C En el cdigo, con el byte: 0010 0000 (0x40) estamos configurando al sensor para que trabaje con 11 bits o 0.125C de resolucin. Algon muy importante que tomar en cuenta es que la mayora de las rutinas I2C que viene con el compilador PICC de Hi-Tech (en este caso se ha usado la versin 9.7) retonan FALSE para una comunicacin exitosa y TRUE si se ha verificado algn error. de ah que en el bloque "while" evaluamos "aux != FALSE" como condicin para seguir intentando una configuracin exitosa. 4. Terminacin la comunicacin con i2c_Stop() ---------------------------------------------------------view source print?

01.while (1) { // Ciclo infinito 02. 03.aux4 = i2c_WriteTo(0x90); // Direccion de escritura 10010000 04.aux5 = i2c_PutByte(0x00); // Puntero al registro TA 05.aux4 = i2c_ReadFrom(0x91); // Direccion de lectura 10010001 06.byteMSB = i2c_GetByte(I2C_MORE); // Leer 1 byte, hay ms por leer 07.byteLSB = i2c_GetByte(I2C_LAST); // Leer el ltimo byte 08.i2c_Stop(); 09. 10./* Conversin de la parte decimal a un entero sin el "0." */ 11.byteLSB = 100*byteLSB/256; 12. 13./* Mostrar la temperatura en el LCD */ 14.mostrar_temp(&byteMSB, &byteLSB, 0); 15. 16.//mostrar_temp(&byteMSB, &(100*byteLSB/256), 0); 17. 18.DelayMs(996); // Dos retardos de casi 1 segundo 19.DelayMs(996); 20.}
Para leer la temperatura seguimos seis pasos: 1. 2. 3. 4. 5. 6. Mandamos la direccin de escritura del sensor (0x90) indicando que deseamos escribir a sus registros internos. Mandamos (escribimos) el puntero al registro TA (0x00) que almacena los datos de lectura de la temperatura ambiente. Mandamos la direccin de lectura del sensor (0x91) indicando que deseamos leer de su registro interno TA (temperatura ambiente). Leemos el Byte Ms Significativo (MSB) que contiene los enteros. Leemos el Byte Menos Significativo (LSB) que contiene los decimales. Terminamos la comunicacin con i2c_Stop()

Para obtener la parte decimal del cdigo binario ledo, la hoja de datos especifica que se debe utilizar la frmula:

TA = Code x 2 Donde:

-4

TA = Temperatura Ambiente (C) Code = Salida del MCP9800 en decimal En nuestro caso llega a ser: byteLSB = byteLSB*(2 ) Debido a que el nmero se encuentra almacenado en formato de 8 bits, a pesar de que los 4 bits menos significativos no se usan y permanecen en 0. Como paso adicional, multiplicamos el nmero por 100 para eliminar el punto decimal. De ese modo podremos escribir la parte decimal de la temperatura como si fuera un nmero entero.
-8

Conclusin

Obviamente que, a la larga, se hace necesario un entendimiento ms profundo, de ms bajo nivel, de dicho protocolos; si se quiere implementar aplicaciones propias desde "cero" o probar otros dispositivos I2C, ya que an con el uso de libreras siempre se habr la necesidad de escribir y probar por uno mismo nuevo cdigo de aplicacin, es as que, mientras ms uno conozca del funcionamiento intrnseco de los protocolos, ms fcil se hace desarrollar nuevas aplicaciones.

Para quienes no usaron antes I2C, el uso de libreras y proyectos de ejemplo hace ms gratificante y menos traumtico el uso del protocolo, abriendo un nuevo mundo de posibilidades para nuevos proyectos usando sensores, memorias, pantallas LCD con bus serial, convertidores ADC y otros dispositivos I2C. Ya ests pensando en cual ser tu nuevo proyecto con el bus serial I2C?

Potrebbero piacerti anche