TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
#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 -
-
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.
-
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
-
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.
-
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
-
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:
//#define LCD_DB4 PIN_B4
//#define LCD_DB5 PIN_B5
//#define LCD_DB6 PIN_B6
//#define LCD_DB7 PIN_B7
//
//#define LCD_RS PIN_C0
//#define LCD_RW PIN_C1
//#define LCD_E PIN_C2
lo cual no veo en tu codigo, pero esto depende de la libreria.
-
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:
//#define LCD_DB4 PIN_B4
//#define LCD_DB5 PIN_B5
//#define LCD_DB6 PIN_B6
//#define LCD_DB7 PIN_B7
//
//#define LCD_RS PIN_C0
//#define LCD_RW PIN_C1
//#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:
#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
-
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.
-
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
-
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.