Autor Tema: caso extraño con LCD 16x2  (Leído 8510 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado JBQ

  • PIC16
  • ***
  • Mensajes: 118
Re: caso extraño con LCD 16x2
« Respuesta #15 en: 14 de Febrero de 2014, 20:59:27 »
yo no le echaria tan rápido la culpa al proteus isis; en este caso referente al manejo del lcd, me ha resultado ser fiel a lo que dicen los manuales.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: caso extraño con LCD 16x2
« Respuesta #16 en: 14 de Febrero de 2014, 22:33:32 »
podrias poner un trozo de codigo referente al envio de los dos nibbles con la comprobacion del busy?

a mi no me sale.o si sabes donde esta la libreria en cuestion?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado JBQ

  • PIC16
  • ***
  • Mensajes: 118
Re: caso extraño con LCD 16x2
« Respuesta #17 en: 15 de Febrero de 2014, 03:42:54 »
esta es una libreria mia de una version anterior, es de una conexcion de 4 bits por el nibble bajo, ya que por ahi lei que estabas usando el nibble bajo.

FLAG_ADDRES_LCD_4LBITS es un registro donde guardo el dato leido en el lcd. en este caso, la addres del pc del lcd, junto con el busy flag.


Código: [Seleccionar]

         ;Lee el bus del LCD;
         ;******************;
BF_4L
LCD_4LBITS_LEE ;R/W = 1, modo lectura
  nop
LCD_4LBITS_COMANDO ;RS = 0, modo comando
nop
LCD_4LBITS_E_ON ;E = 1, habilita bus del LCD
nop
LCD_4LBITS_E_OFF ;E = 0, deshabilita el bus del LCD
nop

        movf PORT_LCD_4LBITS,W ;Lee el LCD los 4 bits MSB
andlw 0x0F
banksel FLAG_ADDRES_LCD_4LBITS
movwf FLAG_ADDRES_LCD_4LBITS
swapf FLAG_ADDRES_LCD_4LBITS,F

banksel PORT_LCD_4LBITS
LCD_4LBITS_LEE ;R/W = 1, modo lectura
nop
LCD_4LBITS_COMANDO ;RS = 0, modo comando
nop
LCD_4LBITS_E_ON ;E = 1, habilita bus del LCD
nop
LCD_4LBITS_E_OFF ;E = 0, deshabilita el bus del LCD
nop

movf PORT_LCD_4LBITS,W ;Lee el LCD los 4 bits LSB
andlw 0x0F
banksel FLAG_ADDRES_LCD_4LBITS
addwf FLAG_ADDRES_LCD_4LBITS,F


         ;LCD ocupado o listo?; ;Si el bit 7 del FLAG_ADDRES_LCD_4LBITS
         ;********************; ;esta a cero, el LCD se encuentra
;         banksel FLAG_ADDRES_LCD_4LBITS ;listo, si esta a uno, el LCD se
; movwf FLAG_ADDRES_LCD_4LBITS ;encuentra ocupado. Los otros bits
btfsc FLAG_ADDRES_LCD_4LBITS,7 ;indican direccion actual del LCD
goto BF_4L ;


hay dos cosas que quizas deba de aclarar. la seccion donde leo el bus del lcd y lo guardo en el registro FLAG_ADDRES_LCD_4LBITS, lo hago mediante un arreglo rudimentario (es una version desfasada) ya que lo que deseo es tener el dato en un solo registro. Lo otro, es el desorden, como los tabs no funcionan y solo hice un copy paste del mplab a la web, se ve asi. trate de arreglarlo un poco, pero no queda bien.

Como te decia, en esta version, leo el lcd, y lo guardo en un registro, y ahi testeo el bit busy flag del lcd. La nueva version ya no la hace asi, lo testea directamente.
Como te decia, el dato se actualiza en el flanco de bajada, y por ser una conexion de 4 bits, se tiene que leer 2 veces.


Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: caso extraño con LCD 16x2
« Respuesta #18 en: 15 de Febrero de 2014, 14:38:42 »
ya me funciona lo de la comprobacion del busy.lo he hecho de las dos formas.guardando el bit busy en un registro.y tambien directamente.
guardandolo en un registro.la rutina funciona bien en el isis y no da ningun error.

pero si lo hago directamnte.de vez en cuando sale algun error en el isis.

referente a lo de la rotacion.sigue igual.tengo que invertir el sentido de desplazamiento segun use el isis o en circuito.


estoy pensando en usar entry mode set.incluso me parece que es mas efectivo.ya que se emplea menos tiempo en la visualizacion de mensages en movimiento.





Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado JBQ

  • PIC16
  • ***
  • Mensajes: 118
Re: caso extraño con LCD 16x2
« Respuesta #19 en: 15 de Febrero de 2014, 14:50:54 »
entry mode set no te sirve, para la forma como estas escribiendo tus mensajes en el lcd y los estas visualizando.

realiza pruebas aparte de los comandos que estas usando; puede ser algún error de firmware.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: caso extraño con LCD 16x2
« Respuesta #20 en: 15 de Febrero de 2014, 19:13:58 »
jejeje.estoy realizando el codigo para el entry mode set.y la cosa no es tan facil como creia.hacerse si que se pude hacer.e incluso utilizaria menos
codigo que con el CURSOR OR DISPLAY SHIFT.pero teniendo hecho ya el codigo para DISPLAY SHIFT.no voy a perder mas tiempo.

en entry mode set.solo tendria que empezar a visualizar los caracteres en l parte izquierda de la pantalla.y conforme los imprimo,se irian
desplazando.pero no tube en cuenta de que la DDRAM tambien se desplaza.y cuando llegara al final de la DDRAM los caracteres se visualizarian
en la otra linea.o ni eso si estamos en diferente linea.
tendria que mapear parte del mensage en la zona visible y luego seguir el desplazamiento.y ni eso se si serviria.porque los primeros caracteres
podrian aparecer por otro sitio. y tendria que ir borrandolos.

asi que me quedo con CURSOR OR DISPLAY SHIFT.que no funciona correctamente en el isis.pues ya no se si es porque tengo mal mi version
o porque es.asi que ya posteare mi proyecto y que alguien lo pruebe por su cuenta.

muchas gracias JBQ me ha venido muy bien tu ayuda.por lo menos solucione lo del busy
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: caso extraño con LCD 16x2
« Respuesta #21 en: 16 de Febrero de 2014, 18:02:02 »
aqui pongo la rutina para el envio de los bytes a la LCD.con la comprobacion del flag busy.para el modo de 4bit.

Código: [Seleccionar]
;********************************************** ENVIO DE NIBLES  A LA LCD MODO 4bit******************************************************
;PULSO MACRO ;pulso en terminal E de la LCD
; bsf PORTA,3 ;habilita LCD (activa E de la LCD)
; nop ;retardo 1us
;   bcf PORTA,3 ;deshabilita LCD (desactiva E de la LCD)
; ENDM

; #define COMANDOS     bcf PORTA,1 ;Desactiva RS (modo comando)
; #define READ bsf PORTA,2 ;Activa RW (modo lectura de la lcd)
; #define WRITE bcf PORTA,2 ;Desactiva RW (modo escritura de la lcd)
; #define ENABLE_LCD bsf PORTA,3 ;habilita LCD
; #define DISABLE_LCD bcf PORTA,3 ;deshabilita LCD




BYTE       movwf   TEMPLCD ;guarda el contenido de W en registro temporal TEMPLCD

andlw 0xf0 ;nible bajo de PORTB como salida
         movwf   TRISB       ;
BYTE2       movlw   0xF0 ;pon a 0 el nible bajo de W
            andwf   LATB,F ;borra el nible bajo de portb sin tocar el nible alto.
            swapf   TEMPLCD,W ;invierte los nibles del registro TEMPLCD
            andlw   0x0F ;seleccionar el nible bajo de W
   iorwf   LATB,F ;manda nible bajo de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
   movlw   0xF0 ;pon a 0 el nible bajo de W
            andwf   LATB,F ;borra el nible bajo de portb sin tocar el nible alto.
            movf   TEMPLCD,W ;carga el contenido de TEMPLCD en W
            andlw   0x0F;f0 ;seleccionar el nible bajo de W
            iorwf   LATB,F ;manda nible bajo de W a PORTB.
PULSO ;pulso de 1ms en terminal E de la LCD
call LCD_BUSY
return ;retorna


LCD_BUSY   movff PORTA,TEMP_PORTA;salva el registro PORTA
COMANDOS ;selecciona el modo comandos
iorlw 0x0F ;nible bajo de PORTB como entrada
         movwf    TRISB       ;PORT B como entrada
READ           ;Pone el LCD en Modo RD "lectura"
P_BUSY ENABLE_LCD ;activa LCD
nop ;retardo 1us
movff PORTB,TEMP_BUSY ;guarda el estado del busy
       DISABLE_LCD         ;Desactiva LCD
PULSO ;pulso Enable
btfsc   TEMP_BUSY,3 ;comprueba si el flag de ocupado de la LCD esta activo
   goto P_BUSY ;si es asi,espera a que la LCD este libre
L_BUSY DISABLE_LCD ;Desactiva LCD
WRITE         ;Pone LCD en modo WR
movff TEMP_PORTA,LATA ;restaura el registro LATA
return ;retorna
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: caso extraño con LCD 16x2
« Respuesta #22 en: 16 de Febrero de 2014, 20:08:19 »
bueno.aqui pongo el proyecto que visualiza mensages en la lcd.esta en proteus.debe de funcionar correctamente.pero con el comando invertido.
es decir a derechas para que funcione a izquierda en el isis.en el circuito fisico hay que modificarlo al valor correcto.

en la libreria Mensages.inc  al final del codigo esta el comando en binario.y esta comentado para poner el sentido de desplazamiento correcto.

por si alguien es capaz de encontrar el fallo.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado JBQ

  • PIC16
  • ***
  • Mensajes: 118
Re: caso extraño con LCD 16x2
« Respuesta #23 en: 17 de Febrero de 2014, 01:07:57 »
creo que ya comprendi tu confusión.

Mira, el LCD tiene.. digamnos, una tabla, letrero, cartel, donde se escribe el mensaje. Este consta de 64x2 caracteres, de los cuales solo son visibles 16x2 a traves de un display, ventana, pantalla.

Lo que tu haces desplazar, no es el objeto que contiene el mensaje, sino el display por donde se visualiza el mensaje. Por eso cuando crees que estas enviando un comando  de desplazanmiento a la derecha para que tu mensaje se mueva hacia la izquierda, lo que estas haciendo en realidad, es desplazar hacia la derecha el display por donde se visualiza el mensaje. El lugar donde se escribio el mensaje no se pude hacer desplazar.

No se si me deje entender.

te adjunto un archivo. en la pagina 8 esta mejor explicado lo que te comento,  aver si te ayuda.
« Última modificación: 17 de Febrero de 2014, 01:17:38 por JBQ »

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: caso extraño con LCD 16x2
« Respuesta #24 en: 17 de Febrero de 2014, 10:57:34 »
si.eso lo entiendo.son 40 caracteres por linea.y lo que hace es desplazar la ddram.lo que no entiendo es que enviando los mismos nibles a la lcd,cunfiguracion de
escritura,modo comando,y pulso.aparte de comprobar el flag...etc.

porque funciona de forma diferente en el simulador con repecto al circuito fisico.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado JBQ

  • PIC16
  • ***
  • Mensajes: 118
Re: caso extraño con LCD 16x2
« Respuesta #25 en: 17 de Febrero de 2014, 11:40:04 »
no, no desplaza la ddram, desplaza el display. Ese es el error de concepto.

Bueno, lo otro podría ser como te dije  a un error en tu firmware. Con un rápido vistazo pude ver varios errores. uno que me llamo la atención es como cargas una cte en W; opr que no usas la instrcción movlw en ves de andlw?


Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: caso extraño con LCD 16x2
« Respuesta #26 en: 17 de Febrero de 2014, 19:04:06 »
comprendo.entoces movlw   B'00011100' es el comando de rotacion a derechas.que nos da la impresion de que el mensage va hacia la izquierda.
asi que el proteus funciona correctamente.algo tendre mal hecho en el codigo que si funciona en isis pero no en el circuito real.

PD. no entiendo que quieres decir con : cargas una cte en W   y encuanto a andlw.es una instruccion que debe de realizar su cometido.o puede fallar en un determinado funcionamiento?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado JBQ

  • PIC16
  • ***
  • Mensajes: 118
Re: caso extraño con LCD 16x2
« Respuesta #27 en: 17 de Febrero de 2014, 19:34:25 »
no es que falle la instrucción, es que me parece raro su uso en la subrutina donde la usas, se llama byte.
Ahi veo que guardas el valor de un registro en otro registro temporal, y de ahi configuras el puerto del lcd. esto es en el archivo mensajes.inc
 no pasa nada con los pines del  lcd, pero si afecta a los otros pines que pueden estar conectadso a algo, los desconfiguras.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: caso extraño con LCD 16x2
« Respuesta #28 en: 18 de Febrero de 2014, 11:13:05 »
te refieres a esta linea: andlw   0xf0         ;nible bajo de PORTB como salida

precisamente usar andlw o iorlw en determinados casos.lo que hace es prebenir el cambio de bits.

por ejemplo: andlw 0xf0  lo que hace es poner a cero los 4 bit menos significativos de w.pero no toca el nible alto.esten a 0 como a 1.
y tambien se puede hacer con bits independientes.  andlw b'11110000'  o andlw b'11010010'

iorlw hace la operacion inversa.pone a 1 los bits.

iorlw 0xf0   pone a 1 el nible alto independientemente del valor que tengan los bits. y no toca el nible bajo.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: caso extraño con LCD 16x2
« Respuesta #29 en: 18 de Febrero de 2014, 17:52:40 »
bueno.pues ya no pierdo mas tiempo. :5]

he utilizado el simulador por hardware ICD2. y paso por paso he comprobado los voltages a los pin D4,D5,D6 Y D7.

respectivamente los estados son 1000 para el primer nible enviado que es el nible alto.
y posteriormente el valor  0011 para el segundo nible que sera el nible bajo.

asi que el comando b'00011100' rotacion a derechas,en la lcd se traduce a una rotacion a izquierdas en el circuito real.almenos en el modo a 4bit.
no se como se comportara en el modo 8bit.

igual algun dia alguien me confirma que tengo un error en mi software.pero con un simulador en circuito y comprobandolo insitu.no veo que esto tenga solucion.

y no es problema de la LCD ya que he probado con dos de diferente marca.

asi que el comando b'00111000' rotacion a derechas,en la lcd se traduce a una rotacion a izquierdas.
Montando mi primera impresora 3D (Raprep Prusa i3)


 

anything