TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: artemis en 18 de Marzo de 2020, 11:31:45

Título: mostrar texto lcd 2x16 pic 16f876a
Publicado por: artemis en 18 de Marzo de 2020, 11:31:45
Hola gente estoy teniendo problemas para mostrar texto en la pantalla LCD, el display enciende pero no se muestra el texto (solo muestra cuadraditos amarillos), que puede ser?
Adjunto esquema proteus
    - Tienes que ingresar para ver archivos adjuntos -  
Adjunto el código en C
Código: [Seleccionar]
#INCLUDE <16F876A.h>
#DEVICE ADC=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#INCLUDE <flex_lcd.C>
#DEFINE USE_PORTB_LCD TRUE
#BYTE PORTA= 5
#byte PORTB= 6
#byte PORTC= 7

long contador=0;
int16 duty=0;
int Timer2,Poscaler;
double RPM;

//Interrubción por cambio en RB0
#INT_EXT
ext_isr()
{
 contador++;
}
void main()
{
   //Configura los Puertos del PIC
   set_tris_a(0b00000011);//RA0 RA1 como entrada
   set_tris_b(0b00000001); //RB0 como entrada
   set_tris_c(0b00000000);
   //Configura la Entrada Analoga
   setup_adc_ports(RA0_ANALOG);              //Configurar ADC (Lectura de temperatura)
   setup_adc(adc_clock_internal);      //Reloj interno para la conversion analoga digital)
   
   //Configura el PWM
   // Generemos una Señal cuadrada de 1 Khz
   Timer2=249;    //Se carga timer 2 con 249 como lo vimos en la pagina
   //Preescaler=4;  //Preescaler solo puede tomar valores de: 1 - 4 - 16
   //Para el preescaler colocamos "t2_div_by_4"
   Poscaler=1;  //Preescaler solo puede tomar valores de: 1
   
   setup_timer_2(t2_div_by_4,Timer2,Poscaler);   //Configuracion de Timer 2 para establecer frec. PWM a 1kHz
   setup_ccp1(ccp_pwm);                //Configurar modulo CCP1 en modo PWM
   
   //Habilita las Interrupcciones
    enable_interrupts(int_ext); //Activa interrupcion por RB0
    ext_int_edge(L_TO_H);    //Activa interrupción por flanco de bajada
    enable_interrupts(global); //Habilita interrupciones de forma global
   
    lcd_init();
    lcd_gotoxy(1,1);
    LCD_PUTC("VELOCIDAD MOTOR");
   
    //Hace por siempre
    while(1)
    {
     contador++;
     //Lectura del Potenciometro
     set_adc_channel(0);   //Escoge el canal 0 de los puertos analogos
     delay_us(100);       
     duty=read_adc();      //Almacena en duty el valor del voltaje del pot
     set_pwm1_duty(duty);//10 bits= 1023 y 8bit= 255
     
     //Espera por 1 segundo
     delay_ms(999);
     
     //Despues de 1 segundo multiplica el valor de los pulsos contados en
     //contador y los multiplica por 60 (para pasarlo a minutos) y lo divide
     //por el numero de pulsos que tiene el encoder, en este caso el encoder
     //da 10 pulsos en 1 giro completo
     RPM=contador*60/10;
     
     //Reinicia el contador de Pulsos
     contador=0;
     
     //Visualiza la Velocidad
     lcd_gotoxy(1,2);
     printf(lcd_putc,"RPM: %f   ",RPM);
     
    }
   
}
asi es como se está visualizando el lcd (tuve que comprimir un poco la imagen jaja)
  - Tienes que ingresar para ver archivos adjuntos -  
Título: Re:mostrar texto lcd 2x16 pic 16f876a
Publicado por: KILLERJC en 18 de Marzo de 2020, 11:41:41
A ese LCD le faltan conexiones (me refiero a la parte del VEE -Vo en la imagen-) guiate por esta imagen:

