Problemas con Display LCD en CCS

Hola, llevo semanas intentando mostrar mensajes en una lcd de 16x02.
Me he leido un monton de temas en este foro y otros foros en varios idiomas.
He probado un monton de codigos, algunas librerias.
He revisado el circuito que tengo montado en la protoboard varias veces, tambien he probado con otros microcontroladores.
No consigo hacer que la lcd muestre mensajes en CCS.
He probado en MikroC hoy mismo y me ha funcionado a la primera.
Pero mi intención es usar CCS de Pic C Compiler.
He probado muchos fuses, tantos que me parece que muchos no son necesarios para lo que tengo que hacer.
Mi codigo es lo mas basico que pueda haber, no se en que estoy fallando.
Código:
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,NOPUT,NOCPD,NODEBUG 
#use delay(crystal = 20Mhz)


#include <flex_lcd.c>
#use fast_io(D)
#use fast_io(c)
#use fast_io(b)

void main(){
 set_tris_c(0b00000000);
  set_tris_b(0b00000000);
  lcd_init();                                 // Inicializa el lcd
  
  
  lcd_putc('\f');                            // Borra el lcd
   
  while(TRUE){
  
delay_ms(100);
   
   
        lcd_gotoxy(6, 1);                     // Va a la columna 5, fila 1
        
   printf(lcd_putc,"Hola");
     
  }
  }

En MikroC a la primera funcionando, en CCs no encuentro manera y llevo semanas haciendo pruebas.
El pic, cristal, condensadores estan bien, lo se porque funciona haciendo parpadear leds y funciona el programa en Mikroc.
 
No probaste usar la librería de CCS en vez de esa que dice flex_lcd? La de CCS programas los pines de Datos, RW, RS y E y funciona yo los hice funcionar.

 
aver intenta asi:

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,NOPUT,NOCPD,NODEBUG
#use delay(crystal = 20Mhz)
#include <flex_lcd.c>

void main(){
lcd_init(); // Inicializa el lcd


lcd_putc('\f'); // Borra el lcd


lcd_gotoxy(1, 1);
printf(lcd_putc,"Hola");

while(TRUE){





}
}
 
Las conexiones se ven en el siguiente esquema. Lo he configurado en el archivo flex_lcd.c
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
//
#define LCD_RS PIN_B1
#define LCD_RW PIN_B2
#define LCD_E PIN_B3

He probado la libreria lcd.c, flex_lcd y otras que he encontrado.
Uso la version 5.015


aver intenta asi:

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,NOPUT,NOCPD,NODEBUG
#use delay(crystal = 20Mhz)
#include <flex_lcd.c>

void main(){
lcd_init(); // Inicializa el lcd


lcd_putc('\f'); // Borra el lcd


lcd_gotoxy(1, 1);
printf(lcd_putc,"Hola");

while(TRUE){





}
}

Lo que me sale en el código de arriba es lo que se ve en la foto de abajo.
Uso una lcd keypad shield Df Robot.
No se si habra que modificar algo más en la libreria flex_lcd para que funcione esta lcd.
Con el codigo de arriba tambien he probado a ponerle una pausa, pero el resultado en igualmente no positivo.
Seré uno de los pocos que no son capaces de hacer funcionar una simple lcd!!!
He puesto una foto del circuito.
 

Adjuntos

  • esquema lcd 16f877a.jpg
    esquema lcd 16f877a.jpg
    115 KB · Visitas: 18
  • P_20170225_061551.png
    P_20170225_061551.png
    113.6 KB · Visitas: 13
  • lcd2.jpg
    lcd2.jpg
    92.9 KB · Visitas: 15
Última edición:
A mi no me gusta usar la librería flex_lcd, siempre he usado las que vienen con el compilador y si requiero una función especial, edito la librería.

Pero usando la librería por defecto, (lcd.c) sale andando a la primera, mira:
Dsc01983.jpg

A éstas horas del cumpleaños ya no hace falta preguntar de qué sabor es el pastel. :cool:
 
ami no me gusta la libreria de CCS hise la mia :p


bueno veo que usas un crsital por que no intentas usar el oscilador interno y quitas el master reset y vez que pasa intentalo asi:

