De tema de tesis tengo que hacer algo con xbee, el punto es que compre una pantalla touch 160x80 http://www.infinitumpage.mx/GIOSYS/pagina2680.html
El manual esta adjuntado.
Leyendo el mini-manual que viene en .txt me dispuse a trabajarlo y logre satisfactoriamente enviar una cadena de caracteres al GLCD.
La mayor parte de las instrucciones las saque del manual.
No quiero trabajar con C, ya que se me hace algo muy complejo, en especial la modificacion de librerias.
Tenemos 3 pines de control: E,R/W y RS:
RS=1: instruccion
RS=0: datos
E : habilita la funcion write durante la transicion de 1 a 0
(ver manual)
Aqui se observa que para lograr comunicacion con el display solo tenemos que indicar si vamos a enviar una instruccion o un dato (RS), luego poner el dato en D(0-7), y despues generar la transicion de 1 a 0 en (E), para que el display acepte la informacion, asi por cada dato o inst. que enviemos.
Para trabajar con el 18F4550 debemos declarar su propia libreria y los configuration bits:
Mandar datos a la GLCD es sencillo, como si se tratara de una 16x2, El problema es el PIN R/W, ya que el fabricante dice que: "el display tiene una bandera de espera la cual tiene que ser leiday comprobada antes de enviar el siguiente dato. Para evitar esto, solo debemos poner a tierra R/W para que siempre estemos escribiendo en el display, cuando mandemos un dato el PIN E debe de tener una cierta espera, yo le puse un retardo de casi 20 uS, con un oscilador interno a 4 Mhz.
Los pasos para configurar el GLCD modo caracter, 20 char x 10 renglones son los siguientes:
tabla1= 00,38,01,77,02,13,03,4F,04,07,08,00,09,00,0A,00,0B,00,0C
pone RS=0
variable X=13h (19 datos de la primer tabla)
ciclo1 pone RS=RS xor 1 (*)
Pone E=1
Lee dato de TABLA1
manda dato al puerto (display)
pone E=0
rutina de retardo (opcional)
decrementa en uno a variable X
si variable X es diferente de cero regresa a ciclo1
En el MPLAB quedaria asi:
El proveedor recomienda ejecutar una funcion XOr entre el valor de el bit que se haya designado para RS y "1", Ej: RS = Ra2(pic) entonces Ra2=Ra2 [XOR] 04h (0000 0100).
esto hará que el valor se invierta en forma alternada y nos de los valores para (RS) conforme a la primer tabla, observemos que se ha iniciado RS=0 para que en el primer ciclo esta se convierta en "1" para la primer instruccion, posteriormente cambiara su valor alternando 0,1,0,1,etc.
En el ciclo2 RS no cambia su valor de CERO ya que solo mandaremos DATOS al display.
Ahora enviamos caracteres al display, yo envie la palabra: "Hamburguesa".
La secuencia es:
variable X=11h (1 datos de la segunda tabla porque la palabra hamburguesa tiene 11 letras)
ciclo2 pone E=1
Lee dato de TABLA2
manda dato al puerto (display)
pone E=0
rutina de retardo (opcional)
decrementa en uno a variable X
si variable X es diferente de cero regresa a ciclo2
FIN de secuencias
;***********MANDA CARACTERES*************
clrf TBLPTRU
clrf TBLPTRH ; limpia TBLPTRU
movlw 0XEE
movwf TBLPTRL ; carga a 101 en TBLPTRL
cicda:
bsf pine
TBLRD*+ ; TABLAT++
movf TABLAT, W ; W <- TABLAT
movwf LATD ; dato <- W
bcf pine
rcall retarm
decfsz 0x004,f
goto cicda
push
goto sigue
ORG 0XEE
DB "Hamburguesa"
;*************FIN DE ENVIO DE CARACTERES**************
sigue:
retarm
movlw 0x20
movwf 0x005
mass
decfsz 0x005,f
goto mass
return
END ;Directiva fin del programa
Bueno, el proveedor de esta pantalla dice que despues de configurar la GLCD apareceran caracteres basura, el recomienda una rutina sencilla que posteo con algunas de sus propias palabras:
El Display no posee instruccion alguna para borrar el contenido de la memoria RAM por lo que despues del ciclo de inicializacion apareceran caracteres basura. por lo tanto habra que realizar un ciclo de borrado (clear screen):
--------- este ciclo va despues de la inicializacion TABLA1
variable X=C8h (200 caracteres)
ciclo3 pone E=1
manda 00 al puerto (display)
pone E=0
rutina de tiempo
decrementa en uno variable X
si variable X es diferente de cero regresa a ciclo3
** pone RS=1
pone E=1
manda 0A al puerto (instruccion RAM ADD LOWER)
pone E=0
pone RS=0
pone E=1
manda XX al puerto (direccion 00 a C7)
pone E=0
pone RS=0
------- aqui continua el ciclo2 que envia la TABLA2 al display
Recordar que al terminar la rutina de borrado el apuntador interno de el display estara en 00C8 el cual señala una posicion de RAM fuera de el display, tienes que volver a mandar el SET para la instruccion: RAM ADD lower y upper y juntas (16bits) forman la direccion para escribir en la memoria RAM destinada al display.
En el ejemplo se configura el display a 20x10 caracteres, quedando la memoria de la siguiente manera (hexadecimal):
0000 0001 0002 0003 0004 0005 0006 ...... 0013 <--- 20 caracteres renglon 1
0014 0015 0016 0017 0018 0019 001A ...... 0027 <--- 20 caracteres renglon 2
-------
-------
-------
00B4 00B5 00B6 00B7 00B8 00B9 00BA ...... 00C7 <--- 20 caracteres renglon 10
Se observa que los 8 bits de la izq (upper) siempre estan en cero, entonces si queremos "escribir" en el display desde el principio (angulo superior izq) solamente debemos mandar el set para LOWER=cero.
si preferimos ponerlo en cualquier valor de 00h a C7h. esto seria como un goto(xy) Ej: si ponemos "HOLA" al centro (aprox) de la pantalla el valor para LOWER seria 58h.
Asi indicaremos donde queremos empezar a "escribir" en la pantalla.
Realize una rutina para estas instrucciones, metiendolas justo entre el fin de la tabla 1 y el principio de donde dice: ENVIO DE CARACTERES quedando como sigue:
;*****LIMPIA LA PANTALLA***********
movlw 0x0C8 ;PARA LIMPIAR LA PANTALLA
movwf 0x00A ;PARA LIMPIAR LA PANTALLA
limpia bsf pine
movlw 0x00
movwf LATD
bcf pine
rcall retarm ; ***********retardo
decfsz 0x00A,f,.0
goto limpia
bsf pinrs
bsf pine
movlw 0x0A
movwf LATD
bcf pine
bcf pinrs
bsf pine
movlw 0x00 ;*********GOTO(XY)
movwf LATD ; ********GOTO(XY)
bcf pine
rcall retarm ; ***********retardo
bcf pinrs
;*************FIN LIMPIAR LA PANTALLA***********
Bueno la cuestion es que no funciona, no se ve nada en la pantalla, se queda en blanco y no sirve esta minirutina, aqui pido su ayuda, ya que me es urgente hechar a andar esa screen, despues voy a meterle graficos y posteriormente el manejo de la touch, en 3 meses lo debo de terminar, asi que voy a decir siempre como lo hize, gracias.
El manual esta adjuntado.
Leyendo el mini-manual que viene en .txt me dispuse a trabajarlo y logre satisfactoriamente enviar una cadena de caracteres al GLCD.
La mayor parte de las instrucciones las saque del manual.
No quiero trabajar con C, ya que se me hace algo muy complejo, en especial la modificacion de librerias.
Tenemos 3 pines de control: E,R/W y RS:
RS=1: instruccion
RS=0: datos
E : habilita la funcion write durante la transicion de 1 a 0
(ver manual)
Aqui se observa que para lograr comunicacion con el display solo tenemos que indicar si vamos a enviar una instruccion o un dato (RS), luego poner el dato en D(0-7), y despues generar la transicion de 1 a 0 en (E), para que el display acepte la informacion, asi por cada dato o inst. que enviemos.
Para trabajar con el 18F4550 debemos declarar su propia libreria y los configuration bits:
Código:
LIST P=18F4550 ;Directiva para definir el procesador
#include <P18F4550.INC> ;Definicion de SFRs para el procesador
;******** Configuracion del Oscilador **********
CONFIG FOSC = INTOSCIO_EC ;Osc interno, RA6 como pin, USB usa Osc EC
;******** Otros bits de configuracion **********
CONFIG PWRT = ON ;PWRT habilitado
CONFIG BOR = OFF ;Brown out reset deshabilitado
CONFIG WDT = OFF ;Watchdog deshabilitado
CONFIG MCLRE = OFF ;MCLR como entrada
CONFIG PBADEN = ON ;Todos los pines como entradas analogicas
CONFIG LVP = ON ;Programacion en bajo voltaje apagado
;********* Bits de proteccion ******************
CONFIG CP0 = OFF ;los bloques del codigo de programa
CONFIG CP1 = OFF ;no estan protegidos
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB = OFF ;Sector Boot no esta protegido
CONFIG CPD = OFF ;La EEPROM no esta protegida
Despues debemos de considerar variables para hacer rutinas de retardo:
CBLOCK 0x000 ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
Cantms:2 ;variable para generar hasta 65535 ms
CantSeg ;Variable para producir retardos de hasta 255 seg
ENDC
#DEFINE pine LATE,1
#DEFINE pinrs LATE,0
Iniciando perifericos
ORG 0x0000
goto Main ;Se va al inicio del codigo principal
Main
;******************* Inicializamos perifericos ***************************
clrf LATD
clrf TRISE,.0
movlw B'01100000' ;Ajustamos el oscilador interno a 4 MHz
movwf OSCCON,.0
movlw B'00001111'
movwf ADCON1,.0 ;Todos los pines como I/O digitales
clrf TRISD,.0
Mandar datos a la GLCD es sencillo, como si se tratara de una 16x2, El problema es el PIN R/W, ya que el fabricante dice que: "el display tiene una bandera de espera la cual tiene que ser leiday comprobada antes de enviar el siguiente dato. Para evitar esto, solo debemos poner a tierra R/W para que siempre estemos escribiendo en el display, cuando mandemos un dato el PIN E debe de tener una cierta espera, yo le puse un retardo de casi 20 uS, con un oscilador interno a 4 Mhz.
Los pasos para configurar el GLCD modo caracter, 20 char x 10 renglones son los siguientes:
tabla1= 00,38,01,77,02,13,03,4F,04,07,08,00,09,00,0A,00,0B,00,0C
pone RS=0
variable X=13h (19 datos de la primer tabla)
ciclo1 pone RS=RS xor 1 (*)
Pone E=1
Lee dato de TABLA1
manda dato al puerto (display)
pone E=0
rutina de retardo (opcional)
decrementa en uno a variable X
si variable X es diferente de cero regresa a ciclo1
En el MPLAB quedaria asi:
Código:
;******************INICIA GLCD********************
bcf pinrs
movlw 0x13 ;
movwf 0x003
movlw 0x0B
movwf 0x004 ;
clrf TBLPTRU
clrf TBLPTRH ; limpia TBLPTRU
movlw 0x82
movwf TBLPTRL ; carga a 82 en TBLPTRL
ciclo:
movlw 0x01
xorwf LATE,1,.0
bsf pine
TBLRD*+ ; TABLAT++
movf TABLAT, W ; W <- TABLAT
movwf LATD ; dato <- W
bcf pine
rcall retarm
decfsz 0x003,f
goto ciclo ; bucle eterno
bcf pinrs
goto pruebas
ORG 0x82
DB 0X00,0X38,0X01,0X77,0X02,0X13,0X03,0X4F,0X04,0X07,0X08,0X00,0X09,0X00,0X0A,0X00,0X0B,0X00,0X0C
; *************FIN DE LA TABLA ****************
El proveedor recomienda ejecutar una funcion XOr entre el valor de el bit que se haya designado para RS y "1", Ej: RS = Ra2(pic) entonces Ra2=Ra2 [XOR] 04h (0000 0100).
esto hará que el valor se invierta en forma alternada y nos de los valores para (RS) conforme a la primer tabla, observemos que se ha iniciado RS=0 para que en el primer ciclo esta se convierta en "1" para la primer instruccion, posteriormente cambiara su valor alternando 0,1,0,1,etc.
En el ciclo2 RS no cambia su valor de CERO ya que solo mandaremos DATOS al display.
Ahora enviamos caracteres al display, yo envie la palabra: "Hamburguesa".
La secuencia es:
variable X=11h (1 datos de la segunda tabla porque la palabra hamburguesa tiene 11 letras)
ciclo2 pone E=1
Lee dato de TABLA2
manda dato al puerto (display)
pone E=0
rutina de retardo (opcional)
decrementa en uno a variable X
si variable X es diferente de cero regresa a ciclo2
FIN de secuencias
;***********MANDA CARACTERES*************
clrf TBLPTRU
clrf TBLPTRH ; limpia TBLPTRU
movlw 0XEE
movwf TBLPTRL ; carga a 101 en TBLPTRL
cicda:
bsf pine
TBLRD*+ ; TABLAT++
movf TABLAT, W ; W <- TABLAT
movwf LATD ; dato <- W
bcf pine
rcall retarm
decfsz 0x004,f
goto cicda
push
goto sigue
ORG 0XEE
DB "Hamburguesa"
;*************FIN DE ENVIO DE CARACTERES**************
sigue:
retarm
movlw 0x20
movwf 0x005
mass
decfsz 0x005,f
goto mass
return
END ;Directiva fin del programa
Bueno, el proveedor de esta pantalla dice que despues de configurar la GLCD apareceran caracteres basura, el recomienda una rutina sencilla que posteo con algunas de sus propias palabras:
El Display no posee instruccion alguna para borrar el contenido de la memoria RAM por lo que despues del ciclo de inicializacion apareceran caracteres basura. por lo tanto habra que realizar un ciclo de borrado (clear screen):
--------- este ciclo va despues de la inicializacion TABLA1
variable X=C8h (200 caracteres)
ciclo3 pone E=1
manda 00 al puerto (display)
pone E=0
rutina de tiempo
decrementa en uno variable X
si variable X es diferente de cero regresa a ciclo3
** pone RS=1
pone E=1
manda 0A al puerto (instruccion RAM ADD LOWER)
pone E=0
pone RS=0
pone E=1
manda XX al puerto (direccion 00 a C7)
pone E=0
pone RS=0
------- aqui continua el ciclo2 que envia la TABLA2 al display
Recordar que al terminar la rutina de borrado el apuntador interno de el display estara en 00C8 el cual señala una posicion de RAM fuera de el display, tienes que volver a mandar el SET para la instruccion: RAM ADD lower y upper y juntas (16bits) forman la direccion para escribir en la memoria RAM destinada al display.
En el ejemplo se configura el display a 20x10 caracteres, quedando la memoria de la siguiente manera (hexadecimal):
0000 0001 0002 0003 0004 0005 0006 ...... 0013 <--- 20 caracteres renglon 1
0014 0015 0016 0017 0018 0019 001A ...... 0027 <--- 20 caracteres renglon 2
-------
-------
-------
00B4 00B5 00B6 00B7 00B8 00B9 00BA ...... 00C7 <--- 20 caracteres renglon 10
Se observa que los 8 bits de la izq (upper) siempre estan en cero, entonces si queremos "escribir" en el display desde el principio (angulo superior izq) solamente debemos mandar el set para LOWER=cero.
si preferimos ponerlo en cualquier valor de 00h a C7h. esto seria como un goto(xy) Ej: si ponemos "HOLA" al centro (aprox) de la pantalla el valor para LOWER seria 58h.
Asi indicaremos donde queremos empezar a "escribir" en la pantalla.
Realize una rutina para estas instrucciones, metiendolas justo entre el fin de la tabla 1 y el principio de donde dice: ENVIO DE CARACTERES quedando como sigue:
;*****LIMPIA LA PANTALLA***********
movlw 0x0C8 ;PARA LIMPIAR LA PANTALLA
movwf 0x00A ;PARA LIMPIAR LA PANTALLA
limpia bsf pine
movlw 0x00
movwf LATD
bcf pine
rcall retarm ; ***********retardo
decfsz 0x00A,f,.0
goto limpia
bsf pinrs
bsf pine
movlw 0x0A
movwf LATD
bcf pine
bcf pinrs
bsf pine
movlw 0x00 ;*********GOTO(XY)
movwf LATD ; ********GOTO(XY)
bcf pine
rcall retarm ; ***********retardo
bcf pinrs
;*************FIN LIMPIAR LA PANTALLA***********
Bueno la cuestion es que no funciona, no se ve nada en la pantalla, se queda en blanco y no sirve esta minirutina, aqui pido su ayuda, ya que me es urgente hechar a andar esa screen, despues voy a meterle graficos y posteriormente el manejo de la touch, en 3 meses lo debo de terminar, asi que voy a decir siempre como lo hize, gracias.
Adjuntos
Última edición: