TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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);
}
-
printf(lcd_putc,"%c ",c);
-
ese no es el problema, que el display funciona, el problema esta en el teclado, que la simulacion con proteus no funciona
-
a el codigo le falta la siguiente linea...
#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 :(.
-
Hola.
Falta configurar al puerto b como entradas o salidas digitales, ya que por deafault esta como entrada analogica.
Saludos
-
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 ;)
-
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
-
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: :-/
-
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
-
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?
-
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 )
-
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
-
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
-
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
-
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.
-
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");
}
}
}
}
-
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
-
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)
-
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.
-
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");
}
}
}
}
-
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
-
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.
-
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
-
ivanbv4 pordes subir el esquematico, hice el mio que te atacho pero no funciono. Gracias :?
-
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
-
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.
-
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
-
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.
-
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);
}
}
-
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
-
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!