#include <16F877A.h>

#fuses INTRC_IO,NOWDT,NOMCLR
#Use delay (clock=8M)

#include <flex_lcd.c>

void main(){
lcd_init(); // Inicializa el lcd


lcd_putc('\f'); // Borra el lcd


lcd_gotoxy(1, 1);
printf(lcd_putc,"Hola");

while(TRUE)
{
}

}

ahora omite el boton reset y omite el cristal en la simulacion configuralo a 8Mhz aver que sucede
 
ami no me gusta la libreria de CCS hise la mia :p


bueno veo que usas un crsital por que no intentas usar el oscilador interno y quitas el master reset y vez que pasa intentalo asi:



ahora omite el boton reset y omite el cristal en la simulacion configuralo a 8Mhz aver que sucede

Me parece que el 16f877a no tiene oscilador interno.
Me da error el Pic C Compiler si le pongo el fuse NOMCLR.
D@rkbytes, que microcontrolador usas en la imagen, veo que no usas condensadores, los lleva internos el cristal?
Puedes poner el código que has usado?
 
Última edición:
Me parece que el 16f877a no tiene oscilador interno.
Así es, el PIC16F877A no tiene oscilador interno.
Me da error el Pic C Compiler si le pongo el fuse NOMCLR.
Eso es normal, porque en el PIC16F877A el pin de reset no puede ser usado como entrada.
Es únicamente reset.
Y tampoco es necesario configurar todos los fuses.
Al usar: #use delay (crystal = x frecuencia) automáticamente se establecen los fuses requeridos, que en los casos básicos son los adecuados.
Y ésto también lo hace el compilador con varios registros para garantizar una inicialización estándar.
D@rkbytes, ¿Qué microcontrolador usas en la imagen?
Es un PIC16F877A
Y aunque en la imagen no se alcanzó a ver la resistencia del pin 1, MCLR, hacia VCC, si la tiene. (4.7 KΩ)
Veo que no usas condensadores. ¿Los lleva internos el cristal?
Posiblemente, pero no lo creo. La capacitancia parásita del protoboard, los hace innecesarios.
Es raro que los ponga en el protoboard, a menos que requiera ajustar la frecuencia a un valor exacto.
¿Puedes poner el código que has usado?
Claro. Adjunto programa y esquema.
Aunque casi estoy seguro que ya lo he publicado, posiblemente dentro de éste mismo tema, o en algún otro similar.
También se incluye la simulación en proteus 7.10 y 8.5 SP1 (No necesarias)

Notas importantes:
No compilar, usar el archivo hex incluido.
Conectar como se muestra en el esquema y probar. (Debe funcionar correctamente)
Después compilar, volver a grabar el PIC y probar, para determinar problemas del compilador.
 

Adjuntos

  • 16F877A LCD 16x2.rar
    142.6 KB · Visitas: 12
Última edición:
:confused:
No me funciona. :eek:
No muestra nada la pantalla.
Voy a probar en MikroC, a configurar la lcd para funcionar en el puerto D, para comprobar si funciona.
Revisa bien tus conexiones. Algunos protoboard muchas veces suelen tener falsos contactos.
Como la configuración de pines es diferente debido a cada librería, prueba usando la misma disposición de pines en tus pruebas.
Ya que puede ser que algunas líneas del protoboard estén dañadas.
Verifica la continuidad de las líneas, cambia todo de lugar y prueba nuevamente, o usa otro protoboard.
 
Ya he comprobado la continuidad, acaba ahora mismo de probar en MikroC un programa usando los mismos pines del puerto D y si que funciona en MikroC.:unsure:

En el programa en MikroC, no se declara el pin RW, sin embargo funciona.:unsure:

Código:
sbit LCD_RS at RD1_bit;
sbit LCD_EN at RD0_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD1_bit;
sbit LCD_EN_Direction at TRISD0_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// Fin de declaración de variables de conexión.

char contador=0,estado=1,texto1[]="Hola", texto2[4];

