Autor Tema: problema al mostrar menu en una LCD  (Leído 3202 veces)

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

Desconectado diego_castano00

  • PIC10
  • *
  • Mensajes: 30
problema al mostrar menu en una LCD
« en: 18 de Febrero de 2006, 21:12:00 »
Hola estoy trabajando en unos menus sobre una LCD, tratando de que muestre un menu y luego pase a otro y asi sucesivamente (mas o menos 3 menus), trabajo con un PIC 16F877A, en entorno MPLAB, quemador ICPROG usando codigo ASSEMBLER y realizando las simulaciones en PIC SIMULATOR IDE, LCD 2X16 HITACHI

este es realmente el problema creo el software y lo simulo para mostrar la palabra PIC 16F877A V.00 en la primera fila y me pasa lo siguiente en la simulacion de mil maravillas pero cuando quemo el pic y lo pongo a trabajar (en modo REAL) o aparece con sombras y como si oscilara, ahora si escribo en vez de la palabra anterior escribo HOLA me muestra la LCD esto

HOLAHOLAHOLA
HOLAHOLAHOLA
y empieza como a montarse un mensaje sobre otro, en algunas ocasiones cuando cambio algo del codigo obedeciendo al fabricante OPTREX (LCD DMC16204) no muestra nada la LCD o se pone la primera fila toda sombreada

No se que es lo que pasa, al parecer la LCD esta buena, pero no logro corregir el problema

Gracias

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: problema al mostrar menu en una LCD
« Respuesta #1 en: 18 de Febrero de 2006, 21:57:00 »
Creo que estas eviando varias veces el mismo dato!  Tu bucle se esta repitiendo.

Enciendes una vez el hardware y el lcd, pero el pic tal vez se esté reiniciando o volviendo atrás en el código (por algun bucle o simplemente porque has manejado mal alguna seteo de Rom Bank  con el registro PCLATH)  y entonces como el display no se reinicia y lo que agregues siempre se pone uno detras de otra letra el resultado es lo que ves.

En el caso de la otra frase como no es multiplo de 4, 8 o 16, seguramente se está escribiendo cientos de veces por segundo lo cual impide verlo claramente y de ahí el parpadeo.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: problema al mostrar menu en una LCD
« Respuesta #2 en: 18 de Febrero de 2006, 22:17:00 »
Hola diego_castano00, al parecer por lo que comentas té esta faltando darle da dirección donde debe empezar a escribir el mensaje.

Tú lo que estas haciendo es enviar los caracteres para la palabra HOLA continuamente y no le estas indicando al display en que dirección de memoria lo ubica.

Trata de enviar el carácter H"80" como instrucción y luego los caracteres de HOLA como datos.

Con H"80" le indicas al LCD que el primer dato enviado después de esto lo ponga en la primera posición de la fila superior, si colocaras H"81" seria en la segunda posición de la fila de arriba.

Para la fila de abajo debe ser H"C0" que es la primera posición, H"C1" es la segunda, y así sucesivamente.

Por otro lado veo que le envías continuamente la información a representar, en los LCD eso no es necesario conque le envíes una sola ves los datos alcanza, luego si debe haber un cambio en la indicación envías los datos a las direcciones correspondiente y listo.

Ten en cuanta que como tu ya seleccionaste la función de desplazar el cursor a la derecha a cada dato recibido no es necesario que le indiques continuamente la dirección a cada dato enviado, ej:

Deseamos enviar  PIC 16F877A V.00 a la primera fila y HOLA a la segunda aremos así:

H"80" como información y luego PIC 16F877A V.00 como dato
H"C0" como información y luego HOLA como dato.

Espero te sea de utilidad, suerte.

Atte. CARLOS

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado diego_castano00

  • PIC10
  • *
  • Mensajes: 30
RE: problema al mostrar menu en una LCD
« Respuesta #3 en: 19 de Febrero de 2006, 16:04:00 »
Aqui pongo el codigo que estoy usando, ahora sia lgo cambios como el que me indicaste de colocar H"80" antes de escribir HOLA me pasa que la primera fila se pone toda en negrita toda sombreada

;************** Comandos para manejo del LCD *************
      LIST      P=16F877A
      INCLUDE      <P16F877A.INC>
         
         

