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

Fijate si esto puede ayudar:

A ver.. yo lo entiendo de esta manera:
CS1 maneja 64 columnas y 64 filas (las primeras de la izquierda)
CS2 maneja la misma cantidàd pero de la derecha.

Seleccionando CS1 no elijo una columna, elijo trabajar con las primeras 64
Del mismo modo, tampoco elijo una sola fila, elijo las 64 de la izquierda.

Ahora bien, si al eje vertical lo llamamos columna, le adjudicamos el prefijo "y"
Si al eje horizontal lo llamamos fila, le adjudicamos el prefijo "x"

Al elegir una pàgina, tenemos 8 posiciones "x" y tambien tenemos 64 posiciones "y"

De acuerdo a èsto, aunque seleccionemos CS1 y Pàgina, todavìa nos faltarìa definir dentro de la pàgina, las coordenadas x e y.

Lo siguiente que analizo es que tengo dos comandos o instrucciones que me permiten manejar independientemente 64 posiciones.

La direcciòn "y" ya la tenemos definida porque es la que maneja el contador de direcciones, y es el que se incrementa automàticamente.

Por lo tanto, podrìamos deducir que lo que se llama lìnea de salida, bien podrìa ser el valor que nos falta para la direcciòn "x" (que justamente maneja 64 posiciones)

Si tenemos en cuenta que el contador maneja y, lo de lìnea de salida lo podrìamos interpretar como: linea = horizontal = x, y salida como ùltimo dato para que se active el pixel (un poco de imaginaciòn me lo tengo que permitir jejeje)

¿Se entendiò mi razonamiento, puede ser que tenga lògica?

No olvidemos que antes de cargar los valores de direcciòn tenemos que encender el display y poner a cero todas las direcciones, o sea inicializar el display.
Sin saber que era imposible El fue y lo hizo

HJ

Tal vez el pdf que adjunto les de una ayuda en esto.

Saludos
HJ

HJ

Cita de: HJ en Abril 25, 2012, 10:49:14 PM
Tal vez el pdf que adjunto les de una ayuda en esto.

Saludos
HJ
Me refiero a los diagramas de flujo para trabajar con este tipo de GLCD

David Met

Gracias HJ.
Lo bajé y lo estoy analizando. Por lo que vi, muy por encima, los registros son iguales.

YO: Entiendo lo que decís, pero se contrapone a como se toman los datos del puerto de datos del GLCD. Ahí está el porqué no logro entender el registro línea.
Tomamos una página cualquiera, por ejemplo la 6; y tomamos los primero 64 bit de largo, por ejemplo CS1 =1 y CS2 = 0

En esta página, (y en las demás también) el alto es de 8 bit ¿verdad?; son los que corresponde a los 8 bit de entrada de datos del GLCD. O sea, de la descripción de los pines que subiste son:

     7 = DB0
     8 = DB1
     9 = DB2
    10 = DB3
    11 = DB4
    12 = DB5
    13 = DB6
    14 = DB7

Lo que acabo de decir, ¿es verdad? Si lo que digo es verdad, quiere decir que la información entra en forma vertical y no horizontal. La única manera de que entienda del registro línea, es que los 8 bit de ancho de cada página NO sea los datos de entrada, y que la información se introduzca en forma horizontal




La primera prueba que hice, no lo logré hacer andar. Una vez que lo haga, entenderé como se encienden los pixceles. Como no logro encontrar el protocolo de comunicación; no sabía como inicializar al GLCD.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

YO

Gracias HJ

David
Entiendo y estoy de acuerdo en que para escribir dentro de una página, se haga en forma vertical.
Eso está muy claro.
Lo que pienso es que debe existir otra forma de direccionamiento más directo, sin necesidád de seleccionar una página.
Y creo que por allí va el tema de la línea.
En una página, El contador avanza verticalmente, y esto para la escritura está perfecto, entonces pienso que si tengo que hacer un dibujo con una tabla de datos ¿tengo que cambiar permanentemente de  página o el contador se desborda y salta solo a la página siguiente?
Esto lo sabremos seguramente a medida que avancemos.

Lo que me imagino es que usando el direccionamiento x,y sin usar una página determinada, con el solo hecho de indicarle al display la cordenada del punto que queremos usar, éste se debería encender automáticamente sin ningún dato, pues elegimos un solo punto, y esto quizás simplificaría el programa del dibujo.

