TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: SNaIDeR en 26 de Noviembre de 2008, 21:34:35

Título: Problema 18F4550 + lcd + teclado
Publicado por: SNaIDeR en 26 de Noviembre de 2008, 21:34:35
Tengo que portar mi proyecto de fin de carrera, desde un 16f877a a este pic 18f4550.

El unico problema que encontre es en referencia al uso del teclado.

Utilizo las librerias del CCS de teclado y de lcd, y el problema es que no consigo que funcione el teclado, la patilla RB1 no se pone roja en el proteus como deberia al activar la pull ups, y no se pork no funciona, ya que con esta misma configuracion, en el otor pic funcionaba perfectamente.

Os dejo la rutina que utilizo, es simplemente pulsar una tecla y que la muestre por el LCD, si alguien sabe a que es debido me seria de gran ayuda.

Adjunto el archivo de proteus utilizado, tambien he puesto resistencisa en las  columnas e igualmente no funciona, es por el problema de esa patilla, la RB1, si puls 1 2 o 3 coge un 1, y pulsando otras teclas nada de nadda :S

Saludos y mil gracias





include <18f4550.h>
#fuses NOWDT,NOPROTECT,NOLVP,NOCPD,NOBROWNOUT,NOPUT,NOMCLR,NODEBUG,HS,NOPBADEN
#use delay(clock=2000000)
#include <lcd.c>
#include <stdio.h>
#include <KBD.C>
   
char c;

   
void main(){

   port_b_pullups(true);    // activa las resistencias de pull-up teclado
   lcd_init(); // Inicializo lcd
   kbd_init(); // inicializo teclado


   printf(lcd_putc,"\f");
   printf(lcd_putc,"Hola");
   do{ //hacer hasta...
      c=kbd_getc();
         
   }while(c=='\0'); //...que  se pulse tecla
   printf(lcd_putc,"\f");
   printf(lcd_putc,"%c "c);
 
}
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: Giovanny en 27 de Noviembre de 2008, 03:38:41
printf(lcd_putc,"%c ",c);
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: SNaIDeR en 27 de Noviembre de 2008, 05:30:13
ese no es el problema, que el display funciona, el problema esta en el teclado, que la simulacion con proteus no funciona
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: cerebro en 27 de Noviembre de 2008, 12:24:12
a el codigo le falta la siguiente linea...
Código: [Seleccionar]

#include <18f4550.h>
#fuses NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT,NOMCLR,NODEBUG,HS,NOPBADEN
#use delay(clock=2000000)

#define use_portb_kbd TRUE  //esto define al puerto b para ser usado por el teclado

#include <lcd.c>
#include <kbd.c>
   

igual te comento que con eso solo no se resuelve el problema yo ya lo probe, pero es un avance. y creo que esta mal configurado o conexionado porque el unico valor que anda es el 1 (el que esta conectado al B1  :shock:). Solo te ayude a generar mas problemas y poca solucion  :(.

 
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: MLO__ en 27 de Noviembre de 2008, 15:45:01
Hola.

Falta configurar al puerto b como entradas o salidas digitales, ya que por deafault esta como entrada analogica.

Saludos
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: SNaIDeR en 28 de Noviembre de 2008, 08:38:01
Ninguno de los dos era la solucion.


#define use_portb_kbd TRUE  //esto define al puerto b para ser usado por el teclado

Esta linea esta configurada dentro de la libreria, no es encesario ponerla en el programa principal.


#fuses NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT,NOMCLR,NODEBUG,HS,NOPBADEN

Con el fuse NOPBADEN configuro ya que sean I/O digitales.



Lo que hice fue cambiar los pines dentro de la libreria, moverlos sin usar el RB1 y lo solucion,e no tengo ni idea porque ese pin no funciona ya que es igual que el resto del puerto pero bueno.

Gracias a todos ;)
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: rodrigo_control2009 en 19 de Abril de 2009, 20:47:25
en   tu  proyecto  incluyes  el  archivo  stdio.h    yo  lo  realice  sin  dicho  archivo  y  funciono  muy  bien ...  cual es  la  ventaja  o  no  de  incluirlo   o  cual es  el  criterio  para  decidir  incluirlo  en  los  proyectos
Gracias
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: therionx en 24 de Abril de 2009, 02:12:04
la verdad es mucho mas sencillo incluir una funcion teclado en mi opinion eso hice y me sirvio, me pasaba lo mismo con las librerias para el 18f4550 :mrgreen: :-/
Título: dato anexo para descargas de archivos
Publicado por: rodrigo_control2009 en 24 de Abril de 2009, 02:18:35
hola  un dato  anexo  no  se  si  le s interesa  pero  encontre  estos  linc  que  me parece  son  muy  utiles 
dos páginas muy interesantes la primera es: http://www.downloadmegafiles.com/  en esta página podréis descargar de megavideo y de megaupload archivos sin limite de tiempo ni de velocidad .

