Problemas con Display LCD en CCS

Ahí está el esquema de mi circuito con el LCD conectado... . Leí todos los temas y hasta ahora no tengo solución con lo del LCD... el PIC manda las señales pero no aparece nada en la pantalla... cuando lo simulo en el proteus todo sale normal
 

Adjuntos

  • 16f887.rar
    14.9 KB · Visitas: 27
Leí todos los temas y hasta ahora no tengo solución con lo del LCD.
El PIC manda las señales pero no aparece nada en la pantalla
Saludos.
Prueba con este sencillo programa y nos comentas.

Suerte.
 

Adjuntos

  • 16F887 LCD16x2.rar
    33.7 KB · Visitas: 78
Última edición:
Hola compañeros!
Bueno hace algun tiempo comencé un proyecto de una fuente de poder, de doble polaridad, controlada por un F877A a 20 Mhz,
hasta esa parte todo bien, se puede ajustar el voltaje con un encoder desde +/-1,4 a +/-12 V, y tiene 3 pulsadores para 3 voltajes
fijos (3,3V, 5V y 12 V).
El control del encoder lo hace con la interrupcion por cambio externa en rb0, y el seteo de los voltajes con la interrupcion de cambio de estado
de los pines rb4 al rb7. Hasta ahi todo bien...
PEro a la hora de conectarle el lcd 16x2 HITACHI, no lo inicializa, si llevo el contraste a GND, se ven las 2 lineas negras, y si lo vario, se apaga una y queda la otra en negro, hasta que queda en blanco.
He sido bastante metodico, y la ultima prueba que hice fue sacarle todas las interrupciones y aun asi no funciona...:(
Ah! en el proteus me funciona de maravillas!
Adjunto el codigo:

Código:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_portd.c>
#ZERO_RAM
//#byte porta = 0x05        // Asignamos PortA (No lo usamos).
#byte portb = 0x06        // Asignamos PortB (Usamos RB0 y RB1).
//#byte portc = 0x07        // Asignamos PortC (8 salidas a LED).
// ------ Variable Global ------
long   x=1;               //Declaramos el valor de X 10 bits
// x=88d-->5[V]
// x=48d-->3,3[V]
// x=255-->12 [V]
// ---------- Interrupción ----------
#INT_EXT 
void IntRB0() 
{
     if (bit_test(portb,0))       // Si RB0 se ha puesto a 1 (flanco de subida),
     {  
         ext_int_edge(H_TO_L);    // entonces activar la siguiente interrupción por flanco de bajada.
         if (bit_test(portb,1))   // Si RB1 está 1,
         {
            x++;                  // entonces incrementar el contador X.
            if((x==0xFF)){
            x=0xFE;
            }
         }
     }
     else                         // Si RB0 se ha puesto a 0 (flanco de bajada),
     {  
         ext_int_edge(L_TO_H);    // entonces activar la siguiente interrupción por flanco de subida.
         if (bit_test(portb,1))   // Si RB1 está 1,
         {
            x--;                  // entonces decrementar el contador X.
            if((x==0)){
            x=1;
            }
         }
     }
}
//Interrupcion por cambio de estado en puerto B.
/*#int_RB 
void RB_isr(void) //función de interrupción 
{ 
   if(bit_test(portb,4)) x=88;
   if(bit_test(portb,5)) x=48;
   if(bit_test(portb,6)) x=255;
} */
// ---------- Programa Principial ----------
void main()
{
   port_b_pullups(FALSE);
   setup_adc_ports(NO_ANALOGS);        //activar para leer voltaje.
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_1,63,1);       //segun tabla 78 khz @ 8 bits
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_ccp1(CCP_PWM);
   lcd_init(); 
   //---- Fin de la configuración del 16F876A ----
   
   enable_interrupts(int_ext);    //Activar Interrupcion Externa. 
   ext_int_edge(L_TO_H);          //Inicialmente Interrupción por Flaco de Subida. 
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);     //Interrupciones Generales Activadas. 


   While (true)
   {

   lcd_gotoxy(1,1);
   set_pwm1_duty(x);             //x= 0 a 255 -->0 a 100%.
   printf(lcd_putc,"hola");
   }       
}