Seguramente estoy completamente equivocado y (no me asombra) pues son solo suposiciones, ya que como decís no contamos con el protocolo de comunicación. yo creía que lo tenía pero es solo lo que publique, no encontré nada en muchas horas de búsqueda, es más se me ocurrió que se le podría pedir a Winstar directamente pero necesito un traductor chino  o ingles para mi es lo mismo jejeje
Sin saber que era imposible El fue y lo hizo

David Met

Ok.
Eso se me suena muy lógico si es solo para encender un pixcel único.

Le voy a mandar un mensaje a ver que me dicen.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

YO

Bien ojalá respondan!

Me olvidaba de algo inportante:

¿tenes conectado el pin de reset a algun lado? deberia ir directo a +5v. para probarlo.
Si lo manejas por el micro entonces una salida baja resetea el glcd
Sin saber que era imposible El fue y lo hizo

David Met

Si, me aseguré de ponerlo a 5V desde un pin del pic.
Lo que pasa, es que no lo había inicializado.

Husmeando por la páginas de ellos, encontré esto. Un programa en ASM para trabajar con el GLCD. Esto, más el diagrama de flujo que nos brindó HJ, tenemos que sacarlo andando.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

No lo puedo hacer andar, ni con el ejemplo que trae JALv2 &%$#

YO, ¿Cuál fue el programa que utilizaste y que al menos, te mostró algo?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

YO

Hola David met!
Aca te paso el programa que armè con instrucciones que vi por todos lados en la red y analizando las librerias de control.
Disculpà el desorden del còdigo, pero a medida que lo probaba le agregaba, le sacaba o anulaba lìneas.
Sirve para ver algo en la pantalla y analizar funcionamiento, nada màs.
Al conectarlo, el programa tarda como 15 segundos en hacer algo, no te asustes, no lo desenchufes enseguida, yo hacìa eso y no me daba cuenta que lo ùnico que pasaba era que lo ùnico que andaba en la primera etapa eran los retardos, el resto nada, y despuès te saluda y despliega todo su poderìo  :jeje:

-- GLCD prueba 2 (la uno falla) y esta tambien jeje!!

include 16f877a

pragma target clock 20_000_000
pragma target OSC    hs
pragma target LVP disabled
pragma target WDT disabled

enable_digital_io()


-- declare a user-defined font  >> declarar un tipo de letra definido por el usuario
-- it's a kind of sprite definition...es una especie de definición Objeto ...
-- Deben ser definidos antes glcd_font incluir
-- must be defined before glcd_font include
const byte FONT_UDF_0XFE = 0xFE
const byte FONT_UDF_0XFE_BYTE_PER_CHAR = 5
const byte FONT_UDF_0XFE_WIDTH = 5
const byte FONT_UDF_0XFE_HEIGHT = 8
const byte FONT_UDF_0XFE_BIT_DIRECTION = FONT_BOTTOM_LEFT_VERTICAL
const byte FONT_UDF_0XFE_CHARS [] = "A   "






-- ***************************************************
-- Definimos los puertos relacionados con el GLCD    (adaptalo al tuyo)
-- ***************************************************

var volatile byte GLCD_DATAPRT is portd
var volatile byte GLCD_DATAPRT_DIR is portd_direction

var volatile bit GLCD_RW is pin_b4
var volatile bit GLCD_CS1 is pin_b0
var volatile bit GLCD_E   is pin_b5
var volatile bit GLCD_DI  is pin_b2
var volatile bit GLCD_RST is pin_c0
var volatile bit GLCD_CS2 is pin_b1

var volatile bit GLCD_RW_DIRECTION is pin_b4_direction
var volatile bit GLCD_CS1_DIRECTION is pin_b0_direction
var volatile bit GLCD_E_DIRECTION is pin_b5_direction
var volatile bit GLCD_DI_DIRECTION is pin_b2_direction
var volatile bit GLCD_RST_DIRECTION is pin_c0_direction
var volatile bit GLCD_CS2_DIRECTION is pin_b1_direction




-- ****************************************************
-- Incluimos las librerias que usaremos
-- ****************************************************
-- Using block write is fastest, but you can only use one font type:
-- FONT_TOP_LEFT_HORIZONTAL
--; const GLCD_USE_BLOCK_WRITE = FALSE


const FONT_AUTO_WRAP = false
include glcd_8x12_font
include glcd_5x7_font
include glcd_font


include print
include format

include delay

include glcd_ks0108  --

include glcd_common


-- Ahora inicializamos el glcd

glcd_init()

; lcd_setcursor(2,10)



   forever loop