La segunda página es http://www.atrapavideo.com/ en esta podréis visualizar los videos de megavideo sin límite de tiempo y también trae la opción de descargar el video .Esta ultima permite la descarga de videos de las siguientes webs
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: BrunoF en 24 de Abril de 2009, 02:29:07
hola  un dato  anexo  no  se  si  le s interesa  pero  encontre  estos  linc  que  me parece  son  muy  utiles 
dos páginas muy interesantes la primera es: http://www.downloadmegafiles.com/  en esta página podréis descargar de megavideo y de megaupload archivos sin limite de tiempo ni de velocidad .

La segunda página es http://www.atrapavideo.com/ en esta podréis visualizar los videos de megavideo sin límite de tiempo y también trae la opción de descargar el video .Esta ultima permite la descarga de videos de las siguientes webs


¿Que tiene que ver ésto con el tema?
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: rodrigo_control2009 en 24 de Abril de 2009, 12:05:18
Nada, solo que encontre  esa  informacion  que  me  parecio  util  y  la  publique  en el  lugar  equivocado. (crei que seria vista por algun administrador  y reubicada ) 
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: ivanbv4 en 25 de Febrero de 2011, 17:12:48
Hola amigos veo que estos mensajes son de hace tiempo ya, asique imagino que han podido solucionar el problema. Yo lamentablemente estoy frente al mismo inconveniente. Tengo el teclado conectado al puerto b de un 18f4550 y el pin b1 esta en gris en la simulacion en proteus. Vi más arriba que alguien lo habia solucionado cambiando este pin pero no veo como hacer esto desde el fichero kdb.c. También ya me aseguro de tener descomentabada la linea #define use_portb_kbd TRUE  en el fichero y aun asi sigo sin poder mostrar en el lcd la tecla pulsada. Lo que mas me llama la atención que todo lo que hice fue migrar de un pic a otro manteniendo el esquema y haciendo los cambios correspondientes y en el primero andaba fantastico y en el segundo no. Si alguno tiene la solución agradeceria que la publicara
Saludos
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: rodrigo_control2009 en 25 de Febrero de 2011, 18:36:04
Suba  algun esquemático, imagenes  de la simulación en Proteus y el firmware   asi  se podrá  ver  en  donde esta el error  además  q otros podrán probar el firmware, y darle una mejor  ayuda
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: jukinch en 25 de Febrero de 2011, 19:54:26
Hola Ivanbv4:
                Como dice rodrigo_control2009 sería mejor que subas el dsn y el código para que te podamos dar una mano. O aunque sea una parte del mismo para ver como configuraste los fuses.
                 Aclará a que te referis con "haciendo los cambios correspondientes" que cambios hiciste precisamente?.
                       Saludos.
                             Jukinch
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: rodrigo_control2009 en 25 de Febrero de 2011, 23:09:34
en tu  firmware  stas  habilitando  las  resistencias pullups  del  puerto b ?? Has  probado tu codigo  en fisico  pq  yo  he usado  ese  PIC  y  no  me  ha  dado  problemas con el teclado  de membrana 4*4 por ej.  el cual  no posee  resistencias pullups

yo  uso esta  declaracion fuera del main()    #define use_portb_kbd (true); ya que si no lo usas  se  activa  por defecto el portd a menos  q tngas modificado el  driver
y esta  en el  main()    port_b_pullups(true);  para  habilitar  las  pullups cuando el teclado no  las  tiene.
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: ivanbv4 en 28 de Febrero de 2011, 20:47:18
Hola a todos gracias por sus respuestas. Les adjunto el código del programa que es realmente breve. La idea es que tanto el teclado como el display funcionen en el mismo puerto B. Les agradeceria cualquier sugerencia o aporte(http://)

#include <18F4550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 20000000)       
#define use_portb_lcd TRUE
#define use_portb_kbd TRUE
#include <lcd.c>
#include <kbd.c>

void main()
 {
   char k;
   int  x;
   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);
   lcd_putc("\fListo...\n");
                                   
   while (TRUE)
    {
      k=kbd_getc();
      x=k-48;                             //Conversión numérica
      if(k!=0)
       {
        if(k=='*') 
          lcd_putc('\f');
        else
         { lcd_putc(k);             //Imprime carácter
           delay_ms(500);
           printf(lcd_putc,"\f Car=%c",k); //Imprime carácter
           delay_ms(500);
           printf(lcd_putc,"\f Car=%u",k); //Imprime valor ASCII
           delay_ms(500);
           printf(lcd_putc,"\f Num=%u",x); //Imprime valor numérico
           delay_ms(500);
           lcd_putc("\fListo...\n");
         } 
      }
   }
 }
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: rodrigo_control2009 en 28 de Febrero de 2011, 21:16:41
Lo  voy a simular y ver q  pasa.
A simple vista  segun la imagen  solo  deberia  funcionar el teclado, ya  q por ej  las lineas q bajan del lcd  no  se conectan con las q van al pic y  las lineas D4 y D5 llegan al mismo pin 38.
Voy a probar  y  t cuento
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: PalitroqueZ en 01 de Marzo de 2011, 01:05:13
y será buena idea conectar la lcd y el teclado a los mismos pines?