STATUS       EQU       0X03    ;Dirección del registro STATUS.
LCD_E       EQU       2       ;Bit del puerto A para control de E.
LCD_RW       EQU       1   ;Bit del puerto A para control de R/W.
LCD_RS       EQU       0   ;Bit del puerto A para control de RS.
RETARDO1    EQU       0X0D   ;Constante del temporizador 1
RETARDO2    EQU       0X00   ;Constante del temporizador 2   
CONTA      EQU      20      
      
         
         
      ORG       0X0C  ;registro  de Uso general
CONT1       RES       1 ;Reserva un Byte para la Variable CONT1
CONT2       RES       1 ;Reserva un Byte para la Variable CONT2         
   
      ORG       0X00
      GOTO      START
      ORG         05
         
;INCIALIZACION LCD POR SOFTWARE         
         
START      
      CALL      TEMPO2
      MOVLW      0X38
      CALL      LCDI
      CALL      TEMPO2
      CALL      TEMPO2
      MOVLW      0X38
      CALL      LCDI
      CALL      TEMPO2
      MOVLW      0X38
      CALL      LCDI
      MOVLW       B"00111000" ;Modo de transferencia a 8 bits, 2 lineas y matriz de 5X7
      CALL       LCDI
      MOVLW      B"00001000"   ;Display OFF
      CALL      LCDI
      MOVLW      B"00000001"   ;Clear DISPLAY
      CALL      LCDI
      MOVLW       B"00000110" ;Display trabaja con desplazamiento a la derecha despues de
      CALL       LCDI ;;Cada dato, e incremento del cursor
      MOVLW       B"00001110" ;Display ON cursor ON sin Parpadeo
      CALL       LCDI         
         
         
         
      BSF       STATUS,5       ;Cambio al banco 1
      MOVLW      0X06
                                MOVWF      ADCON1   
      MOVLW       B"00000000"
      MOVWF       TRISA          ;Configura todo el puerto A como salida.
      MOVLW       B"00000000"
      MOVWF       TRISD          ;;Configura todo el puerto B como salida
      MOVLW       0xC7       ;dato de configuración para el timer0
      MOVWF       OPTION_REG    ;modo temporizador, preescalador 1/256 asignado a timer0
      BCF       STATUS,5       ;Cambio al banco 0
      CLRF      PORTA
      CLRF      PORTD

MENU   
      MOVLW      H"80"
      CALL      LCDI         
      MOVLW       "H"  ;Coloca el carácter ASCII en W
      CALL      LCDC
      MOVLW      "O"                   CALL       LCDC          ;
      MOVLW       "L"          ;
      CALL       LCDC                   MOVLW       "A"                   CALL       LCDC          .
                              
INFINITO   
      CLRF      PORTA
      CLRF      PORTD
      GOTO      INFINITO

LCDI
      BCF       PORTA,LCD_RW ;Coloca "0" en el Pin RW.
      BCF       PORTA,LCD_RS ;Coloca "0" en el Pin RS.
      BSF       PORTA,LCD_E  ;Coloca "1" en el Pin E
      MOVWF       PORTD ;                  BCF       PORTA,LCD_E    ;Coloca "0" en el Pin E
      CALL       TEMPO1    ;Llamada de una  tiempo de 40 micro segundos.
      RETURN                   ;Finaliza la Rutina de tiempo.

LCDC
      BCF   PORTA,LCD_RW   ;Coloca "0" en el Pin RW.
      BSF   PORTA,LCD_RS   ;Coloca "1" en el Pin RS.
      BSF   PORTA,LCD_E    ;Coloca "1" en el Pin E
      MOVWF   PORTD ;Coloca el contenido al modulo LCD.
      BCF    PORTA,LCD_E    ;Coloca "0" en el Pin E
      CALL   TEMPO1    ;subrutina  de 40 micro segundos.
      RETURN                   ;Finaliza la Rutina de tiempo.


TEMPO1       MOVLW       RETARDO1
      MOVWF       CONT1
CICLOT1      NOP
      DECFSZ       CONT1,1
      GOTO       CICLOT1
      RETURN
   
TEMPO2       MOVLW       RETARDO2
      MOVWF       CONT2