-- Set font size
;  glcd_font_use(FONT_8X12)
-- print "X:" and "Y:" at bottom left
glcd_char_x_pos = 3
glcd_char_y_pos = 10
const byte string_x[] = "X:  "
print_string(glcd,string_x)

delay_100ms(30)

lcd_fill(0) -- Clear the display




-- Definimos los textos

const byte str1[] = "Hola     "
const byte str2[] = "Aca estoy"


var byte x
var byte y
var byte char


;LCD_GoToXY 7, 1


-- Ahora los vamos a colocar

glcd_char_y_pos = 20
glcd_char_x_pos = 20

print_string(glcd,str1)

glcd_char_y_pos = 10
glcd_char_x_pos = 40

print_string(glcd,str2)

delay_100ms(30)
lcd_fill(0) -- Clear the display


_ks0108_write(KS0108_LEFT ,80)

delay_100ms(80)
lcd_fill(0) -- Clear the display




;ks0108_LEFT

ks0108_write_char(67,10,72)
ks0108_write_char(73,10,79)
ks0108_write_char(79,10,76)
ks0108_write_char(85,10,65)


;delay_100ms(30)

;glcd_write_char(20,20)

;lcd_setcursor(2,10)

;glcd_char_goto(2,10)

lcd_fill(0) -- Clear the display

ks0108_write_char(3,10,72)
ks0108_write_char(9,10,79)
ks0108_write_char(15,10,76)
ks0108_write_char(21,10,65)

delay_100ms(30)

; lcd_fill(0) -- Clear the display

glcd_clear_screen()


;glcd_write_char(60, 10,65)


delay_100ms(30)

lcd_fill(0) -- Clear the display

glcd_box(0,0,127,63)

delay_100ms(30)

ks0108_write_byte(20,20,55)

glcd_char_y_pos = 50
glcd_char_x_pos = 100


print_string(glcd,str1)

delay_100ms(30)

lcd_fill(0) -- Clear the display

glcd_char_y_pos = 15
glcd_char_x_pos = 70

print_string(glcd,str1)

delay_100ms(30)

lcd_fill(0) -- Clear the display

glcd_char_y_pos = 20
glcd_char_x_pos = 20

;ks0108_write_byte(glcd,str1)

lcd_fill(0) -- Clear the display




-- print "X:" and "Y:" at bottom left
;glcd_char_x_pos = 20
;glcd_char_y_pos = 20
;const byte string_x[] = "X:   "
;print_string(glcd,string_x)

delay_100ms(30)

lcd_fill(0) -- Clear the display

; glcd_clear_screen()
   
-- draw some font
const byte hello_string[] = "HelLo World "
--
glcd_font_use(FONT_5X7)       -- set font size
print_string(glcd,hello_string) -- print characters to lcd

           

      ;   var byte x,y,char
         char=32



         delay_100ms(5)   

         for 8 using y loop
            for 25 using x loop
               glcd_char_goto(y,x)

               glcd = char
               char = char + 1
               if (char > 122) then char = 32 end if


            end loop
         end loop
      end loop
            



Sin saber que era imposible El fue y lo hizo

YO

Comentarios del programa:

Fijate que la ùnica forma de escribir "HOLA", fuè caracter por caracter segùn la tabla de la librerìa.

ks0108_write_char(3,10,72)
ks0108_write_char(9,10,79)
ks0108_write_char(15,10,76)
ks0108_write_char(21,10,65)

no lo pude escribir todo junto de una sola vez con print

glcd_char_y_pos = 20
glcd_char_x_pos = 20
print_string(glcd,str1)

Lo interesante fuè cuando probè con : glcd_clear_screen()
Te llena la pantalla punto por punto aumentando el contador automàticamente!

Lo contrario ocurre con : lcd_fill(0)
Te borra la pantalla de una

Esta instrucciòn funcionò de una pero no lo probè con otras coordenadas : glcd_box(0,0,127,63)

Esto que es original de Jal, tampoco funcionò, aunque no entiendo porque no lo direccionaron

-- draw some font
const byte hello_string[] = "HelLo World "
--
glcd_font_use(FONT_5X7)       -- set font size
print_string(glcd,hello_string) -- print characters to lcd

Estas lìneas no fueron modificadas, no se le borrò nada pero ¿y donde lo ponen?

Probalo y contanos Abrazos




Sin saber que era imposible El fue y lo hizo

David Met

Excelente.
Ahora me voy a almorzar con la flia y a la vuelta, lo pruebo. Así tengo algo por donde empezar.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

