Problemas con Display LCD en CCS

cuando quiero hacer un contador de cada un segundo con lcd se demora y hasta también cuando quiero parpadear un led se demora como 3s en vez que sea 1s.:confused::confused:
Sip, por eso te mencioné lo de la palabra de configuración.
Te daré estas para que pruebes, son para subir a 48MHz.:

// Con cristal de 4MHz.
#include <18f2550.h>
#fuses xtpll,cpudiv1,pll1,nobrownout,nopbaden,nolvp
#use delay(clock = 48MHz)

// Con cristal de 8MHz.
#include <18f2550.h>
#fuses hspll,cpudiv1,pll2,nopbaden,nolvp,nofcmen,noieso
#use delay(clock = 48MHz)

// Con cristal de 12MHz.
#include <18f2550.h>
#fuses hspll,cpudiv1,pll3,nobrownout,nopbaden,nolvp
#use delay(clock = 48MHz)

// Con cristal de 16MHz.
#include <18f2550.h>
#fuses hspll,cpudiv1,pll4,nobrownout,nopbaden,nolvp
#use delay(clock = 48MHz)

// Con cristal de 20MHz.
#include <18f2550.h>
#fuses hspll,cpudiv1,pll5,nobrownout,nopbaden,nolvp
#use delay(clock = 48MHz)

Eso que te pasa es normal, pues al estar mal la palabra de configuración y estar activo el fuse FCMEN y el fuse IESO, entra automáticamente en funcionamiento el oscilador interno.
Entonces el PIC funciona, pero a la frecuencia que tome OSCCON en el Power On Reset.

Suerte.
 
Última edición:
Ahora si ya está bien, el led parpadea el tiempo debido y hasta la pantalla lcd anda normal :)(en simulación no es así ,no se por que? , ya no le di mucha importancia ) entonces los fusibles de configuración era el problemas, bueno muchas gracias:apreton: .

---------- Actualizado después de 3 horas ----------


Se me presentó otro problema que recién me he dado cuenta y ni tengo idea por que pasa.
Bueno, como comenté el led parpadea normal, osea el tiempo que le doy, pero ese es solo cuando está alimentado con el programador, o sea de la alimentación de la pc, pero cuando le pongo una fuente DC a 5v, el led se queda prendido nada más y no parpadea nada (a veces hace que el tiempo se demore más).
 
Última edición por un moderador:
Lo de la simulación en proteus, es porque al microcontrolador se le pone una frecuencia y a esa corre.
Si la configuración en el programa es para trabajar a 48MHz y en el simulador se ponen 4MHz, si se notan cambios.
En la pantalla LCD las letras aparecen con una secuencia lenta, pero aparecen y los tiempos serán más lentos.

Sobre lo de la alimentación por el puerto USB, debería funcionar de la misma forma que con fuente externa.
Revisa el voltaje del pin 20 VDD (+5V) y que el pin 8 y el 19 estén conectados a VSS (GND).
No se me ocurre otra cosa por la cual funcione de diferente forma.
 
Hola gente realice un programa con PIC C Compiler, el cual simulado en proteus funciona de maravillas, pero cuando lo arme en una placa no funciona el LCD, lo simule con otro programa (PIC Simulador IDE) y descubri que si pongo el LCD en modo de 4 bits activo alto funciona, por lo que mi LCD debe ser activo bajo, como hago en PIC C Compiler para hacer que los datos por el puerto B sean activos bajo?. Desde ya muchas gracias.
Código:
#include <16F88.h> // Declaro el microcontrolador que voy a utilizar
#device ADC=10
#fuses intRC_io,nowdt,nobrownout,noprotect,noput,nolvp,nomclr // Declaro la palabra de configuración del microcontrolador: 
                                                              // Osc. Interno, NoWatchDog, NoBrownOut, NoProtect, NoPowerUpTime, 
                                                              // NoLowVoltageProgramming, NoMasterClear
#use delay(int=4000000)
#include <lcd.c> // Incluyo la libreria LCD para manejar la pantalla
#define use_portB_lcd TRUE // Defino el puerto B para utilizar el LCD
#use fast_io(a) // Optimiza el código que genera para programar los puertos
#byte ADCON0 = 0x1F // Declaro el registro ADCON0
#byte ADCON1 = 0x9F // Declaro el registro ADCON1
#byte ADRESH = 0x1E // Declaro el registro ADRESH
#byte ADRESL = 0x9E // Declaro el registro ADRESL

// Variables

