La finalidad de este ejercicio es, usando el protocolo I2C, comunicar un pic 18F4550 con el conversor PCF8591 para así poder realizar una conversión digital- analógica.
Lo primero que debemos tener en cuenta para la realización del ejercicio es como tenemos que configurar el componente para que realice la comunicación I2C correctamente.
Como siempre nos vamos a guiar del datasheet del PCF8591. Cuando sepamos como configurarlo para que realice la comunicación I2C es hora de diseñar y montar el circuito en cuestión.
Colocamos el pic que vamos a utilizar, en este caso el 18F4550, el conversor (PCF8591), y un lcd para poder observar la tensión que hay en cada momento.
El código que hemos utilizado es el siguiente:
////////////////////////////////////////////////////////////////////////////////////
// AUTOR: Diego Lavín Fernández
////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA: Conversor Digital-Analógico
// DISPOSITIVO: PIC18F4550 COMPILADOR: CCS 4.
// Entorno IDE: SIMULADOR: Proteus 7.7 sp2
// TARJETA DE APLICACIÓN: DEBUGGER:
////////////////////////////////////////////////////////////////////////////////////
//Comunicación entre PIC 18F4550 y PCF8591 mediante protocolo I2C
////////////////////////////////////////////////////////////////////////////////////
// CABECERA //////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h> //librería pic
#fuses INTHS
#use delay(internal=8mhz,RESTART_WDT)
#use i2c(Master,sda=PIN_B0,scl=PIN_B1,restart_wdt)
#include //librería lcd
///////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES /////////////////////////////////////////////////////////
int tension=0;
float a;
///////////////////////////////////////////////////////////////////////////////
// FUNCIONES //////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// PRINCIPAL //////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void main()
{
lcd_init();
lcd_putc('\f');
lcd_gotoxy(1,1);
i2c_start();
delay_ms(20);
i2c_write(0b10010000); // direcciono para escritura
delay_ms(20);
i2c_write(0b01000000); // Configuro en modo conversor digital-analógico
delay_ms(20);
do
{
if((input(pin_a0)==1)&&(tension<400)) //si pulso aumentar y es menor que 500
{
i2c_write(tension);
tension++; // Incremento la variable
delay_ms(20);
}
lcd_gotoxy(1,1);
a=tension*0.01945098; //convierto en tensión
printf(lcd_putc,"V=%2.3lfV",a);
}
while(1);
}
// AUTOR: Diego Lavín Fernández
////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA: Conversor Digital-Analógico
// DISPOSITIVO: PIC18F4550 COMPILADOR: CCS 4.
// Entorno IDE: SIMULADOR: Proteus 7.7 sp2
// TARJETA DE APLICACIÓN: DEBUGGER:
////////////////////////////////////////////////////////////////////////////////////
//Comunicación entre PIC 18F4550 y PCF8591 mediante protocolo I2C
////////////////////////////////////////////////////////////////////////////////////
// CABECERA //////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h> //librería pic
#fuses INTHS
#use delay(internal=8mhz,RESTART_WDT)
#use i2c(Master,sda=PIN_B0,scl=PIN_B1,restart_wdt)
#include
///////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES /////////////////////////////////////////////////////////
int tension=0;
float a;
///////////////////////////////////////////////////////////////////////////////
// FUNCIONES //////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// PRINCIPAL //////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void main()
{
lcd_init();
lcd_putc('\f');
lcd_gotoxy(1,1);
i2c_start();
delay_ms(20);
i2c_write(0b10010000); // direcciono para escritura
delay_ms(20);
i2c_write(0b01000000); // Configuro en modo conversor digital-analógico
delay_ms(20);
do
{
if((input(pin_a0)==1)&&(tension<400)) //si pulso aumentar y es menor que 500
{
i2c_write(tension);
tension++; // Incremento la variable
delay_ms(20);
}
lcd_gotoxy(1,1);
a=tension*0.01945098; //convierto en tensión
printf(lcd_putc,"V=%2.3lfV",a);
}
while(1);
}
Una vez hecho el código lo compilamos para asegurarnos que no existe ningún error y lo insertamos en el pic. Si todo ha ido bien el conversor estará funcionando como en la imagen que se muestra a continuación:
Ahora podemos crear el layout con el Ares y ver como quedaría en 3d.
Puede ser que al abrir el Ares nos de problemas con los packages de los componentes, esto se debe a que en proteus debemos indicar en propiedades el tipo de encapsulado que queremos.