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.

David Met

Tengo algo curioso a la hora de compilar la librería que estoy adaptando. JAL me da la siguiente advertencia (warning) cuando compilo:

CitarC:\JALv2\lib/glcd_figuras.jal:77: warning: signed/unsigned mismatch
C:\JALv2\lib/glcd_figuras.jal:77: warning: signed/unsigned mismatch

Y la linea 77 corresponde a: var sbyte*2 cx14 = cx + dx, cx23 = cx - dx

procedure _glcd_escribir_4_pixeles_elipse(byte in cx, sbyte in dx, byte in cy, sbyte in dy, bit in enc_apa) is
var sbyte*2 cx14 = cx + dx, cx23 = cx - dx
var sbyte*2 cy12 = sbyte(cy) + dy, cy34 = sbyte(cy) - dy
escribir_pixel(byte(cx14), byte(cy12), enc_apa)
escribir_pixel(byte(cx14), byte(cy34), enc_apa)
escribir_pixel(byte(cx23), byte(cy12), enc_apa)
escribir_pixel(byte(cx23), byte(cy34), enc_apa)
end procedure


La linea var sbyte*2 cy12 = sbyte(cy) + dy, cy34 = sbyte(cy) - dy ; le especifiqué sbyte para que deje de dar advertencia.
Pero miren como está en la librería glcd_common:

Citarprocedure _glcd_write_4_ellipse_pixels( byte*GLCD_X_SIZE       in cx,
                                       sbyte*(GLCD_X_SIZE + 1) in dx,
                                        byte*GLCD_Y_SIZE       in cy,
                                       sbyte*(GLCD_Y_SIZE + 1) in dy) is
   var sbyte*(GLCD_X_SIZE + 1) cx14 = cx + dx,     -- x-coord quadrant 1 and 4
                               cx23 = cx - dx      --    "       "     2 and 3
   var sbyte*(GLCD_Y_SIZE + 1) cy12 = cy + dy,     -- y-coord    "     1 and 2
                               cy34 = cy - dy      --    "       "     3 and 4

Y probé esta librería y no me da advertencia. (GLCD_X_SIZE, en mi caso, vale 1; por eso yo puse sbyte*2).
En fin, si me ayudan a entenderlo, se los voy a agradecer.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

HJ

Cita de: David Met en Julio 24, 2012, 06:35:01 PM
Y probé esta librería y no me da advertencia. (GLCD_X_SIZE, en mi caso, vale 1; por eso yo puse sbyte*2).
En fin, si me ayudan a entenderlo, se los voy a agradecer.
desde mi total y completa ignorancia en JALv2....
Si en lugar de sbyte*2, colocas sbyte*(2).

Saludos
HJ

David Met

#107
No, me sigue dando la misma advertencia.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

HJ

Citarprocedure _glcd_escribir_4_pixeles_elipse(byte in cx, sbyte in dx, byte in cy, sbyte in dy, bit in enc_apa) is

Citarprocedure _glcd_write_4_ellipse_pixels( byte*GLCD_X_SIZE       in cx,
                                       sbyte*(GLCD_X_SIZE + 1) in dx,
                                        byte*GLCD_Y_SIZE       in cy,
                                       sbyte*(GLCD_Y_SIZE + 1) in dy) is

continuando desde mi total ignorancia en JALv2, noto esas diferencias marcadas en rojo, en tu casoi sería *1 o *2 según el caso

saludos
HJ

David Met

No, eso no era.
De todas maneras, ya lo pude solucionar. El problema estaba en otro procedimiento que llamaba a este procedimiento que les mostré. Mi error fue que no eran compatibles los tipo de variables y sus tamaños.

Encontré el error porque dejé de buscarlo en ese procedimiento. Para evitar errores similares, re-adapté la librería glcd_common a mi librería.

En un ratito, lo comparto con ustedes.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

HJ

Que bueno que hayas encontrado el origen del problema David.

Saludos
HJ

David Met

#111
Bueno, por ahora es la versión beta hasta tanto probarla bien.
Si alguno de ustede, lo puede probar, se los voy a agradecer mucho; y si no hay error, lo publico en otro tema para que quede más a la vista.

glcd_ks0108_opt es el controlador de la pantalla GLCD. (está adjuntado aquí)
glcd_fuente dispone de los caracteres alfanuméricos de tamaño 5x7
glcd_figuras es una librería para dibujar líneas, círculos, elipse y cajas (llenas y vacías).

Por favor, cualquier error, indíquenmelo, así lo puedo solucionar.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

YO

Hola a todos!!
Ya me pongo a probar!!  :\ despuès les cuento
Sin saber que era imposible El fue y lo hizo