float Conversion,Distancia, ValMin = 0;

void Inicializacion(void)
{
   setup_adc_ports(sAN0|vss_vdd);
   setup_adc(adc_clock_internal);
   set_tris_a(0b10000001); // Como entrada A0 y el resto como salidas
   //set_tris_b(0b00000000); // Todo el puerto como salidas
   //ADCON1 = 0b10000000;
   //ADCON0 = 0b11000001;
   
}

void main()
{
   delay_ms(100); // Delay de 100 mseg
   Inicializacion(); // Inicializo el microcontrolador
   lcd_init(); // Inicializo el LCD
   delay_ms(50); // Delay de 50 mseg.
   printf(lcd_putc, "\f - SIMULICAR - ");
   printf(lcd_putc, "\nMEDIDOR CALIBUR");
   delay_ms(2000);
   set_adc_channel(0);
   for(;;)
   {
   Conversion = read_adc();
   Distancia = (5*Conversion)/1023;
   if (ValMin<Distancia)
   {
      ValMin = Distancia;
   }
   lcd_gotoxy(1,1);
   printf(lcd_putc, "VA ACT = %fcm", Distancia);
   lcd_gotoxy(1,0);
   printf(lcd_putc, "VA MIN = %fcm", ValMin);
   if ((input(PIN_A7)==TRUE))
   {
      if (Distancia==0.00)
      {
         ValMin = 0;
      }
   }
   }
}
--------------------------------Actualización-------------------------------
Ya resolvi el problema y creo que esto puede ser una ayuda para otras personas a las que le haya pasado lo mismo que a mi. El problema estaba en que la pata R/W de mi LCD yo la había puesto a masa ya que pensaba que solo realizaría escrituras, pero me di cuenta que las rutinas no solo escriben, si no que además luego leen lo que escriben ya que por un instante los pines que estaban puestos como salida se hacen entradas y luego se vuelven a hacer salidas. En mi caso tambien descubrí que el micro se colgaba, eso era seguramente porque intentaría leer lo que escribió para hacer algun tipo de comparación. Simplemente con mandar la pata R/W del LCD al pin RB2 del micro el LCD salió andando sin problemas. Este problema no se manifiesta en el simulador, que es quizas lo que le pudo haber pasado a varias personas. saludos.
 
Última edición:
buen dia ojala alguien puediara apoyarme con mi proyecto, tengo un problema uno o varios problemas, este proyecto me iva bien con el 16f877a pero se me termino la memoria, y me vi en la necesidad de migrarlo a un pic18f4550. pero no logro hacerlo arrancar, siempre he tenido problemas con la lcd20x4, aqui en este foro me la pasaron y es la que anexo en el proyecto. quiero suponer que las frecuencias son las que me estan mantando.
 

Adjuntos

  • proyecto.rar
    84.5 KB · Visitas: 31
Quiero suponer que las frecuencias son las que me estan mantando.
Sip, porque estás usando la librería modificada para trabajar a 48MHz.
Debiste usar la original o la que te mencioné anteriormente para usar el puerto D. Librería lcd420.c en puerto D

También debes cambiar la palabra de configuración, pues para trabajar a 4MHz, no estás usando la adecuada.
Usa esta:
C:
#fuses NOBROWNOUT,NOIESO,NOFCMEN,NOLVP,NOVREGEN

#use delay(crystal = 4 MHz)
Prueba reemplazando la librería por la del enlace y cambia la palabra de configuración.
 
ya hice lo que me comentaste y no funciona D@rkbytes, me aparece lo mismo, no aparece nada en la lcd y la información que envía por la rs232 no corresponden a los adc, en uno de los intentos que realice me percate que al no usar las directivas setup_adc_ports(all_analog); setup_adc(ADC_CLOCK_INTERNAL); si enciende la lcd. no se si el tiempo de conversión de los adc no sea compatible con la frecuencia.
 
Algo hiciste mal entonces, porque acabo de reemplazar la librería y la palabra de configuración, y si funciona.
La pantalla muestra valores en 0, no sé por qué, y la salida RS-232 muestra algunos valores, no se logra saber bien que valores por lo rápido que aparecen, pero si se ve algo.

Aquí adjunto el proyecto con los cambios mencionados.

Al menos ya con con esos cambios podrás determinar los problemas.
 

Adjuntos

  • proyecto.rar
    101.6 KB · Visitas: 30