CICLOT2                    CALL       TEMPO1
      DECFSZ       CONT2,1
      GOTO       CICLOT2
      RETURN
         
      END

Desconectado diego_castano00

  • PIC10
  • *
  • Mensajes: 30
RE: problema al mostrar menu en una LCD
« Respuesta #4 en: 19 de Febrero de 2006, 16:09:00 »
Ahh para que lo entiendan mejor no se porque me queda asi el codigo, bueno
LCDC coloca el caracter en la LCD, LCDI coloca una instruccion, START es otra etiqueta, y TEMPO1, TEMPO2 son las temporizaciones

Chaooo

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: problema al mostrar menu en una LCD
« Respuesta #5 en: 19 de Febrero de 2006, 16:17:00 »
Hola diego_castano00, no se que frecuencia usas de cristal, pero creo que los tiempos están de forma incorrecta ya que la falla que cometas que te hace por lo general es debido a eso.

Un saludo

Atte. CARLOS

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado diego_castano00

  • PIC10
  • *
  • Mensajes: 30
RE: problema al mostrar menu en una LCD
« Respuesta #6 en: 22 de Febrero de 2006, 20:51:00 »
HeladoHola uso un XT de 4MHZ bueno los tiempos en la simulacion no me cuadraban pero los corregí en un nuevo codigo y el problema a pesar de que cumple con los delays del fabricante persiste la oscilacion del texto continua y cada cambio que hago al codigo pone ahora la primera fila de la LCD sombreada, estoy consultando con amistades aficionados  al PIC pero no saben que pasa.

Sera que hay otro problema en el codigo  no se, sigo igual en el tema

ChaoFlash

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: problema al mostrar menu en una LCD
« Respuesta #7 en: 22 de Febrero de 2006, 21:44:00 »
Hola diego_castano00, prueba con esta rutina:

Codigo:
   LIST   P=16F870
   INCLUDE   <P16F870.INC>
;................................................................................................
#DEFINE      OUT_RS   PORTA,2
#DEFINE      OUT_E   PORTA,0

CONTADOR1      EQU   .35
CONTADOR2      EQU   .36
CODIGO      EQU   .37
;................................................................................................
   org   .0
   goto   INICIO

;................................................................................................
INI
   movwf   PORTB
   bcf   OUT_RS
   bsf   OUT_E
   call   RUTINA1
   call   RUTINA1
   call   RUTINA1
   call   RUTINA1
   call   RUTINA1
   bcf   OUT_E
   return

;................................................................................................
INST
   movwf   PORTB
   bcf   OUT_RS
   bsf   OUT_E
   call   RUTINA1
   call   RUTINA1
   bcf   OUT_E
   return

;................................................................................................
DATO
   movwf   PORTB
   bsf   OUT_RS
   bsf   OUT_E
   call   RUTINA
   bcf   OUT_E
   call   RUTINA
   bcf   OUT_RS
   bcf   OUT_E
   return

;................................................................................................
RUTINA
   movlw   .10
   movwf   CONTADOR1
QWE
   nop
   decfsz   CONTADOR1,F
   goto   QWE
   return

;................................................................................................
RUTINA1               ;RUTINA DE DEMORA DE 1ms

   movlw   .248
   movwf   CONTADOR1
RET1
   nop
   decfsz   CONTADOR1,F
   goto   RET1
   return

;................................................................................................
INICIO
   clrf   PORTA
   clrf   PORTB
   clrf   PORTC

   bsf   STATUS,RP0
   bcf   STATUS,RP1
   movlw   B"00000110"
   movwf   ADCON1
   movlw   B"11111000"
   movwf   TRISA
   movlw   B"00000000"
   movwf   TRISB
   movlw   B"11110111"
   movwf   TRISC
   bcf   STATUS,RP0
   bcf   STATUS,RP1

   bcf   OUT_RS

   movlw   .15
   movwf   CONTADOR2
