Autor Tema: Error de visualización GLCD, con protocolo I2C [SOLUCIONADO]  (Leído 6486 veces)

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

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:Error de visualización GLCD, con protocolo I2C
« Respuesta #15 en: 23 de Julio de 2020, 21:39:43 »
Corrección, hice lo siguiente dentro del main, en el ciclo infinito, teniendo ocupada solo el 29% de la RAM:

Código: [Seleccionar]
while(true)
   { 
      if(i2c_datos==1 && dato==25)
      {
         i2c_datos=0;
         
         a=(int)dato/10;
         dato=dato-(a*10);
         b=(int)dato/1;
         
         cadena_datos[0]=a+'0';
         cadena_datos[1]=b+'0';
         
         if(cadena_datos[0]=='2' && cadena_datos[1]=='5')
         {
            glcd_text57(73,18,recibido_ok,2,1);
            glcd_update();
         }
         
      }
     
   }

y obtuve en pantalla:

 

* corrobora_ok.jpg
(66.78 kB, 400x533 - visto 309 veces)
Nunca se deja de aprender

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error de visualización GLCD, con protocolo I2C
« Respuesta #16 en: 23 de Julio de 2020, 22:27:50 »
Eso quiere decir que esta correctamente el 25 en cadena_datos...

Ojo, recorda que necesitas terminarlo con un 0 en cadena_datos[2]. Y podes enviar eso al LCD

Ya con cadena_datos[0] = '2', en [1] = '5' y en [2] = '\0' (ó cero - 0)  podrias enviarle al LCD...