muchas gracias D@rkbytes, una vez mas te lo agradezco. voy a estudiar a fondo los fuses y frecuencias en general. y para comenzar me podrias resolver una duda. en este mismo foro colocaste sintaxis en la palabra de configuracion para diferentes frecuencias al trabajar con una u otra frecuencia en los fuses y cristales tambien tengo que modificar la libreria de la lcd o ni al caso.
me refiero a estas configuraciones
// Con cristal de 4MHz.
#include <18f2550.h>
#fuses xtpll,cpudiv1,pll1,nobrownout,nopbaden,nolvp
#use delay(clock = 48MHz)

// Con cristal de 8MHz.
#include <18f2550.h>
#fuses hspll,cpudiv1,pll2,nopbaden,nolvp,nofcmen,noieso
#use delay(clock = 48MHz)

// Con cristal de 12MHz.
#include <18f2550.h>
#fuses hspll,cpudiv1,pll3,nobrownout,nopbaden,nolvp
#use delay(clock = 48MHz)

// Con cristal de 16MHz.
#include <18f2550.h>
#fuses hspll,cpudiv1,pll4,nobrownout,nopbaden,nolvp
#use delay(clock = 48MHz)

// Con cristal de 20MHz.
#include <18f2550.h>
#fuses hspll,cpudiv1,pll5,nobrownout,nopbaden,nolvp
#use delay(clock = 48MHz)
 
Muchas gracias D@rkbytes, una vez mas te lo agradezco. Voy a estudiar a fondo los fuses y frecuencias en general.
De nada. (y)
Y para comenzar, ¿me podrías resolver una duda?
En este mismo foro colocaste sintaxis en la palabra de configuración para diferentes frecuencias.
¿Al trabajar con una u otra frecuencia en los fuses y cristales también tengo que modificar la librería de la lcd o ni al caso?
La librería original puede trabajar bien hasta 20MHz, para frecuencias mayores, ya debes usar la librería modificada.
 
buen dia D@rkbytes tengo un problema referente a este mismo proyecto, me funciona ala perfeccion el .hex que viene en el proyecto que me enviaste funcionando pero al siquiera compilarlo sin ninguna modificacion me devuelve todo el problema inicial.
 
Me funciona ala perfección el .hex que viene en el proyecto que me enviaste funcionando pero al siquiera compilarlo sin ninguna modificación me devuelve todo el problema inicial.
OK. Entonces si al compilar el programa ya no se muestra nada en la pantalla, tienes que actualizar PIC C Compiler. (Algunas versiones, no recuerdo bien cuales pero alrededor de "v4.13X" tuvieron éste problema.)
Actualmente existe un problema con las nuevas versiones 5.02X.
El problema surge cuando se hace uso de la instrucción port_x_pullups();
Si ésta instrucción se coloca antes de inicializar la pantalla "lcd_init();", ya no se ve nada después en la pantalla.
Entonces se tiene que colocar port_x_pullups(); después de ésta instrucción.

Si es alguno de éstos casos, eso puede ser la solución.
 
buen dia D@rkbytes, ya actualice el pic c compiler y todo bien, pero ahora estoy estudiando los fuses y probando con el pic18f452 los fusibles cambian. de los que tenia configurado el 18f4550 los fuses FCMEN, IESO,VREGEN no los soporta, lo compilo con los que si soporta y no funciona.



ya resolvi mi problema D@rkbytes, ya me da pena de estar moleste y moleste, gracias por todo
 
Última edición:
Buen dia;
Estoy haciendo un proyecto en el cual uso 5 lcd´s (16x2) cada uno con su pic (16f873A), los pic's tienen todos el mismo programa y el mismo circuito de conexión, el problema es que para el proyecto tenia 2 lcd's en stock y compre los otros 3, al probarlos los 2 antiguos son más tenues que los nuevos (son todos azules), y al momento de conectarlos al circuito funcionan bien luego de un rato y luego empiezan a desvanecerse las letras pero solo en los lcd's nuevos, los viejos funcionan muy bien, intercambio de circuitos, de pic's pero pasa igual (los nuevos :( y los viejos :) ) para el contraste les puse una resistencia fija de 3.3Kohm, para todos los circuitos y como dije anteriormente todos inicialmente funcionan bien, pero solo los nuevos se desvanecen. Agradezco su colaboración.
 

Adjuntos

  • lcd.jpg
    lcd.jpg
    32.5 KB · Visitas: 13
  • lcd1.jpg
    lcd1.jpg
    26.4 KB · Visitas: 12
