Noticias:

Grupo en telegram, del foro de meteorología fácil: https://t.me/meteorologiafacil

Para mas detalles, puedes visitar el siguiente tema http://www.meteorologiafacil.com.ar/foros/index.php?topic=1608.0

Espero que les sea de mucha utilidad.

Menú Principal

GLCD y Jal Dudas al por mayor

Iniciado por YO, Marzo 21, 2012, 12:49:30 PM

Tema anterior - Siguiente tema

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

YO

Hola David!
Hoy pude meterle mano a tu virus y ya encontrè el problema:
Fijate esto, mutilando el programa encontre que hasta acà, el resultado es bueno.

ks0108_write_char(29,y,"O")
ks0108_write_char(35,y,"R")
forever loop
   asm sleep
end loop

Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\PIC\jalv2\project\Pdavid.HEX".
Clean: Done.
Executing: "C:\PIC\jalv2\compiler\jalv2.exe" Pdavid.jal -no-clear
jal 2.4o (compiled May  8 2011)
generating p-code
2725 tokens, 95548 chars; 2634 lines; 5 files
generating PIC code pass 1
generating PIC code pass 2
writing result
Code area: 5879 of 8192 used (words)     <-------<< Fijate acà
Data area: 54 of 352 used
Software stack available: 96 bytes
Hardware stack depth 2 of 8
0 errors, 0 warnings
Loaded C:\PIC\jalv2\project\Pdavid.HEX.
BUILD SUCCEEDED: Sat Jun 23 21:30:00 2012

Ahora vemos màs adelante:
ks0108_write_char(29,y,"O")
ks0108_write_char(35,y,"R")
ks0108_write_char(41,y,"O")
forever loop
   asm sleep
end loop

Y el resultado es:

jal 2.4o (compiled May  8 2011)
generating p-code
2725 tokens, 95539 chars; 2625 lines; 5 files
generating PIC code pass 1
generating PIC code pass 2
writing result
Code area: 6044 of 8192 used (words)    <<----------<< Estas alcanzando el màximo
Data area: 54 of 352 used
Software stack available: 96 bytes
Hardware stack depth 2 of 8
0 errors, 0 warnings

Y ahora.....
ks0108_write_char(35,y,"R")
ks0108_write_char(41,y,"O")
ks0108_write_char(47,y,"L")

forever loop
   asm sleep
end loop

Pasa èsto:

Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\PIC\jalv2\project\Pdavid.HEX".
Clean: Done.
Executing: "C:\PIC\jalv2\compiler\jalv2.exe" Pdavid.jal -no-clear
jal 2.4o (compiled May  8 2011)
generating p-code
2725 tokens, 95535 chars; 2621 lines; 5 files
generating PIC code pass 1
generating PIC code pass 2
BUILD SUCCEEDED: Sat Jun 23 21:39:08 2012

Se desbordò la capacidàd del compilador para leer el programa, o lo que serìa lo mismo: CARTON LLENO!
Esto ya me pasò queriendo dibujar  ???  eh?!  :me callo:  :que mal!: :que mal!:

¿ Y ahora que hacemos, Jal queda chico ?

   Abrazos!

Sin saber que era imposible El fue y lo hizo

David Met

noooooooooooooooooooooooooooooooo, me la quiero cortar.
La solución es deducible, sacar partes de programas que no se utilizan.

Yo ya estoy haciendo una propia librería, ya que sospecho que hay un error en dicha librería porque no me deja ubicar las cosas donde yo quiero. Voy a poner solo las cosas que voy a utilizar.

Ahora, ¿porqué en vez de bloquearse y cerrarse JALv2, no me tira error de desbordamiento de la memoria flash?
Bueno, es algo que notificaré a sus creadores.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

Acabo de encontrar un posible error en la librería que estamos utilizando. La librería ks0108, calcula todo para ahorrarnos trabajo. Dependiendo de las coordenadas que queremos dibujar, la librería calcula a cual de los dos chip hay que escribirlo.

La pantalla del GLCD, está dividida en dos mitades de 64 bit cada uno (a lo ancho), a estos chips se los selecciona con CS1 o CS2. Cada chip maneja hasta 64 bit. Entonces ¿qué pasa cuando se selecciona la coordenada 128 del eje x? Pues la librería chequea esto, si supera de 64, quiere decir que se utiliza el chip CS2, y a continuación resta el valor de la coordenada en 64, para dejarlo en este rango. Por ejemplo, si seleccionamos 128 y le resta 64, nos queda 64 y corresponde al chip CS2. ¿Me siguen?

Para ello, utiliza una rutina o procedimiento, para hacer este cálculo, y calcula la columna con un OR. Esto hace un mal cálculo. Si hacemos 64 or 64 (que es especificada en una de las constante) nos da específicamente 64. Pero si por ejemplo deseamos escribir en la coordenada 70.

