Problema Manejo LCD 2x16 con PIC 16F877A

Hola estoy aprendiendo a programar el micro y he tenido muchos problemas para poner a funcionar la pantalla LCD. Hasta ahora solo intento que prenda pero no logro inicializarla.
Mi meta es que el lcd encienda con 2 lineas, matriz 5x7, desplazamiento hacia la derecha, cursor on, y blinking on.
Pero cada vez que lo simulo no logro que encienda aunque sea el cursor.

Adjunto dejo el esquematico del circuito y el ASM, a ver quien puede ayudarme y decirme que es lo que estoy haciendo mal.

Gracias de antemano.
 

Adjuntos

  • esquematico_885.jpg
    esquematico_885.jpg
    31.2 KB · Visitas: 656
  • lcd_640.asm
    3.2 KB · Visitas: 268
en algunas versiones de proteus pasa.
Una solución: Coloca una temporización cuando espera el micro la recepcion de que está listo el LCD. Es decir, cuando chequea el estado de RB7. Prueba con 10ms antes de que empiece el bucle de chequeo de estado de esa entrada.
Saludos
 
Bueno la verdad es que en rb7 no tengo conectado nada. El bototn esta en rb0, pero el problema no es ese, sino que no logor hacer que inicialize la pantalla.

Los 10mS es para el antirebote, pero aun no estoy chequeando el boton
 
Buenas, quería preguntarles acerca del manejo del LCD ITM-1602 (supuestamente compatible con el controlador HD44780). Estoy utilizando el 16F877A y la librería LCD.C del CCS... pero no me está funcionando, aquí les dejo el programita (muy básico) para mostrar algun mensaje... si alguno me puede decir donde está mi error les agradeceríaa


PHP:
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=20000000)

#include <LCD.C>


void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();

   while (1){ 
      lcd_putc("\fMENSAJE\n");
      delay_ms(1000);
   }
}
 
Última edición por un moderador:
Hola JPTZ:

Aunque este post sea un año despues.... lograste resolver el problema? Me esta pasando lo mismo. Revise las conexiones, aparentan estar bien y nada. Abriendo la libreria LCD.C "descomento" la linea que indica al compilador que se usara el Puerto B y la pantalla mas que muerta, ni un destello, nada.

Saludos.

Alejandro
 
Hola avpc79:

Mira lo resolvi, recuerdo q habian algunas cositas como por ej. q estaba usando un cristal de 20M cuando en realidad ese PIC (16F877A) no funciona con ese cristal (el 16F877 si)... asi q le puse uno de 4M...
Te recomiendo también simularlo en Proteus. Si no es lo que te digo avisame y le seguimos buscando la vuelta. Saludos.
 
Hola avpc79:

Mira lo resolvi, recuerdo q habian algunas cositas como por ej. q estaba usando un cristal de 20M cuando en realidad ese PIC (16F877A) no funciona con ese cristal (el 16F877 si)... asi q le puse uno de 4M...
Te recomiendo también simularlo en Proteus. Si no es lo que te digo avisame y le seguimos buscando la vuelta. Saludos.
Solo como dato:
- Los PIC cuyo nombre terminan en "A" son versiones mejoradas.
- En los PIC16... el nombre impreso en el cuerpo del chip indican la frecuencia máxima de trabajo, por ejemplo:
"PIC16F877A - 4" = frecuencia de trabajo hasta 4Mhz.
"PIC16F877A - 20" = frecuencia de trabajo hasta 20Mhz.

saludos
 
Uhmm, bueno yo estoy usando un cristal de 4MHz, igual revisare el nombre completo del PIC para verificar el dato del amigo ByAxel.

De verdad estoy optando por pensar que este dañada la pantalla, tendre que comprar otra para ver. Y por ultimo queria preguntarles: tan solo conectando la alimentacion de la pantalla, nada mas, deberia ver algo? que se ponga un pelo mas oscura la primera linea o algun pequeño indicio de que esta viva la lcd??

Gracias.-
 
Y por ultimo queria preguntarles: tan solo conectando la alimentacion de la pantalla, nada mas, deberia ver algo? que se ponga un pelo mas oscura la primera linea o algun pequeño indicio de que esta viva la lcd??

Se nota que vive si aparece la primera línea; si a la pata 3 del LCD le has puesto un potenciómetro lo debes regular ya que eso controla el contraste en el LCD, tal vez por eso no se vea nada.
saludos.
 
Ok, Gracias, entonces si debe estar dañada por que al alimentarle no pasa absolutamente nada, ni regulando la tension en la pata 3...

Ahora ando peleando con los pic pq se me reinician de forma aleatoria durante su trabajo. Existen metodos estandarizados para proteger al micro de los glitch? Porque lo que he leido por otros foros y paginas web son como recetas de brujeria jejeje.

Saludos.-
 
En el software se debe procurar configurar bien los fuses y que la lógica del programa esté bien echa (si se sabe que en algún proceso se va a quedar parado para eso existe el watchdog jeje).
En hardware como dices (recetas de brujería), se acostumbra filtrar lo mejor posible la alimentación y no lo sometas al pobre a trabajar en un ambiente ruidoso (mucha estática y otras cosas). -El PIC no es industrial, hablando de los 16F o 18F-.

Con respecto al LCD me olvide decirte que si tiene luz, que lo alimentes (pines 15 y 16).

saludos
 
Disculpen que me salga un poco del tema... Pero referente a la configuración del PIC16F877A tengo un problema:

Estoy haciendo un contador de 15 bits con los puertos C y D (de 0 hasta 32767), la simulación en Proteus me funciona muy bien, pero en la realidad el chip se resetea mas o menos cuando está contando hasta 700 (siempre). El cristal estoy usando de 20 MHz.

Cuál podría ser el problema?