Se me hace que estan flojas las gomas conductoras de los LCD y por eso se desvanecen. Para solucionarlo pides desajustar las travitas negras que apretan el marco contra la placa, volver a presionar la pantalla ejerciendo algo de presion sin dañarla y volver a ajustarlas. Si persiste tendras que desarmarla por completo y limpiar los contactos donde apoyan las gomas conductoras y las gomas conductoras tambien con alcohol isopropilico, volver armar y probar.
 
Hola comunidad foros de electrónica.
Me gustaría que me ayudaran a visualizar el estado off/on de 8 led que es lo me a hace falta ami código a y tengo algunos errores de visualización.
su ayuda me sería de gran aprecio ya que no se mucho de programación.
les adjunto la simulación en proteus y la programación en c.

Este es el programa en c disculpen por lo extenso del código.



PHP:
#include <16f877a.h>
#use     delay(crystal = 4MHz)

#define use_portb_kbd TRUE
#include <KBD96.c>
#include <LCD420.c>
#include <stdlib.h>

#define  LED_1  PIN_D0
#define  LED_2  PIN_D1
#define  LED_3  PIN_D2
#define  LED_4  PIN_D3
#define  LED_5  PIN_D4
#define  LED_6  PIN_D5
#define  LED_7  PIN_D6
#define  LED_8  PIN_D7

#define ENTRADA1 PIN_C0
#define ENTRADA2 PIN_C1
#define ENTRADA3 PIN_C2
#define ENTRADA4 PIN_C3
#define ENTRADA5 PIN_C4
#define ENTRADA6 PIN_C5

void mostrar_menu(){
lcd_gotoxy(3,1);
printf(lcd_putc,"\fMENU PRINCIPAL\r");
lcd_gotoxy(1,2);
printf(lcd_putc," 0 Estado Entradas");
lcd_gotoxy(1,3);
printf(lcd_putc," * Control Salidas");
}

void funcion_led_1()
{
   output_toggle(LED_1);
}

void funcion_led_2()
{
   output_toggle(LED_2);
}

void funcion_led_3()
{
   output_toggle(LED_3);
}

void funcion_led_4()
{
   output_toggle(LED_4);
}

void funcion_led_5()
{
   output_toggle(LED_5);
}

void funcion_led_6()
{
   output_toggle(LED_6);
}

void funcion_led_7()
{
   output_toggle(LED_7);
}

void funcion_led_8()
{
   output_toggle(LED_8);
}

void funcion_lectura_entradas(){
lcd_gotoxy(1,1);
printf(lcd_putc,"INPUT1=%u",input(ENTRADA1));
lcd_gotoxy(1,2);
printf(lcd_putc,"INPUT2=%u",input(ENTRADA2));
lcd_gotoxy(1,3);
printf(lcd_putc,"INPUT3=%u",input(ENTRADA3));
lcd_gotoxy(11,1);
printf(lcd_putc,"INPUT4=%u",input(ENTRADA4));
lcd_gotoxy(11,2);
printf(lcd_putc,"INPUT5=%u",input(ENTRADA5));
lcd_gotoxy(11,3);
printf(lcd_putc,"INPUT6=%u",input(ENTRADA6));
lcd_gotoxy(1,4);
printf(lcd_putc,"REGRESO MENU PULSE #");
}

void main () 
{
CHAR k;

   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);
 
   output_low(LED_1),(LED_2),(LED_3),(LED_4),(LED_5),(LED_6),(LED_7),(LED_8);
   printf(lcd_putc,"\fBienvenidos (^^,)\r\rPulsa # para ir menu");

   while (true)
   {
      k = kbd_getc();
      
      if (k!=0)
         switch(k)
         {
         case '0':
            funcion_lectura_entradas();
            break;
         case '1':
            funcion_led_1();
            break;    // Brake ya no se coloca al final de la selección.
         case '2':
            funcion_led_2();
            break;
            case '3':
            funcion_led_3();
            break;
            case '4':
            funcion_led_4();
            break;
            case '5':
            funcion_led_5();
            break;
            case '6':
            funcion_led_6();
            break;
            case '7':
            funcion_led_7();
            break;
            case '8':
            funcion_led_8();
            break;
            case '#':
            mostrar_menu();
            break;  
         }
   }
}
 

Adjuntos

  • programa.rar
    43.9 KB · Visitas: 14
  • proteus.png
    proteus.png
    226.7 KB · Visitas: 14
  • lcd 4x20.png
    lcd 4x20.png
    139.9 KB · Visitas: 12
Atrás
Arriba