TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Froi en 19 de Diciembre de 2008, 16:19:43
-
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);
}
}
-
Hola Froi!
Lo primero, para manejar el SAA1064 tienes una libreria que creo vszener y modifico nocturno. La tienes aqui: http://www.todopic.com.ar/foros/index.php?topic=4728.0
Lo segundo, si bien no lei el codigo, me da la sensacion de que el error no es de soft. De hecho, creo que tampoco es un error de hard. Me supongo que estas intentando leer el voltaje de un LM317, y este regulador no entrega voltajes inferiores a 1.25v aprox, con lo cual la lectura es correcta, y no es que se te quede clavado ahi.
Si estoy diciendo incoherencias y no usas un LM317 pues habra que ver entonces donde esta el error.
Saludos
-
No, no estoy usando un LM317, es algo extraño porque en el lcd si me muestra bien la tension, y en el voltimetro tambien me lo muestra, a ver si puedo dejar el ejercicio aqui colgado por si quereis bajarlo
-
Ok, entonces el lm317 descartado.
Dame unos dias de plazo para que mire el codigo. El martes viene mi vieja de londres a visitarme y tengo que ordenar toda la casa :mrgreen:
A ver si mientras tanto te puede echar una mano otro forero.
Salu2
-
por cierto, si con el lcd te funciona bien, prueba la libreria que te dije. con ella puedes mandar texto a los displays con un printf, igual que con el lcd.