(https://www.innovadomotics.com/images/Contenido/Bascom/4_Tr_Lcd/02_Lcd_Conexiones.jpg)

Despues alguien te va a tener que ayudar con el software, ya que no manejo CCS.
Título: Re:mostrar texto lcd 2x16 pic 16f876a
Publicado por: artemis en 18 de Marzo de 2020, 12:57:21
A ese LCD le faltan conexiones (me refiero a la parte del VEE -Vo en la imagen-) guiate por esta imagen:

(https://www.innovadomotics.com/images/Contenido/Bascom/4_Tr_Lcd/02_Lcd_Conexiones.jpg)

Despues alguien te va a tener que ayudar con el software, ya que no manejo CCS.
hola sisi esas conexiones las tengo realizadas en la protoboard, tengo 5V en el VDD y VEE, 0V en VSS por eso me enciende todo perfecto pero no se si el texto no lo muestra por algún error en el código o como seria, la simulacion en proteus funciona bien
Título: Re:mostrar texto lcd 2x16 pic 16f876a
Publicado por: KILLERJC en 18 de Marzo de 2020, 14:38:45
Citar
engo 5V en el VDD y VEE, 0V en VSS por eso me enciende todo perfecto

Es que no es asi,, por eso esta el potenciometro... A 0V no tenes nada de contraste, a 5V tenes MUCHO contraste y te aparecen cuadros completamente negros, vos necesitas regular ese contraste, y lo haces con el potenciometro.
Título: Re:mostrar texto lcd 2x16 pic 16f876a
Publicado por: artemis en 18 de Marzo de 2020, 14:53:29
Citar
engo 5V en el VDD y VEE, 0V en VSS por eso me enciende todo perfecto

Es que no es asi,, por eso esta el potenciometro... A 0V no tenes nada de contraste, a 5V tenes MUCHO contraste y te aparecen cuadros completamente negros, vos necesitas regular ese contraste, y lo haces con el potenciometro.
perdón tengo directo a 5v el backlight (pin 15) y con el potenciometro regulo el contraste como indicas.. por eso veo los cuadraditos amarillos pero no se muestra el texto
PD: Actualicé el post con el esquema proteus actualizado con la conexión que estoy usando
Título: Re:mostrar texto lcd 2x16 pic 16f876a
Publicado por: KILLERJC en 18 de Marzo de 2020, 15:04:24
Yo no se que libreria es la que estas usando, pero si es la flex_lcd de http://picmania.garcia-cuervo.net/recursos/flex_lcd.c

Entonces ahi en ese .c te indica que tenes que definir los pines de esta forma:

Código: C
  1. //#define LCD_DB4   PIN_B4
  2. //#define LCD_DB5   PIN_B5
  3. //#define LCD_DB6   PIN_B6
  4. //#define LCD_DB7   PIN_B7
  5. //
  6. //#define LCD_RS    PIN_C0
  7. //#define LCD_RW    PIN_C1
  8. //#define LCD_E     PIN_C2

lo cual no veo en tu codigo, pero esto depende de la libreria.
Título: Re:mostrar texto lcd 2x16 pic 16f876a
Publicado por: artemis en 18 de Marzo de 2020, 15:16:51
Yo no se que libreria es la que estas usando, pero si es la flex_lcd de http://picmania.garcia-cuervo.net/recursos/flex_lcd.c

Entonces ahi en ese .c te indica que tenes que definir los pines de esta forma:

Código: C
  1. //#define LCD_DB4   PIN_B4
  2. //#define LCD_DB5   PIN_B5
  3. //#define LCD_DB6   PIN_B6
  4. //#define LCD_DB7   PIN_B7
  5. //
  6. //#define LCD_RS    PIN_C0
  7. //#define LCD_RW    PIN_C1
  8. //#define LCD_E     PIN_C2

lo cual no veo en tu codigo, pero esto depende de la libreria.
sisi estoy utilizando la libreria flex_lcd.c y modifiqué lo siguiente:
Código: [Seleccionar]

#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_RS    PIN_C3
#define LCD_RW    PIN_C4
#define LCD_E     PIN_C5
PD: el pin C2 lo estoy usando para otra cosa en el proyecto, por eso utilizo c3-c4-c5 para conectar con el display
Título: Re:mostrar texto lcd 2x16 pic 16f876a
Publicado por: KILLERJC en 18 de Marzo de 2020, 17:35:03
Entonces solo quedan los tiempos, por las dudas, pone un delay antes del lcd_init, de unos 100ms para probar...

Y ademas para "probar", intenta disminuir la frecuencia del oscilador.
Título: Re:mostrar texto lcd 2x16 pic 16f876a
Publicado por: artemis en 18 de Marzo de 2020, 17:56:45
Entonces solo quedan los tiempos, por las dudas, pone un delay antes del lcd_init, de unos 100ms para probar...

Y ademas para "probar", intenta disminuir la frecuencia del oscilador.
de momento no cuento con el programador para probar pero he visto varios vídeos con el código de ejemplo y les muestra el texto sin usar delays, es raro no se si el problema estará ahí

pd: en el primer post están adjuntas las imágenes del esquema en proteus y del display encendido
Título: Re:mostrar texto lcd 2x16 pic 16f876a
Publicado por: KILLERJC en 18 de Marzo de 2020, 18:19:13
Es que tenes que probar.... Si algo no funciona hay que empezar a desmenuzar cual es el problema.

Los LCD tienen una serie de pasos a seguir y tiempos a respetar.

Desde que se da alimentacion hasta poder iniciar la inicializacion, el como iniciarlo, los tiempos de pulso en alto y en bajo, etc.
Ya me paso de usar librerias que estaban en internet y encontrarme con que no funcionaban, y se termino aumentando los delays de dentro de la libreria. Por supuesto, los aumente de forma considerable, escribia lento, pero con eso supe que el problema era de tiempos.

Hasta ahora no sabemos que es, por lo que comentas el hardware esta correctamente conectado. Entonces pasamos al software.
El soft, lo primero es el driver del LCD, que el codigo sea para ese driver, segundo los tiempo que se cumplan, y finalmente tercero la inicializacion.

Suponiendo que la libreria es para el driver correcto, entonces quedan los tiempos. Y poco a poco vas desarmando hasta llegar al problema.