Autor Tema: Conexion del 16f88 a un LCD 16x2  (Leído 8048 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado linus101

  • PIC10
  • *
  • Mensajes: 8
Conexion del 16f88 a un LCD 16x2
« en: 21 de Febrero de 2009, 15:43:08 »
Buenas,

He montado un 16f88 con un LCD Displaytech S162COG data sheet

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

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #1 en: 21 de Febrero de 2009, 15:47:38 »
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

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #2 en: 21 de Febrero de 2009, 16:23:29 »
También revisa el contraste.

Saludos!

Desconectado linus101

  • PIC10
  • *
  • Mensajes: 8
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #3 en: 21 de Febrero de 2009, 16:40:42 »
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.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #4 en: 21 de Febrero de 2009, 17:26:57 »
Con un potenciometro entre +5v y gnd , el central al pin V0 , que en el data dice que es el pin 2

Desconectado linus101

  • PIC10
  • *
  • Mensajes: 8
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #5 en: 22 de Febrero de 2009, 06:39:57 »
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!


Desconectado linus101

  • PIC10
  • *
  • Mensajes: 8
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #6 en: 22 de Febrero de 2009, 07:32:30 »
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!"

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #7 en: 22 de Febrero de 2009, 10:14:55 »
La inicialización del lcd la debes hacer solo una vez, es decir lcd_init() debe estar fuera del loop while:

Desconectado linus101

  • PIC10
  • *
  • Mensajes: 8
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #8 en: 22 de Febrero de 2009, 14:54:46 »
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?

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #9 en: 22 de Febrero de 2009, 15:42:38 »
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

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #10 en: 22 de Febrero de 2009, 17:27:03 »
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.



Código: [Seleccionar]
delay_ms(1000);

printf(lcd_putc,"\fSaludos");
printf(lcd_putc,"\nque tal");
 
while(1){}


Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #11 en: 22 de Febrero de 2009, 17:34:50 »
#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!  
« Última modificación: 22 de Febrero de 2009, 17:38:39 por AKENAFAB »

Desconectado linus101

  • PIC10
  • *
  • Mensajes: 8
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #12 en: 22 de Febrero de 2009, 19:14:15 »
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?


Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #13 en: 22 de Febrero de 2009, 21:46:12 »
¿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.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Conexion del 16f88 a un LCD 16x2
« Respuesta #14 en: 23 de Febrero de 2009, 01:30:57 »

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!


 

anything