22 may 2011

COMUNICACIÓN ENTRE UN PCF8591 EN MODO CONVERSOR DIGITAL/ANALÓGICO (DAC) 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 DIGITAL/ANALÓGICO 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 A0A1 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 seria “0100000“, ya que el primer bites fijo y la salida sera analogica. El resto de los  bits los podemos dejar en 0 puesto que no los vamos a utilizar.




////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Clara Alonso Fernández              Mayo/2011 //////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:       Conversor Digital-Analógico//////////////////////////////////////////
//   DISPOSITIVO:    PIC 18F4550               COMPILADOR:  CCS 4.068//
//   Entorno IDE:                              SIMULADOR:   ISIS Proteus 7.7 sp2  //
//   TARJETA DE APLICACIÓN: Virtual            DEBUGGER:                   //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//   CABECERA ////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h>                //PIC que vamos a utilizar.
#fuses INTHS                             //Configurar de 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.c>                        //Libreria para el LCD.
#use fast_io(a)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES /////////////////////////////////////////////////////////////////////
int tension=0;
float a;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL //////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
   lcd_init();                     //Inicialización del LCD.
   lcd_putc('\f');               //Limpia la pantalla.
   lcd_gotoxy(1,1);
                                     // Declaro variable entera (analógico) y la inicializo a 0.
   i2c_start();                  // Inicio la comunicación I2C.
   delay_ms(20);            // Retardo de 20 mseg.
   i2c_write(0b10010000);   // Configuración para el I2C.
   delay_ms(20);            // Retardo de 20 mseg.
   i2c_write(0b01000000);   // Configuración para que el funcionamiento sea de conversor digital-analógico.
   delay_ms(20);            // Retardo de 20 mseg.
   do
   {
      if((input(pin_a0)==1)&&(tension<255))  //Condición SI pulso aumentar y es menor que 255.
      {
          i2c_write(tension);              
          tension++;                              // Incremento la variable 'analógico'.
          delay_ms(20);                        // Retardo de 20 mseg.
      }
     if((input(pin_a0)==0)&&(tension>0))     //Condición SI pulso decrementar y es mayor que 0.
      {
          i2c_write(tension);                
          tension--;                               // Incremento la variable 'analógico'.
          delay_ms(20);                        // Retardo de 20 mseg.
      }
      lcd_gotoxy(1,1);                       //Coloca el cursor en la posición 1,1 dentro de la pantalla del lcd.
      a=tension*0.01945098;           //Convierte en tensión.
      printf(lcd_putc,"V-->%2.3lfV",a);   //Visualiza en el lcd la tensión.
   }
   while(true);                                //El bucle se repite constantemente.
}

Después paramos a realizar la simulación en PROTEUS:


En la siguiente imagen podemos ver el primer Byte de dirección y el segundo byte de configuración:


Después paramos al ARES para colocar los componentes y dar forma a la placa:


Y las siguientes imágenes muestran el diseño de la placa en 3D para hacernos una idea de su forma real:



Aquí os dejo un enlace para que os podáis descargar el ejercicio: http://cid-64f7131e50857260.office.live.com/self.aspx/DAC/DAC.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