La librería hace: 70 - 64 = 6 --> Chips CS2
Luego hace 64 | 6 = 70

Como se dieron cuenta, se desborda.

Prometo ampliar más. Ahora tengo que estudiar para el miércoles y no me dedicaré, seguramente, hasta el jueves.
Vemos una luz al final  :\
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

Estoy reescribiendo, casi por completo, la librería.
Al parecer, hay mucho más errores.

En poco tiempo, subiré las pruebas echas.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

#94
Hola amigos.
Les cuento que tengo, casi completa la librería que estoy haciendo para el GLCD. La re escribí por completo, con la ayuda que me brindó YO en el presente tema pero en la página 3

Coinciden muy pocas cosas de la librería que trae JAL, pero solo porque la use de guía para algunas cosas. No obstante, como dije en el párrafo anterior, la re escribí por completo.

Aún falta por terminar, pero quiero compartirla con ustedes para que la chequeen y me cuenten que se le puede mejorar y que se le puede agregar. A continuación indico lo que tengo en mente para agregarle:

- Fuente (solo 5x7)
- Corregir error al encender un pixel. En el presente, no se puede encender dos pixel uno debajo del otro porque borra uno (*)
- Lectura de un pixel

(*) Esto pasa, porque cuando se manda a escribir un pixel, se envía 8 datos (del d0 al d7) y estos están en vertical. Por ejemplo, si se desea encender el pixel 0 de la página 0, luego el pixel 1 de la misma página (misma columna x) el pixel 0 se apaga. Si no se entiende lo explico mejor (ahora me tengo que ir a cenar).

Bueno, está adjuntado.

NOTA IMPORTANTE, los nombres de los procedimientos y funciones están en castellano, por lo que no es compatible con el original de JAL. Por dos motivos, soy argentino y hablo español, y la segunda, porque para evitar lío con la librería original.

EDITO: Eliminado el archivo adjunto. Ver algunos mensajes más abajo.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

Sigo dando vueltas con el tema de escribir un pixel. No logro que responda bien.
Para solucionar el problema del que borra el pixel escrito anterior (si están en la misma página y columna), se me ocurrió leer el estado de los pixeles en esa página, para luego aplicar un XOR en el pixel que deseo escribir.

Cuando escribo el primer pixel, el mismo se hace en forma correcta, pero a la hora de agregar el segundo pixel, no lo hace en forma correcta. Sospecho de un problema con la lectura del GLCD. Al parecer tiene auto-incremento; pero a pesar de que vuelvo hacer el ajuste de las coordenadas, el procedimiento no funciona bien.

Voy a tener que ver como lo hace otros lenguajes.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

YO

Hola Amigos!!!, ¿como estàn?

Que lo tirò!!! la estàs haciendo nomàs!!! :\

David, creo que te estàs rompiendo la cabeza con algo que quizàs no se use.
Analizando el tema del borrado del pixel anterior, creo que si la ùnica forma de decirle al glcd ; poneme un punto acà y otro màs abajo dentro de la misma pàgina, es con una palabra de 8 bits, directamente indicale donde poner el segundo punto, o los que quieras, justamente de una sola vez en esa palabra.
No veo la aplicaciòn que podrìa tener reescribir un pixel bajo el otro en forma inmediata y de a uno a la vez dudo: En todo caso, si esto fuera muy necesario,  dudo: La librerìa tendrìa que tener la opciòn de incremento de pixels en el lugar ya escrito, leer esa posiciòn, compararla con el dato actual y agregarle el que le quieras poner.
Todo èsto, asume lìneas de programa que ocuparìan espacio al cuete si no se usa.

Si se quiere poner una letra o un nùmero, se activan todos los pixels que corresponden a la primera columna, luego a la segunda, y asì hasta la 5ta. pero todos a la vez, es decir los ocho de esa coordenada porque ya hay un mapa para ello.

Si querès dibujar, haces lo mismo, de a ocho a la vez, e incrementas o cambias la direcciòn, no podes cambiar eso, por màs que quieras, si podès modificar la palabra, pero siempre de a ocho y viendo si lo que tenìas escrito antes, debe cambiar o no.

Tal vez tengas algùn motivo especial que no conozco para querer hacer èsto. Pero ¿Tiene sentido pràctico ùtil? dudo: dudo: dudo:

Ahora que recuerdo, el glcd tiene incremento automàtico por lo menos en el eje X, dentro de la pàgina, y cuando èsta se desborda, pasa a la pàgina siguiente, èsto se podrìa aprovechar para no tener que escribir la direcciòn inmediata, eliminando lìneas de programa.

  Un abrazo!


Sin saber que era imposible El fue y lo hizo

David Met

El problema pasa por lo siguiente. La siguiente instrucción, no la hace correctamente:

escribir_pixel(0,0)
escribir_pixel(0.1)