HJK
   call   RUTINA1
   decfsz   CONTADOR2,F
   goto   HJK

   movlw   B"00110000"
   call   INI
   call   INI
   call   INI
   movlw   B"00111000"
   call   INI

   movlw   B"00000001"
   call   INST
   movlw   B"00001100"
   call   INST
   movlw   B"00000110"
   call   INST


   movlw   B"00000001"
   call   INST
   movlw   H"80"
   call   INST
   movlw   H"48"
   call   DATO
   movlw   H"4F"
   call   DATO
   movlw   H"4C"
   call   DATO
   movlw   H"41"
   call   DATO

   movlw   H"C0"
   call   INST
   movlw   H"48"
   call   DATO
   movlw   H"4F"
   call   DATO
   movlw   H"4C"
   call   DATO
   movlw   H"41"
   call   DATO

FGH
   nop
   goto   FGH


Por supuesto adapta el .asm para el 877 ya que este es para el 870.

El puerto B en este código es el usado para la salida de datos y bus de 8 bits

RA0 = E
RA2 = RS

La línea de RW no es usada.

Debería colocar HOLA al principio de ambas filas.

Luego de que ande como debe puedes reducir la cantidad de líneas de código.

Un saludo

Atte. CARLOS

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado diego_castano00

  • PIC10
  • *
  • Mensajes: 30
RE: problema al mostrar menu en una LCD
« Respuesta #8 en: 27 de Febrero de 2006, 16:26:00 »
Hola coloque tu codigo, funciona de maravilla en la simulacion del PIC SIMULATOR, ahora revise toda mis conexiones a la lcd y estan bien inclusive aisle al gunos contactos (blindado) hacia la LCD y cuando programo el pic con tu programa no funciona la lcd muestra signos de no estar incializada adecuadamente

que vaina con esta LCD no pense que me costara tanto trabajo y canas


chaooooLloricaLloricaLlorica

Desconectado gilmer_e

  • PIC10
  • *
  • Mensajes: 2
RE: problema al mostrar menu en una LCD
« Respuesta #9 en: 03 de Marzo de 2006, 16:31:00 »
hola diego, me parece o primero estas incializando el display LCD y posteriormente inicializas al pic??? segun entiendo de tu rutina, si es asi te recuerdo q primero es lo primero, inicializar bien las entradas y salidas del pic, y luego ya puedes inicializar al lcd, sino el lcd te hara cualquier cosa, o te mostrara cualquier cosa, compruebalo.

suerte

gilmer  Flash

Desconectado diego_castano00

  • PIC10
  • *
  • Mensajes: 30
RE: problema al mostrar menu en una LCD
« Respuesta #10 en: 04 de Marzo de 2006, 22:12:00 »
Si ya me habia dado cuenta de que no configure primero los puertos del pic.
ya esta hecho desde hace una semana y continua el error
sera que la LCD se daño o que. denme porfa una guia u horizonte.
he provado con al menos 6 tipos diferentes de rutina y todas funcionan en simulaacion.

PERO cuando programo e pic y lo implemnto sigue fallando (queda la primera fila de la LCD sombreada) y o hace nada.


chaoooHeladoHeladoHeladoHelado

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: problema al mostrar menu en una LCD
« Respuesta #11 en: 05 de Marzo de 2006, 10:00:00 »
Escrito originalmente por diego_castano00
Si ya me habia dado cuenta de que no configure primero los puertos del pic.
ya esta hecho desde hace una semana y continua el error
sera que la LCD se daño o que. denme porfa una guia u horizonte.
he provado con al menos 6 tipos diferentes de rutina y todas funcionan en simulaacion.

PERO cuando programo e pic y lo implemnto sigue fallando (queda la primera fila de la LCD sombreada) y o hace nada.


chaoooHeladoHeladoHeladoHelado


Esto suele pasar cuando inicializas mal el LCD, bien por que los comandos no son los adecuados o bien porque no has esperado los tiempos suficientes.

En mi caso suelo esperar unos cuantos cientos de milisegundos despues de iniciado el PIC para recien comunicarme con el LCD.  Esto es poruqe los lcd, tienen un hardware de reseteo propio el cual tarda un buen tiempo en ejecutarse.  Yo tenia esos problemas hasta que aumenté el tiempo de espera al inicio del software antes de mandarle "algo" al display.

Configura tus puertos, espera unos 200mseg o mas, y luego configura tu lcd.  En ocasiones también envio la señal los comandos de reset por software, los cuales el fabricante gralmente los "sugiere" si es que no se autoresetea bien el LCD.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)