TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: linus101 en 21 de Febrero de 2009, 15:43:08
-
Buenas,
He montado un 16f88 con un LCD Displaytech S162COG data sheet (http://www.displaytech-us.com/pdf/FullSpecs/S162COG-v10.pdf)
Lo he intentado en el PIC simulator IDE y funciona perfectamente, preo en el protoboard no hay manera!
Conexiones:
B0 enable
B1 rs
B2 rw
B4 B4
B5 B5
B6 B6
B7 B7
Código:
#include <16F88.h>
#fuses INTRC_IO, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#include "lcd_puertoB.c"
//======================
void main()
{
lcd_init();
lcd_putc("\fHello World");
while(1);
}
Como fuente uso un cargador de 12 voltios 1,5A ajustado a 5V con potenciometro de 10K.
¿Alguna idea de porqué no funciona?
Uso CCS 4.023 y un programador USB MICROCHIP PIC PROGRAMMER link (http://www.nbglin.com/usba.htm)
-
El primer problema es que no puedes alimentar el pic y el lcd con el cargador a través de un divisor resistivo con un potenciómetro. Porque no le da la corriente suficiente. Prueba de conseguir un regulador de tensión de 5V por ejemplo el Lm7805 (es barato)y lo usas para regular y estabilizar la tensión en 5v. Prueba con eso y si no funciona luego vemos
-
También revisa el contraste.
Saludos!
-
He probado quitar el potenciómetro y usar una batería que da 4.9 V, pero no me funciona.
¿Cómo se mira el contraste?
Gracias.
-
Con un potenciometro entre +5v y gnd , el central al pin V0 , que en el data dice que es el pin 2
-
Gracias Akenafab!
Efectivamente era el contraste! Le he puesto un potenciómetro para que en el pin2 del LCD entren 0,5V y funciona a la perfección!
-
Mmmm....la alegría me ha durado poco...
Cuando le intento poner 2 mensajes se me queda colgado:
#include <16F88.h>
#FUSES INTRC, NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO, NOMCLR, NOBROWNOUT, CCPB3
#use delay(clock=8000000)
#include "lcd_puertoB.c"
void main()
{
setup_oscillator(OSC_8MHZ|OSC_INTRC);
while(1)
{
delay_ms(1000);
lcd_init();
delay_ms(1000);
lcd_putc("\f");
lcd_putc("Hola!");
delay_ms(1000);
lcd_putc("\f");
lcd_putc("Buenos días!");
}
}
Se me queda colgado y se queda en la pantalla el mensaje "Hola!"
-
La inicialización del lcd la debes hacer solo una vez, es decir lcd_init() debe estar fuera del loop while:
-
He probado poniendo ldc_init antes del bucle y solo con ese cambio tampoco funciona.
He hecho varias pruebas, y curiosamente si el mensaje es mayor de 7 caracteres se bloquea. He probado este código y funciona:
#include <16F88.h>
#FUSES INTRC, NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO, NOMCLR, NOBROWNOUT, CCPB3
#use delay(clock=8000000)
#include "lcd_puertoB.c"
void main()
{
setup_oscillator(OSC_8MHZ|OSC_INTRC);
lcd_init();
while(1)
{
delay_ms(1000);
lcd_putc("\f");
delay_ms(1000);
lcd_gotoxy(1,1);
printf(lcd_putc,"Saludos");
delay_ms(1000);
lcd_gotoxy(1,2);
printf(lcd_putc,"que tal");
}
}
¿Qué puede pasar? ¿Alguna mala conexión de algún bit?
-
Lo que puede estar pasando es que el pic le envíe los datos más rapido que lo que puede recibir el lcd y por eso se bloquee, al enviarle pocos bytes no hay problema. Revisa el archivo lcd_puerotB.c y fijate si los tiempos de lectura y escritura se corresponden con la hoja de datos de tu LCD
-
Pudiera ser lo que te comentan que tu lcd sea demasiado lento , pero en mi corta experiencia esto no me ha pasado.
Estas usando el pin R/W ?? o solo lo mandas a GND??
Yo utilizo la libreria Flex_Lcd y me va muy bien.Con ella usas el LCD a 4bits, asi que reduces mucho el cablerio.
Ahora estoy usando el pic16F88 todo ok.
.----------------------------
Tengo recuerdo vago , pero en este foro Redpic o Nocturno , o los dos , explicaban o que diferencia y que era más eficiente entre putc y printf(lcd_outc, " ");
Putc , yo lo uso para 1 solo caracter .
printf , para una cadena.
delay_ms(1000);
printf(lcd_putc,"\fSaludos");
printf(lcd_putc,"\nque tal");
while(1){}
-
#include <16F88.h>
#FUSES INTRC_IO,NOwDT,PUT,MCLR,NOBROWNOUT
#use delay(Internal=8M)
//------------ Pines del LCD ---------------------//
#define LCD_DB4 PIN_B3
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
//
#define LCD_RS PIN_A0
//#define LCD_RW PIN_C1
#define LCD_E PIN_A7
//--------------------------------------------------//
#include <flex_lcd.c> // Cargamos libreria del lcd
void main(){
setup_oscillator(OSC_8MHZ);
output_A(0);
output_B(0);
lcd_init(); // inicializamos el LCD
lcd_setcursor_vb(1,1); //blink y cursor
printf(lcd_putc,"\f HOla amigos \n Saludos!! :D");
while(1){}
} // End main
Prueba con ese promailla
Te adjunte la libreria Flex LCd en este mensaje.
Saludos!
-
De nuevo acertaste!!!
He usado el flex_lcd.c y he puesto el pin RW a tierra. Funciona perfectamente.
¿Quiere decir esto que no se puede usar este LCD con la función RW?
-
¿Quiere decir esto que no se puede usar este LCD con la función RW?
Deberías revisar el driver para que veas el por qué se recomienda aterrizar la terminal de R/W.
En lo personal nunca he "leído" la memoria del LCD, no he configurado el LCD para accesar a información, solo para mandar información.
-
DEberias hacer lo que dice el compa MArio , no solo con este lcd , sino con la mayoria de los componentes y asi poder evitar dolores de cabeza.
EL pin R/W , es para leer la ram de la pantalla , esto es cuando tienes a VCC ese pin.
Si lo tienes a GND es para escribir en él,por eso cunado envias los datos para que aparezca el mensaje esta a GND.
Si quisieras leer lo que escribiste , entonces pondrias a VCC el pin , y pues direecionar el dato que quieras leer.
Tambien se usa para saber el estado del display , si esta ocupado o no para enviar comando.
El compilador si no usas R/W , lo que genera es un retardo .
Saludos y que bueno lo solucionaste!