Cuando enciende el segundo pixel, me apaga el primero.
Se que es mejor hacer encender de a 8 pixel, y esto se implementa con escribir_byte(x,y,dato); pero si por x motivos, hay que apagar un pixel, o encender otro; ejecutar el procedimiento escribir_pixel, borrará o encenderá algunos pixeles que se desean mantenerlos intactos.

Es por ello, que se me ocurrió leer el estado de la página a modificar, y actualizar el valor de dicha página, pero no logro hacerlo en forma correcta. Este método, no es novedoso, ya que estudiando la librería que trae JAL, trabaja de esta manera.

Me juego la cabeza de que tengo dos problemas, estoy haciendo mal el procedimiento para leer el estado de una página y en la ejecución de escribir un pixel.

No obstante, me gustó mucho tu idea, que el procedimiento escribir_pixel, llame al procedimiento escribir_byte y trabajar de esta forma. Veré si el lunes, puedo implementarlo (mañana domingo, no me parece que tenga tiempo).
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

YO

Estuve probando la librerìa y tengo una duda:
El valor de la lectura del glcd ¿queda en lectura_glcd?, porque si es asì el compilador no lo sabe  :jeje:

Tratè de poner el pixel, luego leerlo y cambiarlo de lugar, pero me parece que algo interpreto mal :
glcd_ini()
   var byte leido
escribir_pixel(10,10)   -- Esto funciona
lectura_byte(10,10)
leido = lectura_glcd
escribir_byte(10,20,leido)
   asm sleep
Y resulta esto:
Prueba_libreria_David.jal:282: warning: return value ignored
Prueba_libreria_David.jal:284: "lectura_glcd" not defined
Prueba_libreria_David.jal:284: '=' expected (got 'escribir_byte')
2 errors, 1 warnings
Sin saber que era imposible El fue y lo hizo

David Met

lectura_byte, es una función, y por lo tanto, debes llamarlo así:

leido = lectura_byte(10,10)
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

#100
Bueno, ahora anda.  :\ :\

Me había olvidado de poner a cero los pines CS1 y CS2  :P
Ahí está adjuntado para el que lo quiera probar.

En otra librería voy a colocar la fuente para que no ocupen espacio si nadie la utiliza.
Al igual que voy hacer otra librería para hacer rectángulos, círculos, elipses, etc.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

Al final, todo este lío vino porque el GLCD escribía donde se le cantaba y no donde yo quería. Ahora que estuve haciendo mi librería propia, descubrí el porqué.
Esto ocurre, porque la librería analiza la página a escribir y en esa trabaja. Por lo tanto, cuando dibujamos un rectángulo, o escribimos, solo lo hace por página, es decir, que solo disponemos de 8 renglones para escribir, dibujar, etc.  Esto es así, porque se ahorra mucha memoria flash del PIC. Si se quiere trabajar en forma independiente a las páginas, consumiría mucha memoria.

Así que, a moldearse en los 8 renglones disponibles.

Pero debo confesar que estoy agradecido haberlo descubierto ahora, porque aprendí como usar un GLCD. Como ven, no hay mal que por bien no venga.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

YO

Bien David!!!
En cuanto pueda la pruebo, ultimamente ando con los tiempos limitadisimos, pero en cuanto termine de montar las màquinas que estoy instalando, me re prendo.

   Saludos a todos!!!
Sin saber que era imposible El fue y lo hizo

YO

Hola!!
Ya probè el encender y apagar el pixel en forma individual con èste simple programa y cumple con el objetivo perfectamente.

forever loop
escribir_pixel(10,10) 
escribir_pixel(11,11)
escribir_pixel(12,12)
escribir_pixel(15,0)
escribir_pixel(15,1)
escribir_pixel(15,2)
escribir_pixel(1,12)
escribir_pixel(1,13)
escribir_pixel(1,14)

delay_100ms(30)

escribir_pixel(11,11)
escribir_pixel(15,1)
escribir_pixel(1,13)

delay_100ms(30)
end loop


De diez  :\  ok!
Sin saber que era imposible El fue y lo hizo

David Met

Excelente.
Ahora he modificado esa librería que utilizaste, y le he sacado la opción de alternar en el procedimiento de encender_pixel. Le agregué una entrada más para especificar si se quiere encender o apagar el pixel. Me vi obligado a esto porque estoy re-adaptando la librería glcd_common a la librería que hice.
Confieso que me gusta más ahora, porque si por accidente se sobre escribía un pixel, este se apagaba y encontrar el error podía ser un dolor de cabeza.

Logré hacer andar el círculo, pero no la elipse. Irónicamente para hacer un círculo, se hace con la elipse, pero a la hora de hacer una elipse, le falta encender 8 pixeles.
Más tarde, explico mejor el problema que tengo (ahora me tengo que ir hacer las compras).
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.