Yo lo configuré así: __CONFIG _BODEN_OFF&_CP_OFF&_WRT_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC&_DEBUG_OFF&_CPD_OFF&_LVP_OFF

1. Brown out reset..................... Desactivado
2. Protección de código............... Desactivado
3. Protección de memoria flash...... Desactivado
4. Power up timer....................... Activado
5. Watch dog timer..................... Desactivado
6. Oscilador High speed
7. Depurador en circuito.............. Desactivado
8. Protección de EEPROM interna... Desactivado
9. LVP...................................... Desactivado
 
Cuál podría ser el problema?

Yo lo configuré así: __CONFIG _BODEN_OFF&_CP_OFF&_WRT_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC&_DEBUG_OFF&_CPD_OFF&_LVP_OFF

1. Brown out reset..................... Desactivado
2. Protección de código............... Desactivado
3. Protección de memoria flash...... Desactivado
4. Power up timer....................... Activado
5. Watch dog timer..................... Desactivado
6. Oscilador High speed
7. Depurador en circuito.............. Desactivado
8. Protección de EEPROM interna... Desactivado
9. LVP...................................... Desactivado
Está bien, veo que usas assembler... dices que funciona bien en el proteus entonces se debe al hardware; verifica si hay falsos contactos (cristal, condensadores, resistencia del MCLR, alimentación) o ruidos (como dije antes -el PIC no es industrial-)... ha y como es el circuito? usas LEDs, displays.
Al principio manejar variables de más de 8 bits en asm puede ser confuso, puede que algo en la lógica del programa esté mal.
PD: Pregunta en el tema de asm: ASM desde 0 (ASM desde cero).
 
Hola ByAxel,

Adjunto archivo del circuito que estoy utilizando.
No puse los condensadores en el cristal ya que está armado en protoboard y en un proto nunca necesité poner los condensadores, pero haré la prueba poniédolos.

Estos son las posibles fallas que descarté:

1. Chip en mal estado (cambié de chip y el problema es idéntico)
2. Protoboard en mal estado (cambié de posición el circuito y sigue el problema)
3. Máxima velocidad de trabajo 20MHz (cambié por un cristal de 12MHz, sigue el mismo problema)

Revisé la lógica del programa y me parece que está bien... Qué podrá ser?
gracias y saludos.
 

Adjuntos

  • Contador de 15 bits.pdf
    10.5 KB · Visitas: 119
Que tal, estuve de viaje...
Sobre el problema PIC16F877A, pues los condensadores no debes... "Tienes que poner los condensadores", el PIC no es algo análogo que tiene cosas raras sin saber, todo está probado y tiene un motivo, es por eso que debes de poner el mínimo hardware que sugiere microchip (la empresa)... y si te funcionaba sin condensadores pues tienes problemas de capacitancias parásitas en tu mesa de trabajo.
saludos
 
Ok! Gracias ByAxel, ya solucioné el problema.

Había un detalle que no percibí en el pograma, los capacitores también los incluí.
Espero también que avpc79 haya logrado solucionar su problema con su LCD; yo lamentablemente no trabajé con LCDs, entonces no puedo recomendarle nada...
Saludos.
 
Hola, pues nada con la LCD.... Mañana con paciencia verificare si los espadines estan haciendo buen contacto en la protoboard y con otra libreria que vi por ahi que se llama "flex_lcd.c", segun, hay gente que no pudo con la que trae CCS y con esa flex_lcd han logrado la meta... Cuestion que me molestaria ya que me tome la molestia de estudiar cada linea de la libreria para LCD de CCS y no hay nada del otro mundo salvo que hay que estar pendiente si vas a usar el puerto B o el D (o el que quieras, siempre y cuando sea un puerto de 8 bits.


Me gustaria mostrarles como hice para temporizar 1 segundo "exacto" empleando el TIMER0, no se si lo puedo poner en esta discusion o tendria que ser en otra parte, por favor diganme y les copio el codigo.

Saludos y Gracias!
 
Hola, adjunto esta el codigo de como temporice un segundo "exacto". Coloco exacto entre comillas ya que si tomamos en cuenta el tiempo que demora en ejecutar cada instruccion ya existe un retraso implicito pero si no necesitas una precision suiza funciona perfecto esto. Me gustaria comprobar de alguna manera exacta la frecuencia de ese segundo.

Por si les da lata leer el codigo lo explico aqui rapidito:

1) Inicio el timer con un valor de 6 y preescalador igual a 256, eso me da 64ms por cada interrupcion.

2) cuento 15 interrupciones, ahi van 960ms y ahora cambio el preescalador a 128, le coloco valor de 6 otra vez , asi en una interrupcion añado 32ms, sumando al tiempo anterior irian 992

3) coloco valor de 6 again, preescalador en 256 y asi en una interrupcion mas tengo los 8ms que faltan para completar los 1000ms.


Saludos.-
 

Adjuntos

  • Timer0 - 1000ms.txt
    1,017 bytes · Visitas: 76
Hola, ya logre ver texto en la pantalla LCD, hasta me da pena decirles que estaba haciendo mal... Siempre fue un problema de hardware, el contraste. Yo conectaba el pin #3 de la lcd al potenciometro y el potenciometro a VDD.... tenia que ser a VSS... pues ahi mi logica se tiró tres..

Ahora pregunto yo: No es lo mismo (o muy parecido) conectar el pin de contraste a Vss que conectarlo a VDD con una resistencia de un mega ohm??? O sera que a pesar de que la corriente es poequeña con esa resistencia el sentido de la corriente es lo que no me ayudaba....

En fin, muchas gracias a todos, ByAxel gracias tambien, a la orden aqui en Venezuela.

A ver que dicen del Timer de 1000 ms.

Saludos.-
 
Atrás
Arriba