Excelente. Ahí anduvo.
Ahora a empezar a estudiarlo. :\
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

YO

Vamos todavìa!!! :\ :\

Yo sigo probando sobre la misma base, a ver que logro!
Sin saber que era imposible El fue y lo hizo

YO

David, probè el  razonamiento que desarrollaste para el encendido del pixcel di (c3,d5) y funciona perfectamente con el encabezado del programa que te pasè  :\ :\ :\ :\ :\  probà èsto:


include 16f877a

pragma target clock 20_000_000
pragma target OSC    hs
pragma target LVP disabled
pragma target WDT disabled

enable_digital_io()


-- declare a user-defined font  >> declarar un tipo de letra definido por el usuario
-- it's a kind of sprite definition...es una especie de definición Objeto ...
-- Deben ser definidos antes glcd_font incluir
-- must be defined before glcd_font include
const byte FONT_UDF_0XFE = 0xFE
const byte FONT_UDF_0XFE_BYTE_PER_CHAR = 5
const byte FONT_UDF_0XFE_WIDTH = 5
const byte FONT_UDF_0XFE_HEIGHT = 8
const byte FONT_UDF_0XFE_BIT_DIRECTION = FONT_BOTTOM_LEFT_VERTICAL
const byte FONT_UDF_0XFE_CHARS [] = "A   "



const FONT_AUTO_WRAP = false
include glcd_8x12_font
include glcd_5x7_font
include glcd_font


-- ***************************************************
-- Definimos los puertos relacionados con el GLCD
-- ***************************************************

var volatile byte GLCD_DATAPRT is portd
var volatile byte GLCD_DATAPRT_DIR is portd_direction

var volatile bit GLCD_RW is pin_b4
var volatile bit GLCD_CS1 is pin_b0
var volatile bit GLCD_E   is pin_b5
var volatile bit GLCD_DI  is pin_b2
var volatile bit GLCD_RST is pin_c0
var volatile bit GLCD_CS2 is pin_b1

var volatile bit GLCD_RW_DIRECTION is pin_b4_direction
var volatile bit GLCD_CS1_DIRECTION is pin_b0_direction
var volatile bit GLCD_E_DIRECTION is pin_b5_direction
var volatile bit GLCD_DI_DIRECTION is pin_b2_direction
var volatile bit GLCD_RST_DIRECTION is pin_c0_direction
var volatile bit GLCD_CS2_DIRECTION is pin_b1_direction




-- ****************************************************
-- Incluimos las librerias que usaremos
-- ****************************************************
-- Using block write is fastest, but you can only use one font type:
-- FONT_TOP_LEFT_HORIZONTAL
--; const GLCD_USE_BLOCK_WRITE = FALSE





include print
include format

include delay

include glcd_ks0108

include glcd_common


-- Ahora inicializamos el glcd

glcd_init()

-- Y ponemos el puntito de David

forever loop

lcd_fill(0) -- Clear the display


GLCD_CS1 = 1
GLCD_CS2 = 0
GLCD_DI = 0 -- Seleccionamos contador 3
GLCD_RW = 0
GLCD_DATAPRT = 0x43
GLCD_E = 1
delay_100ms(2)
GLCD_E = 0

GLCD_DI = 0 -- Seleccionamos página 0
GLCD_RW  = 0
GLCD_DATAPRT = 0xB8
GLCD_E = 1
delay_100ms(2)
GLCD_E = 0

-- Encendemos el pixcel deseado
GLCD_DI = 1
GLCD_RW = 0
GLCD_DATAPRT = 0x40 -- d6 = 1, el resto = 0
GLCD_E = 1
delay_100ms(2)
GLCD_E = 0


delay_100ms(30)

GLCD_CS1 = 0
GLCD_CS2 = 1
GLCD_DI = 0 -- Seleccionamos contador 3
GLCD_RW = 0
GLCD_DATAPRT = 0x43
GLCD_E = 1
delay_100ms(2)
GLCD_E = 0

GLCD_DI = 0 -- Seleccionamos página 0
GLCD_RW  = 0
GLCD_DATAPRT = 0xB8
GLCD_E = 1
delay_100ms(2)
GLCD_E = 0

-- Encendemos el pixcel deseado
GLCD_DI = 1
GLCD_RW = 0
GLCD_DATAPRT = 0x40 --
GLCD_E = 1
delay_100ms(2)
GLCD_E = 0

delay_100ms(30)

end loop

Al fin me hace caso a lo que le pongo  :\ :\ :\
Sin saber que era imposible El fue y lo hizo