¿cómo sabe el pic cuál nivel lógico corresponde a cada quien?

asi como está ese circuito, yo no me atrevería a conectarlo en físico

Además faltan las pull-ups externas (mas de una vez se ha dicho en el foro que no es aconsejable usar las pull-ups internas para ese micro)

Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: ivanbv4 en 01 de Marzo de 2011, 09:07:24
Gracias por su pronta respuesta muchachos. rodrigo_control2009 tenias razón hay un error en el conexionado, corrigiendo esto el lcd me muestra el cartel de "listo..." pero no muestra nada cuando presiono las teclas.

PalitroqueZ sobre el conexionado de ambos perifericos al mismo puerto yo también tenia mis dudas hasta que vi un ejemplo funcionando en un pic de menor gama y me parecio una buena forma de ahorrar pines, en mi caso eso seria de mucha ayuda.
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: rodrigo_control2009 en 01 de Marzo de 2011, 16:17:30
Lo simule y  funciona mal  aunq  imprime en lcd y lee  teclado pq  borra  el lcd al presionar '*'.
El ej q usas al parecer  es del libro Compilador Ccs y Simulacion Proteus hay q tener en cuenta  la mayoria de los ej son para  los pic 16f salvo los con usb.
Ademas hay q tener en cuenta q los registros de los 16f son distintos al del 18f  por ej  el portb del  16f877a  es  el  reg 0x06  y del 18f4550  es  reg  0x81, y creo q la lib  lcd.c hace uso de esos registros, depende de la version del compilador q se use.

Use el compilador CCS 4.023 y4.114  ambos m dan los mismos  resultados, al habiltar  las pullups del puerto b no imprime  y se qdaba pegado en la instruccion imprime PRUEBA  (para eso  uso el led del port C0  como bandera para ir viendo q lineas de cod se ejectutan, simple pero practico), luego puse las pullups de 4,7K e imprime y lee, pero como ya mencione lo hace mal.
Otro detalle  es el uso del retardo despues de la instruccion imprime PRUEBA  se  qdaba  pegado  cuando no lo usaba.
el  comando borrar  lcd me funciono  asi  "\f" no  '\f', tb probocaba q se colgara.

Creo q es posible  el uso del mismo puerto, ya q  existen en fisico y la simulacion lo permite  . Habra  q estudiar mas las lib lcd.c y kbd.c para q sean compatibles con el 18f4550.

Lo positivo es q va mejorando

#include <18f4550.h>
#fuses hs,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 20000000)       
#define use_portb_lcd (TRUE)
#define use_portb_kbd (TRUE)
#include <lcd.c>
#include <kbd.c>