Muchas Gracias!!
 
Estuve revisando los delay de la libreria, pensando en que al cambiar cristal de 20 Mhz, lo estaba afectando.
Me parecio logico que a 4 MHz, la linea
Código:
delay_cycles(1)
era de 1 us, en cambio a 20 Mhz, este retardo seria
de 0,2 us, por lo tanto lo cambié por
Código:
delay_cycles(5)
Resultado: NADA...
Cuando estaba a punto de volver a cambiar el codigo (y prenderle fuego al protoboard), recordé que entre todas las cosas que iba
probando, le habia puesto unos capacitores del cristal de 4 Mhz de 0,22 pF, se los quité y voilá! ahi comenzó a funcar!!
Le volví a poner el retardo de 1 ciclo, para ver si le habia ayudado en algo, y fue lo mismo...
Ahi dejo un videito para que vean como va el proyecto:

http://www.youtube.com/embed/IQbxlDka7e0
 
Última edición:
Estuve revisando los delay de la libreria, pensando en que al cambiar cristal de 20 Mhz, lo estaba afectando.
Me parecio logico que a 4 MHz, la linea
Código:
delay_cycles(1)
era de 1 us, en cambio a 20 Mhz, este retardo seria
de 0,2 us, por lo tanto lo cambié por
Código:
delay_cycles(5)
Resultado: NADA...
Cuando estaba a punto de volver a cambiar el codigo (y prenderle fuego al protoboard), recordé que entre todas las cosas que iba
probando, le habia puesto unos capacitores del cristal de 4 Mhz de 0,22 pF, se los quité y voilá! ahi comenzó a funcar!!
Le volví a poner el retardo de 1 ciclo, para ver si le habia ayudado en algo, y fue lo mismo...
Ahi dejo un videito para que vean como va el proyecto:

http://www.youtube.com/embed/IQbxlDka7e0



Hola, al parecer tienes un problema de ruido, en el video que muestras no se distingue bien el armado del circuito, te sugiero colocar capacitores de 33pf para tu cristal y tambien colocar capacitores de desacoplo de valor 0.1uf en el pic
 
Hola!
Es primera vez que pregunto. Mi circuito es para un lavarropas, hecho con PIC 16F877A con un xtal de 4Mhz, con capacitores de 22pF, tal como dice el manual.
La aplicación está hecha con el C de CCS y al menos en el PROTEUS funciona perfecto. Tiene un display WinStar 1602 del azul, de 2 líneas 16 caracteres. Aquí el problema.

No escribe bien los mensajes que escribí y además agrega o cambia caracteres diferentes. Pareciera errático y aleatorio pero, muestra casi siempre lo mismo. No pude tomarle fotos, pero, creo que me entenderán..

Alguien sabe si es el display que funciona mal o es el ruido eléctrico. En el último caso, dónde filtro la señal para las patillas del display?

1024 dijo antes: "Hola, al parecer tienes un problema de ruido, en el video que muestras no se distingue bien el armado del circuito, te sugiero colocar capacitores de 33pf para tu cristal y tambien colocar capacitores de desacoplo de valor 0.1uf en el pic"

Creo que mi problema también reside en el ruido eléctrico, dónde hay que colocar el "capacitor de desacoplo"? Y en el mensaje anterior también menciona que "sacó los capacitores del cristal", voy a probar sacarlos, pero creo que así no va a funcionar...

Gracias
 