Deberia darte el mismo error, ya que aca todo comprueba que la conversion es correcta, se esta recibiendo lo correcto, etc. luego solo resta ver el codigo de la libreria.

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:Error de visualización GLCD, con protocolo I2C
« Respuesta #17 en: 24 de Julio de 2020, 03:02:10 »
pues, dicho y echo, agregue lo que me faltaba, en la posicion cadena_datos[2] (el cero), y el error, es el mismo, no hace falta subir foto, es identico.  :(

voy a ver si encuentro algo en la libreria, agradezco y agradecere mucho tu apoyo Killer, y de todos los compañeros
Nunca se deja de aprender

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Error de visualización GLCD, con protocolo I2C
« Respuesta #18 en: 24 de Julio de 2020, 07:49:26 »
  ¿El puerto del glcd está compartiendo el mismo I2c??, o es SPI compartiendo líneas SDA SCL ?? 

    Haz una comunicación I2C, una vez hecha envíale al glcd otro valor cualquiera desde una variable, y no el valor recibido.

    Si te aparece el error es posible que el fallo sea que de alguna manera esa comunicación i2C entre máster y slave este enviando algo al glcd previamente.

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:Error de visualización GLCD, con protocolo I2C
« Respuesta #19 en: 24 de Julio de 2020, 10:17:30 »
Que tal remi04, el I2C esta independiente de las conexiones del GLCD, la comunicacion entre maestro y esclavo es correcta, la hemos descartado paso a paso con Killer.

Ahora, la parte de envio desde otra variable, funciona correctamente, al punto de que, cualquier dato que le mandas a la GLCD proveniente desde el PIC que la controla (interno digamos), lo dibuja correctamente, y el dato que proviene desde el maestro (externo), aunque correcto el dato, no lo dibuja correctamente.

Saludos y seguimos probando
Nunca se deja de aprender

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error de visualización GLCD, con protocolo I2C
« Respuesta #20 en: 24 de Julio de 2020, 11:06:43 »
Eso me preocupa, porque de un OK a un 25 no hay diferencias. Son dos lugares de memoria + un caracter nulo por igual en ambos casos.

Las únicas diferencias pueden ser donde están almacenados (direcciones si estan en RAM) Un error en RAM no debería provocar esto, ya que estaría escribiendo y leyendo otra cosa.. Por lo tanto no seria correcto, un error de acceso tal ves. Ya que sabemos que el 25 esta, pero con caracteres extras. Por otra parte, escribiéndolo normalmente al 25 funciona bien, por lo que no debería tener problemas.

Cosas a probar.

- Podes mostrar como estas definiendo el OK y el array cadena_datos?
- Podes cambiar de lugar el cadena_datos, dentro de lo que definís las variables? (ponerlo al principio, o definirlo dentro del mismo if, asi se crea allí. O déjalo y definimos otro array

Código: C
  1. while(true)
  2.    {
  3.       if(i2c_datos==1)
  4.       {
  5.          i2c_datos=0;
  6.          char test[3];
  7.          test[2]='\0';
  8.  
  9.          a=(int)dato/10;
  10.          dato=dato-(a*10);
  11.          b=(int)dato/1;
  12.          
  13.          test[0]=a+'0';
  14.          test[1]=b+'0';
  15.          
  16.          glcd_text57(73,18,test,2,1);
  17.          glcd_update();
  18.       }
  19.    }

- Ocurre con todos los números probaste un 52, 32, 28 como para ver si los errores se mantienen en todos los digitos, o únicamente el 2 y el 5.
- Probaste otro tamaño ( el 1 que seria el mas simple dentro del algoritmo )


Sino ya pasamos a modificar la libreria del GLCD para tratar de entender que esta pasando. Ya que es lo unico que tenemos para ver cual es el posible problema.

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 908
Re:Error de visualización GLCD, con protocolo I2C
« Respuesta #21 en: 24 de Julio de 2020, 12:00:14 »
Antes de escribir un nuevo carácter, tienes que borrar el anterior, la lcd no lo hace automáticamente...


glcd_text57(73,18,test_ant,2,0); //Esto escribe el carácter anterior pero apagando los pixeles
glcd_update();

glcd_text57(73,18,test,2,1);      //Escribe el nuevo carácter
glcd_update();

También puedes limpiar toda la pantalla y reescribirla de nuevo pero se ve mucho parpadeo y muy pirata...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error de visualización GLCD, con protocolo I2C
« Respuesta #22 en: 24 de Julio de 2020, 12:39:07 »
No entiendo que tiene que ver una cosa con la otra....

El script reescribe un bloque de 5x7 por cada caracter, y dependiendo del tamaño lo que hace es multiplicarlo, es decir 10x14, 15x21
Escribe tanto los 0, como los 1. Por lo que el bloque deberia verse bien.

Ademas por lo comentado el problema esta cuando se se usa lo recibido por el I2C, pasado a ASCII en un string y luego mostrarlo, ya que mostrar el mismo numero pero sin recibirlo funciona perfecto como podes ver en las imagenes.

La pregunta es ya que es el mismo contenido....

¿Cual es la diferencia entre crear una string en memoria, o usar un algun string ya "prearmado"? Y lo unico que veo es el lugar de almacenamiento.
Pero si fallara el lugar de almacenamiento, entonces significa que escribiria cualquier cosa. Ya que vos guardas un 2, y podes leer un 8 supongamos si falla algun bit. Pero este no es el caso.
Se puede ver el 2 y el 5 claramente en la imagen, pero con algunos "extras".

¿Sera que esta activado el I2C y sea un problema de hardware? Imposible, ya que mostramos que al recibir y transformar correctamente el 25 en "25" pero mostrando la palabra "OK" funciona perfecto.

Poco a poco fuimos probando y dividiendo el problema. El proximo paso que queda probar es el acceso a memoria del script que muestra en el LCD. Que los datos traidos de memoria sean los correctos.
Pero con un string fijo funciona, entonces el acceso a la FLASH donde esta contenido no "debería" ser el problema. Entonces .... Tengo un '2' en ambos casos. Lo se porque vemos el 2. En uno lo dibuja bien y en otro no. Algo falla en este punto.

Por que al buscar el segundo bit, en ves de recibir:
0x42, 0x61, 0x51, 0x49, 0x46,

Esta escribiendo:

0x42, 0x65, 0x53, 0x7F, 0x46,


- ¿Lo lee mal de la Flash?
- ¿El script esta haciendo algo raro? ¿Que cambia con una letra almacenada en algún lado y en otro ?
- ¿Es problema del compilador, generando algun codigo raro en ese momento?

Ruido no parece ser porque en multiples imagenes, tenes el mismo problema, los mismos valores.

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:Error de visualización GLCD, con protocolo I2C
« Respuesta #23 en: 24 de Julio de 2020, 15:40:39 »
esta de locos esto.

Killer:

-Si he probado cambiar la declaración a otro sitio y el problema es el mismo
-Ocurre con todos los números, sin excepción
-El tamaño lo he cambiado hasta 4, y lo mismo, el problema se replica

Ahora me ha metido la duda Duende, y si se esta sobreescribiendo otro dato, y por eso se ve asi???

Pero....de donde?? del maestro??? al final estoy poniendo a trabajar el PIC como un dispositivo I2C, no es un CI puramente I2C como lo seria un expansor por ejemplo, e igual se esta dejando algo previo

Tengo que revisar y sigo probando

saludos y muchas gracias por la ayuda, espero porder resolverlo
Nunca se deja de aprender

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Error de visualización GLCD, con protocolo I2C
« Respuesta #24 en: 24 de Julio de 2020, 17:57:40 »
Yo sigo pensando que el problema aparece solo y únicamente cuando se produce una transmisión I2c.

   Me explico:

     - generas una variable y la inicializas con valor 25.
     - envías la variable al glcd y el 25 aparece perfecto.

    El otro caso:

     - generas igualmente una variable y la inicializas con valor 25.
     - haces una transmisión I2c “por hacerla”, no vamos a utilizar su valor, solo me interesa que se produzca la operación. I2c
      - envías la variable al glcd.  No la recibida por I2c sino la generada.

     ¿Aparece el problema o se sigue viendo bien el 25? 

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:Error de visualización GLCD, con protocolo I2C
« Respuesta #25 en: 25 de Julio de 2020, 02:41:40 »
Que tal remi04, tal como lo planteas, mi respuesta es, se sigue viendo correctamente y el problema no ocurre


Nunca se deja de aprender

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:Error de visualización GLCD, con protocolo I2C [SOLUCIONADO]
« Respuesta #26 en: 25 de Julio de 2020, 03:17:40 »
Bueno muchachos, pues al fin funciona, ni Killer,ni remi04, ni mucho menos yo tenia razon, Duende Azul, tenias razon.

Voy a tratar de explicar lo mejor que pueda

Cuando Duende hizo el comentario de tener que borrar el caracter anterior antes de escribir el que queria (que claramente se dibujaba la silueta, me puse a observar con detenimiento justo el momento cuando dibujaba, y aunque era muy dificil, se notaba que ponia algo antes, parpadeaba.

entonces, pues fui al lugar que nunca sospeche, el codigo del maestro, solo pondre el main() para simplificar, este es mi codigo de prueba:

Código: [Seleccionar]
void main(void)
{
   init_device();
   
   delay_ms(1000);
   
   i2c_start(i2c_maestro);
   i2c_write(i2c_maestro,0x10);
   i2c_write(i2c_maestro,25);
   i2c_stop();
   
   while(true)
   {
     
   }
}

Ok, como se ve, envio la direccion del esclavo, y despues el dato, como se haria normalmente con cualquier dispositivo I2C, o al menos asi lo hago yo, con lo que yo no contaba, era que, el dato de la direccion del esclavo, tambien lo tomaba como un valor valido a procesar, yo pense que lo descartaba al momento de coincidir con la direccion del esclavo, y era el siguiente dato (mi amado 25) el que tomaria, pues no, el puñetero 0x10, se metia, que en decimal es un 16, y ese señores, es el que se colaba detras del 25.

He echo la modificacion similar a como la planteo Duende Azul, quedando asi:

Código: [Seleccionar]
void main()
{
   //Configuracion y Plantilla base del GLCD
   configuracion();
   plantilla_base();
 
   //Ciclo infinito
   while(true)
   { 
      if(i2c_datos==1)
      {
         i2c_datos=0;
         
         sprintf(cadena_datos,"%u",dato);
         glcd_text57(10,10,cadena_datos,4,0);
         sprintf(cadena_datos,"%u",dato);
         glcd_text57(10,10,cadena_datos,4,1);
         glcd_update();       
      }
     
   }
}

y ahora si, funciona, me muestra el bellisimo 25, integro, nitido, y sin pixeles añadidos, ese o cualquier numero, o letra

creo que tal ves lo correcto seria, antes de escribir el dato final, borar el area a trabajar, no toda la pantalla como bien lo apuntaba Duende Azul, solo un recuadro digamos, y despues de ello, ahora si, escribir el dato final

mi teoria es que, como el PIC no es un componente puramente I2C, tiene detalles como este, de no excluir la direccion propia y tomarlo como un dato, o al menos no lo hace del modo como lo haria un componente puramente I2C, llamese un DS1307, por ejemplo, o similar.

Si existe alguna manera, o funcion, que pueda implementar y mejorar esto, se los agradecere mucho, asi como doy gracias al buen Killer, a remi04, y por su puesto a Duende Azul por la atencion y ayuda prestada, sin su ayuda no se hubiera logrado, como siempre, orgulloso de pertenecer a una comunidad tan colaboradora como lo es TodoPIC.

Si existe alguna duda en la que pueda ayudar del tema, no duden en preguntarme

Saludos compañeros
Nunca se deja de aprender

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error de visualización GLCD, con protocolo I2C [SOLUCIONADO]
« Respuesta #27 en: 25 de Julio de 2020, 11:08:59 »
Eso me pasa por asumir que la libreria del GLCD escribiria los 0 tambien. Y en parte mejor que no era asi.

Pero en fin esto no paso por tener que "borrar" para escribir algo. Ya que esto quiere decir que hay algo pre-existente en el GLCD. Y supuestamente no era el caso nuestro. Si lo borrabas y escribis en el GLCD, el problema seguiria existiendo. Y podria haberte afectado en otra parte, hasta que llegues al tema del I2C.

El problema estaba en el manejo del I2C, y si este tiene la obligacion de recibir la direccion, ya que podes usar cualquier direccion, distinto de otro integrado donde la direccion es "fija" pero por dentro es lo mismo.

Bueno... menos mal que se soluciono, sino ya le estaba buscando algun problema al compilador. Sirve de experiencia xD.

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 908
Re:Error de visualización GLCD, con protocolo I2C [SOLUCIONADO]
« Respuesta #28 en: 25 de Julio de 2020, 11:32:29 »
... ya le estaba buscando algun problema al compilador. Sirve de experiencia xD.

Ese es mi mayor temor en la vida... que el problema sea del compilador...  :D

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:Error de visualización GLCD, con protocolo I2C [SOLUCIONADO]
« Respuesta #29 en: 25 de Julio de 2020, 14:06:58 »
que tal chicos, el asunto es que, cuando por ejemplo manejas un dispositivo I2C, el ejemplo que puse el DS1307 (RTC), el maestro envia al bus la direccion del reloj, el reloj la reconoce y a partir de ahi puedes comunicarte con el exclusivamente.

entonces, si digamos la direccion del reloj es 0xA0, el reloj no usa ese dato para modificar ninguno de sus registros, solo lo reconoce y hasta ahi, es hasta el siguiente dato que lo trabaja para sus registros.

en el caso de mi PIC no sucede asi, su direccion es 0x10, la reconoce, y la usa como dato para mostrar en el glcd, no la ignora, a eso me referia

saludos
Nunca se deja de aprender