void main()
 { char k;
   int  x;
   lcd_init();
   kbd_init();
   //port_b_pullups(true);
   printf(lcd_putc,"\f PRUEBA \n");
    delay_ms(300);
                                 
 while (TRUE)
    {lcd_putc("\f");
     output_high(pin_c0);
     k=kbd_getc();
     output_low(pin_c0);
     x=k-48;                             //Conversión numérica
     
      if(k!=0x00)
       {
        if(k=='*') lcd_putc("\f");
         
        else
         { lcd_putc(k);             //Imprime carácter
           delay_ms(300);
           
           printf(lcd_putc,"\f Car=%c",k); //Imprime carácter
           delay_ms(300);
         
           printf(lcd_putc,"\f Car=%u",k); //Imprime valor ASCII
           delay_ms(300);
         
           printf(lcd_putc,"\f Num=%u",x); //Imprime valor numérico
           delay_ms(300);
           
           lcd_putc("\f Listo...\n");
         }
         
      }
     
   }
 }
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: ivanbv4 en 02 de Marzo de 2011, 20:15:35
Hola rodrigo_control2009  gracias por tu nuevo aporte. Te hago una consulta ¿las resistencias de pull up no deberian estar solo en las columnas como dice la kbd.c?  Luego de varias pruebas tuve un minimo avanze, logre que fundionara correctamente pero solo lo hace hasta 5 pulsaciones luego se tilda. Seguire intentando...
Saludos
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: rodrigo_control2009 en 03 de Marzo de 2011, 15:11:39
Tienes  toda  la  razon sobre  las pullups.
Y cuales  han  sido  las mejoras  q  has  efectuado,  seria  bueno  q  las  compartas  para  q mas personas  nos  beneficiemos.
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: ivanbv4 en 04 de Marzo de 2011, 12:12:04
Hola muchachos finalmente pude darle solución al problema. Recordemos que lo que buscaba era poder conectar en el mismo puerto el lcd y el teclado matricial 4*3 para ahorrar pines en un 18F4550.
Una de las cosas a tener en cuenta es que en ambas bibliotecas kdb.c y lcd.c se debe tener habilitado el puerto b (que es el que elegi, podria ser el d también). Como mas arriba se dijo en este tema, no son muy confiables las pull-ups de este integrado por lo que conecte resistencias externas, tanto a las filas como a las columnas, aunque en la kbd solo dice que es necesario para las columnas. El lcd tiene dos pines que generan conflicto, por lo que solo ellos deben ser conectados en otro puerto, estos son RS y RW, que en mi caso les di nueva ubicación en D6 y D7. El Enable continua en el pin b0 y D4-D7(del lcd) en los correspondientes pines como la biblioteca lo indica.
A continuación adjunto el código y una imagen del esquema en proteus. Gracias por los aportes que hicieron y espero que a alguien le sea de utilidad.
Saludos
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: fvergniaud en 27 de Mayo de 2011, 02:38:36
ivanbv4 pordes subir el esquematico, hice el mio que te atacho pero no funciono. Gracias :?
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: ivanbv4 en 27 de Mayo de 2011, 09:12:55
Hola fvergniaud, vi tu esquematico y hay algunas lineas del display que olvidaste conectar, proba con eso che. En el .rar que subi en mi comentario anterior hay una imagen del esquematico y el .c también esta incluido. Te incluyo el dsn que yo use. Espero te sirva
saludos
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: AcoranTf en 21 de Agosto de 2011, 17:18:00
Aunque el hilo viene de viejo y las ultimas aportaciones tambien tienen su tiempo, espero me echeis una mano.
Necesito justamente poner el teclado y el ldc en el mismo puerto del 4550 o 4523, pero segun veo nadie lo ha conseguido. El problema es que tengo las lineas de I/O justas, para solo disponer de 8 lineas, o sea un puerto para el teclado y ldc.
En mi caso necesito 16 entradas y 12 salidas, lo que suman 28 pines, mas los 8 del teclado/lcd total 36. Por ello ademas debere utilizar el oscilador interno del pic.
¿Alguien me puede ayudar?. Agradecere cualquier aporte.

Saludos.
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: ivanbv4 en 22 de Agosto de 2011, 02:40:53
 Hola AcoranTf, lamento no poder dar solución a tu problema. Yo también pense en hacer lo mismo que vos planteas pero no lo logre por ello opte por la solucion que di arriba usando dos pines más y eso que estuve bastante buscando la forma. asiq si lo logras seria un gran aporte para el hilo. exitos
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: AcoranTf en 23 de Agosto de 2011, 18:28:00
Gracias Ivan, a ver si le echo un ratito y hago algunas pruebas. Ya comentare resultados. Si no lo consigo, mi solucion sera utilizar buffers 74HC573 para ampliar las entradas, aunque eso complica un poco la programacion.

Saludos.
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: bichicome07 en 14 de Diciembre de 2011, 22:09:22
HOLA A TODOS,  soy nuevo en el foro y no se si estoy publicando en el lugar correcto (mil disculpas). Soy durísimo con este tema y quizás alguno me pueda ayudar. Tengo que simular un teclado y display de un celular, pero no logro siquiera publicar en el display un mensaje de saludo.  El profesor nos pide que no se compartan pines, por lo que debo usar diferentes para el teclado y display. Les paso el codigo que he compilado con un rejunte de los que he visto en este foro; esta incompleto y no tiene antirebote, pero por el momento solo quiero ver ALGO en el display. Les adjunto el proteus, si alguien puede ayudar a esta piedra dura, se los voy a agradecer. saludos