Última edición:
Desconecté los capacitores de 22nF del cristal y todo sigue igual. El sector de rutina:
Código:
void MostrarPrograma(int programa){
   lcd_gotoxy(1,2);
   if (programa==1)
         printf(lcd_putc, "%u-Ropa algodon  ",programa); // El string debe ser tan largo como el mas largo de todos.
   if (programa==2)
         printf(lcd_putc, "%u-Ropa delicada ",programa);
   if (programa==3)
         printf(lcd_putc, "%u-Ropa muy sucia",programa);
   if (programa==4)
         printf(lcd_putc, "%u-Modo agresivo ",programa);
   if (programa==5)
         printf(lcd_putc, "%u-Desagote      ",programa);
   if (programa==6)
         printf(lcd_putc, "%u-Centrifugado  ",programa);
//   if (programa==7)
//         printf(lcd_putc, "%u-[CONFIGURAR]  ",programa);
   generate_tone(800, 100);
   while (input(BUT_IZQ)==0 || input(BUT_DER)==0) restart_wdt();
}

 //#org 0x800  // Se coloca en el segundo segmento porq no entra en el primer segmento
          // y ademas usando la directiva #separate hace q cuando se llame a la directiva rtos_terminate()
          // el programa salta a cualquier posicion de memoria q no tiene nada q ver... No se porq es.