YO

Hola David!
Hice una pequeña correcciòn acà:
-
-- _fuente_5x7_tabla[] - Tabla caracter. <<<-----<<<
-- ----------------------------------------------------------------------------
-- 91 * 5 bytes = 455
-- ----------------------------------------------------------------------------
const byte _font_5x7_table[] = {         <<<-----<<<

for 5 loop
cx = _fuente_5x7_tabla[indx] <<<-----<<<
escribir_byte(x,y,cx)
indx = indx + 1
x = x + 1
end loop

Esta librerìa funciona perfectamente con las pruebas que realicè, colocando caracter por caracter  :\
Sin saber que era imposible El fue y lo hizo

YO

La librerìa de formas tambien funciona  :\ :\ :\

Que buen trabajo David! FELICITACIONES  ok! ok! ok!
Perfectamente explicado!!

Voy a seguir probando....
Sin saber que era imposible El fue y lo hizo

David Met

Se me chispoteó ese pequeño detalle.
Gracias YO por probarlo
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

YO

Por nada David! contà con eso  ok!

Hice una animaciòn muy simple (correr una caja llena a lo largo del display.)
Le indiquè la posiciòn de inicio y luego hago el desplazamiento, pero a vaces, cuando lo reinicio, solo la dibuja en el lado derecho, y otras veces directamente no lo dibuja.
Es como que no estàn reiniciados CS1 y CS2.
El còdigo es èste :
glcd_ini()

var byte ca_1 = 26
var byte ca_2 = 16
var byte ca_3 = 111
var byte ca_4 = 54

var byte li_1 = 111
var byte li_2 = 16
var byte li_3 = 111
var byte li_4 = 54


forever loop

if ca_1 > 0 then
      glcd_caja_llena(ca_1,ca_2,ca_3,ca_4,1) --Dibuja una caja llena, desde 26 altura = 16 base = 54 largo = 111
  glcd_linea(li_1,li_2,li_3,li_4,0) -- Dibuja una línea.apagandola
         delay_100ms(10)
         ca_1 = ca_1 - 1
ca_2 = ca_2
ca_3 = ca_3 - 1
ca_4 = ca_4

li_1 = li_1 - 1
li_2 = li_2
li_3 = li_3 - 1
li_4 = li_4

elsif ca_1 == 0 then
  ca_1 = 0
 
  glcd_caja_llena(ca_1,ca_2,ca_3,ca_4,1)
  glcd_linea(li_1,li_2,li_3,li_4,0)
        delay_100ms(10)
    ca_2 = ca_2
    ca_3 = ca_3 - 1
    ca_4 = ca_4

li_1 = li_1 - 1
li_2 = li_2
li_3 = li_3 - 1
li_4 = li_4
end if
if li_1 ==  0 then
asm sleep
end if
end loop

¿Que te parece que puede ser?   ???
Sin saber que era imposible El fue y lo hizo

David Met

Ese problema que mencionas, me hace lo mismo.
Yo pensaba que era ruido eléctrico; ya que cuando lo reseteaba, andaba de 10.

Tal vez en algún lado me olvidé de resetear al GLCD con los pines CS1 CS2.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

Linda la animación.
Yo estoy haciendo una, pero que aún  no logro hacer andar.

Hay dos cosas que no logro hacer, 4 barras deslizables. Y un correcto funcionamiento/trabajo del ADC del PIC. Este varía de 0 a 155, cuando debería llegar a 255. Por ahora sigo sin encontrar el error.

Las barras deslizables, se mueven según el valor del ADC. Con 255, están llenas; y con 0, están vacías.

Aquí está el código:

-- -----------------------------------------
include delay
include glcd_ks0108_opt
include glcd_figuras
include glcd_fuente

const bit ADC_HIGH_RESOLUTION = low
const byte ADC_NCHANNEL = 5
const byte ADC_NVREF = ADC_NO_EXT_VREF

--include adc
--adc_init()


-- ****************************************************************************
-- INICIALIZAMOS EL GLCD
-- ---------------------
glcd_ini()
-- ****************************************************************************
-- CONFIGURAMOS AL ADC.
-- --------------------
TRISA = 0x1F -- RA0 a RA5 entrada.
ADCON1 = 0x02
ADCON0 = 0x81

function leer_cad(byte in canal)return byte is
var byte resultado_cad
case canal of
0: ADCON0 = ADCON0 | 0 -- AN0
1: ADCON0 = ADCON0 | 8 -- AN1
2: ADCON0 = ADCON0 | 16 -- AN2
3: ADCON0 = ADCON0 | 24 -- AN3
4: ADCON0 = ADCON0 | 32 -- AN4
5: ADCON0 = ADCON0 | 40 -- AN5
6: ADCON0 = ADCON0 | 48 -- AN6
7: ADCON0 = ADCON0 | 56 -- AN7
end case
_usec_delay(20) -- 20uS
ADCON0_GO = 1
while ADCON0_GO loop end loop -- Esperamos hasta que la conversión finalice.
resultado_cad = ADRESH
return resultado_cad
end function
-- ****************************************************************************
-- DIBUJAMOS LA PLANTILLA EN EL GLCD
-- ---------------------------------
var byte avanzar_sup = 0
var byte avanzar_inf = 0
procedure mensaje_superior(byte in x, byte in y) is
glcd_caracteres(x,y,"M")
x = x + 6
glcd_caracteres(x,y,"E")
x = x + 6
glcd_caracteres(x,y,"T")
x = x + 6
glcd_caracteres(x,y,"E")
x = x + 6
glcd_caracteres(x,y,"O")
x = x + 6
glcd_caracteres(x,y,"L")
x = x + 6
glcd_caracteres(x,y,"O")
x = x + 6
glcd_caracteres(x,y,"G")
x = x + 6
glcd_caracteres(x,y,"I")
x = x + 6
glcd_caracteres(x,y,"A")
x = x + 6
glcd_caracteres(x,y," ")
x = x + 6
glcd_caracteres(x,y,"F")
x = x + 6
glcd_caracteres(x,y,"A")
x = x + 6
glcd_caracteres(x,y,"C")
x = x + 6
glcd_caracteres(x,y,"I")
x = x + 6
glcd_caracteres(x,y,"L")
end procedure
procedure mensaje_inferior(byte in x, byte in y) is
glcd_caracteres(x,y,"P")
x = x + 6
glcd_caracteres(x,y,"R")
x = x + 6
glcd_caracteres(x,y,"U")
x = x + 6
glcd_caracteres(x,y,"E")
x = x + 6
glcd_caracteres(x,y,"B")
x = x + 6
glcd_caracteres(x,y,"A")
x = x + 6
glcd_caracteres(x,y," ")
x = x + 6
glcd_caracteres(x,y,"G")
x = x + 6
glcd_caracteres(x,y,"L")
x = x + 6
glcd_caracteres(x,y,"C")
x = x + 6
glcd_caracteres(x,y,"D")
end procedure
glcd_linea(0,9,127,9,1)
glcd_linea(0,10,127,10,1)
glcd_linea(0,51,127,51,1)
glcd_linea(0,52,127,52,1)
glcd_linea(26,11,26,50,1)
glcd_linea(27,11,27,50,1)
glcd_linea(104,11,104,50,1)
glcd_linea(103,11,103,50,1)
glcd_caja(29,16,101,23,1)
glcd_caja(29,24,101,31,1)
glcd_caja(29,32,101,39,1)
glcd_caja(29,40,101,47,1)
glcd_caracteres(0,20,"P")
glcd_caracteres(6,20,"O")
glcd_caracteres(12,20,"T")
glcd_caracteres(20,20,"1")
glcd_caracteres(0,27,"P")
glcd_caracteres(6,27,"O")
glcd_caracteres(12,27,"T")
glcd_caracteres(20,27,"2")
glcd_caracteres(0,35,"I")
glcd_caracteres(6,35,"R")
glcd_caracteres(0,40,"T")
glcd_caracteres(6,40,"E")
glcd_caracteres(12,40,"M")
glcd_caracteres(18,40,"P")
-- ****************************************************************************
-- OBTIENE LOS VALORES DE LAS CAJAS SEGÚN VALOR DEL ADC.
-- -----------------------------------------------------
procedure act_cajas(byte in valor, byte out puntos_enc, byte out puntos_apa) is
valor = valor * 100 / 255 -- Obtenemos el porcentaje del rango medido.
valor = valor * 62 / 100 -- Con el porcentaje anterior, obtenemos la cantidad
-- de puntos que contienen las cajas.
valor = valor + 29
puntos_enc = valor
valor = 101 - valor
puntos_apa = valor
end procedure
-- ****************************************************************************
-- OBTENCIÓN DEL CÓDIGO ASCII.
-- ---------------------------
const byte _codigo_ascii[] = {
0x30, -- 0
0x31, -- 1
0x31, -- 2
0x33, -- 3
0x34, -- 4
0x35, -- 5
0x36, -- 6
0x37, -- 7
0x38, -- 8
0x39 -- 9
}
--
function codigo_ascii(byte in dato) return byte is
var byte cod_ascii = dato
var byte ca
ca = _codigo_ascii[cod_ascii]
return ca
end function
-- ****************************************************************************
-- PROCEDIMIENTO PARA DESCOPONER UN NÚMERO.
-- ----------------------------------------
procedure descomponer(byte in cad, byte out cen, byte out dec, byte out uni) is
var byte temporal
temporal = cad
cad = cad / 100
cen = cad
cad = temporal
cad = cad % 100
cad = cad / 10
dec = cad
cad = temporal
cad = cad % 10
uni = cad
end procedure
-- ****************************************************************************
-- ENVÍA EL RESULTADO DECOMPUESTO EN CENTENA, DECENA Y UNIDAD AL GLCD.
-- -------------------------------------------------------------------
procedure cad_glcd(byte in x, byte in y, byte in cad) is
var byte cen,dec,uni
var byte puntos_enc, puntos_apa
var byte temp
descomponer(cad,cen,dec,uni)
temp = cen
cen = codigo_ascii(temp)
glcd_caracteres(x,y,cen)
temp = dec
dec = codigo_ascii(temp)
x = x + 7
glcd_caracteres(x,y,dec)
temp = uni
uni = codigo_ascii(temp)
x = x + 7
glcd_caracteres(x,y,uni)
end procedure
-- ****************************************************************************
-- MENÚ PRINCIPAL.
-- ---------------
var word pot_1
var word pot_2
var word ir
var word temp
forever loop
-- delay_1s(1)
-- avanzar_sup = avanzar_sup + 1
-- avanzar_inf = avanzar_inf + 1
mensaje_superior(avanzar_sup,0)
mensaje_inferior(avanzar_inf,60)
var byte resultado_cad
var byte puntos_enc, puntos_apa
pot_1 = 0
pot_2 = 0
ir = 0
temp = 0
for 50 loop
resultado_cad = leer_cad(0)
pot_1 = pot_1 + word(resultado_cad)
resultado_cad = leer_cad(1)
pot_2 = pot_2 + word(resultado_cad)
resultado_cad = leer_cad(2)
ir = ir + word(resultado_cad)
resultado_cad = leer_cad(3)
temp = temp + word(resultado_cad)
end loop
pot_1 = pot_1 / 50
pot_2 = pot_2 / 50
ir = ir / 50
temp = temp / 50

cad_glcd(106,20,byte(pot_1))
act_cajas(byte(pot_1),puntos_enc,puntos_apa)
glcd_caja_llena(30,17,puntos_enc,22,1)
glcd_caja(puntos_apa,17,100,22,0)

cad_glcd(106,27,byte(pot_2))
act_cajas(byte(pot_2),puntos_enc,puntos_apa)
glcd_caja_llena(30,25,puntos_enc,30,1)
glcd_caja(puntos_apa,25,100,30,0)

cad_glcd(106,35,byte(ir))
act_cajas(byte(ir),puntos_enc,puntos_apa)
glcd_caja_llena(30,33,puntos_enc,38,1)
glcd_caja(puntos_apa,33,100,38,0)

cad_glcd(106,40,byte(temp))
act_cajas(byte(temp),puntos_enc,puntos_apa)
glcd_caja_llena(30,41,puntos_enc,46,1)
glcd_caja(puntos_apa,41,100,46,0)
end loop


El que lo quiera montar, debe tener en cuanta, que no funciona correctamente.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

EL error que tenía de que no variaba de 0 a 255, es que en la tabla que obtiene el caracter ASCII de los números, el dos tenía guardado 0x31, cuando en realidad le corresponde 0x32.
También, descubrí un error que, hasta hace rato, desconocía su funcionamiento.

Resulta que CASE variable OF
                 END CASE

No funcionaba como pensaba. Yo pensaba que saltaba directamente a la opción igual a la variable. Por ejemplo:

case temporal of
    0: asm nop
    1: asm nop
    2: asm nop
    3: asm nop
end case

Si temporal vale 0, solo ejecuta la opción primera; o sea, la linea 0: asm nop
Pero grande fue mi sorpresa que, cuando temporal valía 3, en ves  de dirigirse inmediatamente a la línea 3: asm nop, empezaba por la línea 0 y laejecutaba; luego ejecutaba la línea 1: asm nop y lo mismo con la linea 2:asm nop

En fin, es algo nuevo que he aprendido hoy.




He actualizado la librería glcd_ks0108_opt para evitar que el GLCD arranque mal.
Por favor, pruebenlo así ya, después de un tiempo, lo saco de beta para lanzarlo como la versión estabilizada.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.