#include <TP final teclado-display.h>
#include <stdio.h>
#fuses NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT,NOMCLR,NODEBUG,HS,NOPBADEN

#define use_porta_lcd TRUE
#define use_portd_kbd TRUE  //esto define al puerto d para ser usado por el teclado

#include <lcd.c>
#include <kbd.c>

#use delay(clock= 4000000)

#define LCD_ENABLE_PIN PIN_A5
#define LCD_RS_PIN PIN_A4
#define LCD_DATA4 PIN_A0
#define LCD_DATA5 PIN_A1
#define LCD_DATA6 PIN_A2
#define LCD_DATA7 PIN_A3


#byte PORTA=0xF80
#byte PORTB=0xF81
#byte PORTC=0xF82

int num=0;
unsigned char y;


void main()
{
 
set_tris_A(0b00000000);//Configuracion de puerto A salida, que va hacia el display
PortA=0;//Limpiamos el pueto
set_tris_B(0xFF);//Configuracion de puertoB entrada, que se accionan send y end
PortB=0;//Limpiamos el pueto
set_tris_C(0b11110000);//Configuracion de puerto C nible alto entrada y bajo salida
PortC=0;//Limpiamos el pueto

   lcd_init();//inicio del display
   kbd_init();//inicio del teclado
   
       
   
   output_high(pin_A4);//RS=1 para que lea datos
   output_high(pin_A5);//E=1 para habilitar el display
   printf(lcd_putc,"\f");
   printf(lcd_putc,"Hola");   
   delay_ms(5);
   
   
   
   // si observa el micro jamas se ponen los puertos A4(RS) y A5(E) en 1
   
   
 
   while(TRUE)
   {
   
   

      output_low(pin_D0);
      output_high(pin_D1);
      output_high(pin_D2);
      delay_ms(500);
             if(input(pin_D4==0))
             num=1;
             lcd_putc(num);
             output_high(pin_D1);
             lcd_putc(num);
             printf(lcd_putc,"\f Num=%u",num);
             delay_ms(500);
           
             if(input(pin_D5==0))
             num=4;
             lcd_putc(num);
             //delay_ms(500);
             
             if(input(pin_D6==0))
             num=7;
             lcd_putc(num);
             //delay_ms(500);
             
             if(input(pin_D7==0))
             num=10;
             y="*";
             lcd_putc("*");
             //delay_ms(500);
             
           
      output_high(pin_D0);
      output_low(pin_D1);
      output_high(pin_D2);
      delay_ms(500);
            if(input(pin_D4==0))
             num=2;
             lcd_putc(num);
             delay_ms(500);
             
            if(input(pin_D5==0))
             num=5;
             lcd_putc(num);
             delay_ms(500);
             
           
            if(input(pin_D6==0))
             num=8;
             lcd_putc(num);
             delay_ms(500);
             
           
            if(input(pin_D7==0))
             num=0;
             lcd_putc(num);
             delay_ms(500);
             
      output_high(pin_D0);
      output_high(pin_D1);
      output_low(pin_D2);
      delay_ms(500);
     
            if(input(pin_D4==0))
             num=3;
             lcd_putc(num);
             delay_ms(500);
             
            if(input(pin_D5==0))
             num=6;
             lcd_putc(num);
             delay_ms(500);
             
             if(input(pin_D6==0))
             num=9;
             lcd_putc(num);
             delay_ms(500);
             
             if(input(pin_D7==0))
             y="#";
             lcd_putc(y);
             delay_ms(500);
             
            }
           
           
}
Título: Re: Problema 18F4550 + lcd + teclado
Publicado por: ivanbv4 en 15 de Diciembre de 2011, 02:47:43
Hola bichicome07 no he analizado tu código en detalle, pero en primera instancia creo que tienes un clock de 4MHZ y la configuración HS (High Speed) en los fuses, la cual si no me equivoco deberia ser XT para el reloj que usas. igual esta no es la solución a tu problema por que proteus omite pequeños errores como eso, pero la implementación real no lo hará. saludos
Título: Re:Problema 18F4550 + lcd + teclado (SOLUCIÓN MÁS SIMPLE)
Publicado por: horluy en 26 de Abril de 2017, 20:24:33
Hola,

Se que ya va mucho tiempo que se inicio este tema, pero lidiando con el mismo problema me encontré con que la solución más simple a todo el problema era activar las pull-ups del puertoB y colocar una pull-up externa en RB1.

Así todo me funcionó de maravilla.

Saludos!