Tengo que hacer un programa en el que introduces una tension digital al pic via I2C, este lo convierte en una tension analogica y muestra el resultado en 4 displays utilizando el SAA 1064. El problema viene en el momento en que la tension es inferior a 1 voltio y medio, a partir de ese momento por los displays no se muestra la verdadera tension, se queda enclavada en la ultima tension superior al voltio y medio, cuando es superior la tension se muestra sin ningun problema y me parece bastante ilogico.
Aqui os dejo el programa, es bastante enrevesado el metodo que utilizo pero no llevo mucho tiempo con ello y se hace lo que se puede
#include <16F877.h>
#use delay(clock=4000000)
#use i2c(Master,sda=PIN_C4,scl=PIN_C3)
#FUSES XT
#include <lcd_flexible.c>
float dato=0, p=0, q=0;
int b,c,d,e,f,x;
float lectura, lcd;
char lectu;
int conv(int dato) // Funcion que indica los segmentos que se deben encender en cada caso en el display
{
if(dato==0)
{
dato=0b00111111;
return(dato);
}
if(dato==1)
{
dato=0b00000110;
return(dato);
}
if(dato==2)
{
dato=0b01011011;
return(dato);
}
if(dato==3)
{
dato=0b01001111;
return(dato);
}
if(dato==4)
{
dato=0b01100110;
return(dato);
}
if(dato==5)
{
dato=0b01101101;
return(dato);
}
if(dato==6)
{
dato=0b01111101;
return(dato);
}
if(dato==7)
{
dato=0b00000111;
return(dato);
}
if(dato==8)
{
dato=0b01111111;
return(dato);
}
if(dato==9)
{
dato=0b01100111;
return(dato);
}
}
main()
{
lcd_init();
lcd_gotoxy(1,1);
lcd_putc('\f');
// lcd_putc("PCF8591 ADC I2C");
printf(lcd_putc,"Voltaje en mV");
for(;
{
i2c_start(); // Inicio la comunicación I2C con el conversor
i2c_write(0b10011110); // Envío Dirección I2C del PCF8591
delay_ms(10);
i2c_write(0b00000000); // Envío Configuración del PCF8591 para ADC por AIN0
delay_ms(10);
i2c_start(); // Inicio la comunicación I2C
i2c_write(0b10011111); // Envío Dirección I2C del PCF8591
i2c_stop();
lcd_gotoxy(1,2);
lectu=lectura=i2c_read(); //Guarda el valor de la conversion
output_d(lectu); //Visualizo el dato en formato de bits
lectura=lectura/100; //Divido entre 100 para pasar a mV
// printf(lcd_putc,"Tension:%f V ",lectura);
lcd=lectura;
lcd=lcd*1000;
x=(int)lectura; // Guardo la parte entera de lectura en una variable int
printf(lcd_putc,"%4.0f mV",lcd);
lcd_gotoxy(7,1);
p=(lectura*10)-(x*10); // con esto obtengo el primer decimal
e=(int)p; // lo guardo en una variable int
q=((lectura*100)-(x*100))-(e*10); // con esto obtengo el primer decimal
f=(int)q; // lo guardo en una variable int
b=conv(x); // Uso la funcion que me indica los segmentos del display a encender
c=conv(e);
d=conv(f);
// -------------------- FUNCIONA
i2c_start();
i2c_write(0b01110000); //configuracion de direccion (direccion 00) SAA 1064
i2c_write(0b00000000); // configuracoin de subdireccion (00)
i2c_write(0b01000001); // configuro a 6mA, y en modo dinamico
i2c_write(0b00111111); // Escribo en el display
i2c_write(d);
i2c_write(c);
i2c_write(b);
i2c_stop();
//delay_ms(1);
}
}