22 may 2011

COMUNICACIÓN ENTRE UN PCF8591 EN MODO CONVERSOR ANALÓGICO DIGITAL (CAD) POR I2C Y UN PIC18F4550



Este ejercicio consiste en la programación de un conversor PCF8591 configurado atraves del PIC18F4550  para que funcione como un conversor ANALÓGICO/DIGITAL utilizando el BUS I2C.

Si leemos las características que nos da el fabricante veremos que para trabajar con el BUS I2C es necesario enviar en Byte la dirección válida del dispositivo.

Esta dirección consta de una parte fija (1001) y una parte programable pertenece a los pines A0, A1 y A2 que son las entradas analógicas. Y luego tenemos el último Byte para la configuración de lectura o escritura. Esta dirección debe ser enviada como primer byte justo después de la condición de arranque del protocolo I2C {i2c_start()}.

El segundo Byte que mandamos se almacena en el registro de control para controlar el dispositivo.

Una vez leídas y entendidas las características del fabricante ya podemos realizar el código:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Clara Alonso Fernández                         Mayo 2011
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA: Conversor analogico/digital (I2C) VERSIÓN:    1.0
//   DISPOSITIVO: PIC18F4550                 COMPILADOR: PCWHC Compiler v4,093
//   Entorno IDE:                            SIMULADOR:  Proteus 7.7
//   TARJETA DE APLICACIÓN: Virtual          DEBUGGER:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//   Comunicacion entre un PIC 18f4550 y un PCF8591 modo
//   Conversor Analogico Digital por I2C                             ///////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CABECERA /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h>           //PIC que se va a utilizar.          
#fuses INTHS                        //Configuración para los fusibles.                 
#use delay(internal=8mhz,RESTART_WDT)    //Configuración de la velocidad del oscilador.
#use i2c(Master,sda=PIN_B0,scl=PIN_B1,restart_wdt)    //Configuración para el I2C.
#include <LCD_flexible.c>       //Librería para el LCD.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
float lectura;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
lcd_init();               //Inicializa el LCD.
lcd_putc("Conversor ANALOGICO/DIGITAL");   //Muestra en e LCD el mensaje.
i2c_start();           // Inicio la comunicación I2C.
i2c_write(0b10010000); // Envío Dirección I2C del dispositivo.
delay_ms(10);      //Retardo de 10 mseg.
i2c_write(0b00000011); //Configuración para que funcione como conversor A/D por AIN0.
delay_ms(10);      //Retarde de 20 mseg.
i2c_start();           // Inicio la comunicación I2C.
i2c_write(0b10011001); // Envío Dirección I2C del dispositivo.
for(;;)
{
lcd_gotoxy(1,2);  //Coloca el cursor en la posición (1,2).
lectura=i2c_read();
lectura=(lectura*5.0)/256.0; //Conversion de 8 bits 
printf(lcd_putc,"I2C:%f V ",lectura); //Mostrar el dato en el LD.
}
}


Una vez hecho el código pasaremos a la simulación en PROTEUS: 


En las siguientes imágenes se muestran el primer Byte y el valor del potenciometro:


Una vez realizado el diseño en el ISIS, pasaremos al ARES para la colocación de los componentes y del cableado de la placa:


Esta es la vista 3D que nos ayuda a hacernos una idea de como quedará la placa en la realidad:




Aquí os dejo un enlace para que os podáis descargar el programa: http://cid-64f7131e50857260.office.live.com/self.aspx/CAD/CAD.rar







0 comentarios:

Publicar un comentario

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes Powered by Blogger | DSW printable coupons