void main(){



Lcd_Init();                //Inicializa el LCD.
Lcd_Cmd(_LCD_CLEAR);       //Borra el display.
Lcd_Cmd(_LCD_CURSOR_OFF);  //Apaga el cursor.
Lcd_Out(1,6,texto1);       //Escribe el texto1.

{
 if (Button(&PORTA,4,1,0)) estado=0;    //Si se pulsa.
 if (estado==0 && Button(&PORTA,4,1,1)) //Si se pulsa y se libera.
 {
  contador++;  //"contador" contiene el número de pulsaciones.
  if (contador>100) contador=0;
  estado=1;
 }
 ByteToStr(contador,texto2); //Convierte a texto el contenido de la variable contador
                             //y lo guarda en texto2.
 Lcd_Out(2,6,"MikroC");        //Muestra el texto2.
}
}

¿Hago lo mismo en CCs?
¿Dejo sin declarar RW?
¿Lo conecto a masa, como he visto que algunos hacen?

Edito:
He configurado el pin RW y también funciona.
Me esta seduciendo mucho la idea de pasarme a MikroC y enviar a la m.... CCS
 
Última edición:
No se si viene al caso, pero alguna vez tuve un problema similar cuando utilizaba un crystal de 20 mhz(salia caracteres raros en el lcd), prueba con uno de 4 mhz.
PD: Nunca supe del porque funcionaba con el de 4mhz y no con el 20 mhz (solo soy un hobbista :D :D).
 
No se si viene al caso, pero alguna vez tuve un problema similar cuando utilizaba un crystal de 20 mhz(salia caracteres raros en el lcd), prueba con uno de 4 mhz.
PD: Nunca supe del porque funcionaba con el de 4mhz y no con el 20 mhz (solo soy un hobbista :D :D).

He probado con cristal de 4,8,12 y 20 Mhz. Las ultimas pruebas con cristal de 4 Mhz.
El ultimo codigo que he probado debería de funcionar, pero no me funciona. No se si hay que modificar algo en la libreria lcd.c para que funcione con mi lcd.

Código:
/*******************************************************************************
* Programa: LCD16x2 Test.c
* Versión: 1.0
* Autor: D@rkbytes
* Compañia: Digitek
* Notas: 
* Prueba simple de un LCD 16x2
*******************************************************************************/
#include <16F877A.H>
#use     delay(crystal = 4 MHz)

#define LCD_DB4 PIN_D4
#define LCD_DB5 PIN_D5
#define LCD_DB6 PIN_D6
#define LCD_DB7 PIN_D7
//
#define LCD_RS PIN_D1
#define LCD_RW PIN_D2
#define LCD_E PIN_D0
 #define LCD_DATA_PORT getenv("SFR:PORTD")  
#include <lcd.c>

void main (void)
{
   lcd_init();                   // Inicializar la pantalla.
   lcd_putc("\fHola Mundo");     // Escribe en la primer línea.
   lcd_putc("\nHello World");    // Escribe en la segunda línea.
   
   while (true);
}

He revisado muchas veces la continuidad en el circuito. No se me ocurre que más puedo hacer, no quiero rendirme, no se que estoy haciendo mal y quiero descubrirlo.
Debe de haber más gente que haya tenido el mismo problema que yo y haya dado con la solución.
 
Pregunta básica son con el procesador ese Hitachi no el LCD no tiene otro no?



Pregunta básica son con el procesador ese Hitachi no el LCD no tiene otro no? Osea el HD44780 digo! Porque hay otros





Pregunta básica son con el procesador ese Hitachi no el LCD no tiene otro no? Osea el HD44780 digo! Porque hay otros.
 
Pregunta básica son con el procesador ese Hitachi no el LCD no tiene otro no? Osea el HD44780 digo! Porque hay otros

He buscado informacion sobre mi pantalla y usa el HD44780.
Es una Lcd keypad shield Df Robot, la he conseguido hacer funcionar en arduino y MikroC.
Tanto en arduino como con MikroC, funcionando a la primera.
¿Hay "otras" librerias de confianza para probar con esta lcd?
He desinstalado el pic c compiler para reinstalar las librerias por si habia algo mal pero nada, sigue todo igual de mal.
 
Última edición:
Atrás
Arriba