Autor Tema: I2C y SAA 1064  (Leído 2260 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Froi

  • PIC10
  • *
  • Mensajes: 4
I2C y SAA 1064
« 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);
   }
}

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: I2C y SAA 1064
« Respuesta #1 en: 20 de Diciembre de 2008, 01:41:14 »
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
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Froi

  • PIC10
  • *
  • Mensajes: 4
Re: I2C y SAA 1064
« Respuesta #2 en: 20 de Diciembre de 2008, 14:27:20 »
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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: I2C y SAA 1064
« Respuesta #3 en: 20 de Diciembre de 2008, 15:57:49 »
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
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: I2C y SAA 1064
« Respuesta #4 en: 20 de Diciembre de 2008, 15:59:42 »
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.
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.


 

anything