#SEPARATE
void menu(){
   int programa=1;
   int i;
   ldiv_t time; // Para cargar la funcion de espera
   short prelavado=0;
   int temperatura=0;

   lcd_gotoxy(1,1);
   printf(lcd_putc, "*Menu Programas*");
   MostrarPrograma(programa);
   while (input(BUT_MID)==1){

         if( input(BUT_IZQ)==0 && input(BUT_DER)==1){ // Solo entra si se aprieta un solo boton
            if (programa>1)
               MostrarPrograma(--programa);
            else {
               generate_tone(800, 600);//PITIDO ERROR
            };

El display muestra: * Menÿ programas^k"
y debajo a veces aparece bien la opción de Ropa algodon y otros... Los botones funcionan bien, pero también sucede que el display muestra cuadritos negros en determinados momentos.
Ya cambié los tiempos en la rutina LCD.c como dice en otro post. Ya no se qué hacerle!!!!

Saludos. Gracias
 
Última edición por un moderador:
Buenas tardes, estoy intentando configurar un display FDCC1602P con el controlador SPLC780D, hasta donde pude revisar en las hojas de datos es igual al hitachi, pero no logro hacerlo funcionar, probe con la lcd.c (la nueva) el flex_lcd.c y no anda, sera por el controlador o me estoy comiendo algo.
mis conecciones son

#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
//
#define LCD_RS PIN_A1
#define LCD_RW PIN_A2
#define LCD_E PIN_A0

todos los pines estan conectados y hay un trimpot de 10K conectado a V0, no se que mas hacer, estoy pensando en cambiar el pinout, pero dudo que lo solucione



No me di cuenta de aclarar que
1 - Uso un pic 16f628a
2 - me esta volviendo loco y me estoy quedando sin ideas
3 - tengo el display funcinoando en un RCM2100 (procesador rabbit 2000) pero aun copiando y editando el codigo del rabbit (es dynamic c) no funciona. Sinceramente no se que mas hacer. Gracias
 
Última edición:
Buenas tardes, estoy intentando configurar un display FDCC1602P con el controlador SPLC780D, hasta donde pude revisar en las hojas de datos es igual al hitachi, pero no logro hacerlo funcionar, probe con la lcd.c (la nueva) el flex_lcd.c y no anda, sera por el controlador o me estoy comiendo algo.
Olvidaste adjuntar tu código y el esquema de las conexiones para ver si por ahí está el problema.
Para que realices algunas pruebas con tu pantalla, adjunto dos ejemplos que funcionan.
Con ellos podrás comprobar el funcionamiento de tu pantalla con el PIC16F628A.
En un ejemplo se uso la librería LCD.C de CCS, y en el otro la librería Flex_LCD416.c.
En ambos utilice la misma disposición de pines para la pantalla,
pero en el ejemplo usando la librería Flex_LCD416.c, la modifique para no usar el pin R/W.

Nota: Utiliza los archivos *.hex incluidos, no recompiles los programas.

Suerte.
 

Adjuntos

  • 16F628A_LCD_16x2_Tests.rar
    31.5 KB · Visitas: 62
  • SCH_LCD16x2_Con_RW.jpg
    SCH_LCD16x2_Con_RW.jpg
    64.2 KB · Visitas: 48
  • SCH_LCD16x2_Sin_RW.jpg
    SCH_LCD16x2_Sin_RW.jpg
    63.6 KB · Visitas: 45
hola a todos soy nuevo y estoy aprendiendo a programar en c con pic y estoy estudiando del libro compilador CCS con proteus para realizar practicas y ver como funcionan los microcontroladores hasta el momento voy bien pero me ha surgido un error en un código que he estado creando para practicar con el lcd y veo que el problema persiste agradecería a los que puedan ver este mensaje para saber cual es mi error para poder corregirlo y seguir aprendiendo sobre este tema tan importante como lo es la programación de pics.
Bueno para empezar el programa se basa de que quiero mostrar por el lcd el abecedario y los números pero para eso debo tengo dos entradas digitales una para indicar que me muestre el abecedario y la otra los números pero tengo un error en el código que no entiendo agradezco su colaboración este es el código.
Código:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <16f877a.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use  fast_io (A)
#use  fast_io (B)

#include <lcd.c>               // libreria lcd//
#define use_portb_lcd==TRUE   //defino puerto b para usarlo//


 
 char  abecedario [26]={'a','b','c','d','e','f','g','h','i','j',
                              'k','l','m','n','o','p','q','r','s',
                              't','u','v',"'w','x','y','z'};
 int  numeros[10]=          {0,1,2,3,4,5,6,7,8,9};                 


void main()
{
     set_tris_a(0x3);
     int x,y;
     lcd_init();
     lcd_putc('\f');// borrar lcd
   
   while(true)
   {
        x,y=0;
    if  (input(pin_A0))     //cuando pulso esta entrada veo el abc en el lcd//
       {
        for(x;x<26;x++)
                      { 
        lcd_gotoxy(1,1);
        printf(lcd_putc,"car=%c,abecedario");
        delay_ms(300);
        
        abecedario[x];
        delay_ms(300);
        lcd_putc('\f');// borrar lcd
                      }
       }
    if  (input(pin_A1))    // muestra los numeros al pulsar la entrada//
       {
        for(y;y<10;x++)
                      {
                
        printf(lcd_putc," Num=%u",numeros);
        lcd_gotoxy(1,1);
        delay_ms(300);
        
        numeros[y];
        delay_ms(300);
        lcd_putc('\f);// borrar lcd
                      }
       }  
       

   }

}
////////////////////////////////////////////////////////////////////////////////////////////////////////
 
Última edición por un moderador:
Prueba así, y ve en donde tenias los errores...
Código:
#include <16f877a.h>
#fuses NOBROWNOUT
#use delay(crystal=4MHz)

#include <lcd.c>               // libreria lcd
// #define use_portb_lcd=TRUE   // Ésto se define en la librería lcd.c
// Por default para el PIC16F877A se usará el puerto D


char abecedario [26] = {'a','b','c','d','e','f','g','h','i','j','k',
                        'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
                              
int  numeros[10] = {0,1,2,3,4,5,6,7,8,9};              


void main()
{
   setup_adc_ports(NO_ANALOGS);
   lcd_init();
   lcd_putc("\fCaracter = a\nNumero = 0");   // escribir en la dos líneas del LCD
   
   int x,y=0;
   
   while(true)
   {
   if(input(pin_a0))      // cuando pulso esta entrada veo el abc en el lcd
    {
      for(x=0;x<=25;x++)
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Caracter = %c",abecedario[x]);
         delay_ms(300);
      }
    }
   if(input(pin_A1))    // muestra los numeros al pulsar la entrada
   {
      for(y=0;y<=9;y++)
      {      
         printf(lcd_putc,"\nNumero = %u",numeros[y]);
         delay_ms(300); 
      }
   }
 }
}
Adjunto la simulación.

Suerte.
 

Adjuntos

  • 16F877A ABCD_NUM LCD 16x2.rar
    29.9 KB · Visitas: 19
gracias por corregir mis errores sere mas cuidadoso y seguire estudiando mas para poder subir de nivel pero tengo ciertas dudas con esto porque quitaste el set_tris el cual indicaba quienes eran entradas y al colocar
setup_adc_ports(NO_ANALOGS); es para indicar que? gracias por tu ayuda D@rkbytes.
 
tengo ciertas dudas con esto porque quitaste el set_tris
el cual indicaba quienes eran entradas
Porque no vas a utilizar ningún pin como salida en el puerto A
Y conforme a lo que muchos piensan, que los pines que no se usan hay que dejarlos como salida...
Existe mucha controversia y mala información al respecto.
Los pines que no se usan simplemente no pasan a formar parte del programa.
Por lo tanto no alteran el funcionamiento del programa ni generan oscilaciones como muchos creen.
Cuando un puerto no es configurado con la instrucción TRISX todo el puerto son entradas.
En lo personal los pines que no voy a usar los dejo como entradas solo por motivos de seguridad.
Pero cada quien sus gustos, y si te pones a buscar verás opiniones de todos colores y sabores. ;)
y al colocar setup_adc_ports(NO_ANALOGS); es para indicar que?
El puerto A y el puerto E del PIC16F877A tienen conversores AD, y éstos por default están activos.
Si vas a realizar comparaciones de estado (0 y 1) para el uso de pulsadores como en este caso,
la instrucción setup_adc_ports(NO_ANALOGS) los convierte en puertos con entradas de lógica digital.
Es importante tener en cuenta este detalle, ya que muchos olvidan establecer la configuración del ADC,
y obtienen resultados inesperados en sus programas. :cool:

Saludos.
 
Hola, quiera que me ayuder porque tengo un problema al simular en el proteus el 16f887 con lcd, la lcd no muestra ningun dato, pues arme el cicuito en protoboard y si me me hace lo que le programe, mi duda es el porque no me lo simula el proteus, aqui les dejo el programa y el circuito
 

Adjuntos

  • lcd.txt
    742 bytes · Visitas: 17
  • Captura.PNG
    Captura.PNG
    26.6 KB · Visitas: 18
Hola, quiera que me ayuder porque tengo un problema al simular en el proteus el 16f887 con lcd, la lcd no muestra ningun dato, pues arme el cicuito en protoboard y si me me hace lo que le programe, mi duda es el porque no me lo simula el proteus, aqui les dejo el programa y el circuito
Con algunas modificaciones a tu programa, prueba ahora así...
Código:
#include <16f887.h>     
#fuses NOWDT,NOMCLR,NOLVP
#use delay(internal = 8MHz) 
#include <lcd.c>             

unsigned int dato1=0;

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_oscillator(OSC_8MHZ|OSC_STATE_STABLE);
   lcd_init();
  
  while (true)
     {
   while (input(pin_a0)){
         lcd_putc("\fPRESIONE TECLA");
         printf(lcd_putc,"\nDATO=%d",dato1);
   while (input(pin_a0));
   }
   
   while (!input(pin_a0)){
      dato1++;
      lcd_putc("\fPULSADOR EN 0");
      printf(lcd_putc,"\nDATO=%d",dato1);
   while (!input(pin_a0));
   }
  }
}
Nota que también se estableció el oscilador interno a 8MHz, y se configuraron los puertos como digitales.

Suerte.
 
Última edición:
mm perdon crei que no se habia subido mi pregunta jaja, gracias por responder.Pues utilize esas modificaciones que hiciste y me sigue fallando, de hecho ese programa que escribí es de un libro y pues en el libro hay imágenes que asi funciona, que raro que en mi proteus no funcione :s
 
Pues utilize esas modificaciones que hiciste y me sigue fallando, de hecho ese programa que escribí es de un libro y pues en el libro hay imágenes que asi funciona, que raro que en mi proteus no funcione :s
De seguro el código que usaste, es para otro PIC, pues no tenía las instrucciones para un 16F887.
Pero ahora ya las tiene, y si es cuestión de la configuración de tu diseño,
adjunto las simulaciones para proteus v7.10 y v8.0 funcionando.
Si no te funciona, entonces tienes un problema con la instalación de tu programa.

PD:
Si no puedes abrir los archivos, me avisas para cambiarlo de versión a la v7.0

Suerte.
 

Adjuntos

  • 16F887 LCD16x2.rar
    38.4 KB · Visitas: 16
Última edición:
Atrás
Arriba