TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: mocopo en 20 de Febrero de 2014, 16:48:04

Título: Problemas de novato en el tema de teclado 3x4
Publicado por: mocopo en 20 de Febrero de 2014, 16:48:04
Muy buenas,

Como todo novatos, llevo varias horas peleandome con este programilla bien sencillo. Solo ha de leer el valor que pulso en un teclado 3x4 y encender un led si pulso "4" y apagarlo si pulso "6". Pero no hay manera, a ver si podeis ayudarme en mi "iniciación".

Os copio el codigo con el que estoy trabajando

Código: [Seleccionar]
#include <Teclado.h>
#define use_portb_kbd TRUE
#include <KBD.C>
#use standard_io(C)


void main()
{
   char k;
 
   kbd_init();
   port_b_pullups(TRUE);
   
   while(TRUE)
   {
     k= kbd_getc();
      if(k == 4)
     
       output_high(pin_c1);
       
      else
      {
         if(k == 6)
         
          output_low(pin_c1);
         
      }   
    }
}

Teclado.h

Código: [Seleccionar]
#include <18F4450.h>
#device ADC=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(crystal=24MHz)


Saludos y muchas gracias de antemano. :oops:
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: Miquel_S en 20 de Febrero de 2014, 18:03:34
Hola mocopo, si no me equivoco, que podria ser porque me queda mucho por aprender, en los includes debes definir la libreria <KBD.C> antes del #define use_portb_kbd TRUE.

Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: rivale en 20 de Febrero de 2014, 18:27:22
Hola mocopo, si no me equivoco, que podria ser porque me queda mucho por aprender, en los includes debes definir la libreria <KBD.C> antes del #define use_portb_kbd TRUE.



Disculpa que te corrija Miguel, pero la libreria checa si ya esta definido el puerto a usar, si no esta definido entonces usa uno por default.


mocopo, un error que veo en tu código es que no especificas el cristal a usar, también estas activando el WDT y no lo estas reiniciando, puede que tu programa se reinicie constantemente y nunca llegue a checar tu condición
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: Miquel_S en 20 de Febrero de 2014, 19:19:47
Gracias por la aclaración rivale, referente al cristal ¿No lo esta especificando dentro del #include <Teclado.h>?
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: rivale en 20 de Febrero de 2014, 19:28:24
Gracias por la aclaración rivale, referente al cristal ¿No lo esta especificando dentro del #include <Teclado.h>?

esta especificando la frecuencia, pero no tiene el #fuse asociado, no se si tome el interno o busque algún externo, puede que eso cause problemas
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: mocopo en 21 de Febrero de 2014, 02:25:41
Antes de nada, muchas gracias por responder.

Sobre lo del cristal, no lo tengo especificado ya que estoy simulando con Proteus y no creo que afecte(aunque nunca se sabe), a parte de eso no hay ningun error mas en el codigo? Esta todo lo demas bien?Asi deberia funcionar? Le he dado mil y una vueltas en si me dejo algo y no encuentro el que ni el problema.

Saludos!
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: rivale en 21 de Febrero de 2014, 11:18:44
tienes razón, en proteus no deberia afetar lo del cristal

nunca he usado la libreria de ccs para manejar el teclado, no se si se detenga el corrimiento cuando presionas una tecla.

haz intentado correrlo paso a paso en proteus?
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: rivale en 21 de Febrero de 2014, 11:23:57
otra cosa que podría afectar es que estas activando todas la pullup del puerto B, para el uso del teclado solo se activan 4, recuerda que la mitad del puerto es entrada y la otra mitad son salidas
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: AngelGris en 21 de Febrero de 2014, 12:26:08
  Hay que tener en cuenta el ADC. Tal vez algún pin queda configurado como entrada, pero analógica en lugar de digital y por ello los problemas.
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: mocopo en 23 de Febrero de 2014, 13:24:02
Muy buenas,

Os va as sonar a broma, pero he modificado el #include por el del 16F877, he modificado la simulación con proteus cambiando el 18F4550 por el 16F877 y con el mismo código...tachan!! A funcionado, me parece a mi que es algo de CCS con el 18f4550 y el keypad 3x4 o en su caso del proteus.


Saludos! En caso de que se os ocurra una solución, no dejéis de ponerla. 
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: mocopo en 03 de Marzo de 2014, 07:45:00
Muy buenas compañeros,

Comentar que he conseguido hacer funcionar el teclado 3x4 con un 18F4550 después de varios días peleándome. Finalmente me centre en mostrar por pantalla la tecla pulsada.

El problema después de muchas pruebas, reside en el proteus. Para poder tener 100% funcional el keypad 3x4 hay que realizar lo en Proteus con botones normales realizando por ti mismo las conexiones para sacar la matriz de 3x4, porque con el modulo keypad 3x4 del Proteus no funciona y ademas hay que insertar resistencias externas de pull-ups en el puerto B, ya que la función "port_b_pullups(TRUE)" no funciona bien en Proteus con 18F.

(http://www.hqew.net/files/Images/Article/images/3_1(18).jpg)

Ahora me estoy peleando para que me haga caso con el IF, de si pulso la tecla 4 se ponga en high el PIN C1 y cuando pulse la tecla 6 se ponga en low. En este ultimo aspecto no consigo adelantar, he quedado estancado.

He probado poniendo:

Código: [Seleccionar]
while(TRUE)
   {
     k= kbd_getc();
      if(k == 4)
     
       output_high(pin_c1);
       
      else
      {
         if(k == 6)
         
          output_low(pin_c1);
         
      }   
    }

O poner entre comillas los valores por ser CHAR, tal que así:

Código: [Seleccionar]
while(TRUE)
   {
     k= kbd_getc();
      if(k == '4')
     
       output_high(pin_c1);
       
      else
      {
         if(k == '6')
         
          output_low(pin_c1);
         
      }   
    }

Pero no hay forma, a alguien se le ocurre cual puede ser el problema? Hay que poner comillas dobles cuando se trabaja con CHAR ""??

Espero que la solución dada para el tema del teclado sea de utilidad para muchos, ya que después de navegar mucho por internet veo que es un problema muy extendido y del cual no había encontrado solución.

Saludos y gracias de antemano.
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: AngelGris en 03 de Marzo de 2014, 11:05:45
  ¿Las rutinas de teclado que estás utilizando, devuelven el valor ascii del caracter? Ya que en tus "if" evalúas si es igual al caracter 4 o 6.
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: rivale en 03 de Marzo de 2014, 11:33:10
esa libreria te regresa la tecla presionada en caracter, esta bien como lo tienes definido, con comillas simples ('4')

solo verifica que estes presionando la tecla correspondiente, de acuerdo a la librería este es el orden

// Keypad layout:
char const KEYS[4][3] = {{'1','2','3'},
                         {'4','5','6'},
                         {'7','8','9'},
                         {'*','0','#'}};
Título: Re: Problemas de novato en el tema de teclado 3x4
Publicado por: gardelitock en 09 de Marzo de 2014, 12:52:25
Hola, creo que encontré la solución, hice un programa parecido. Apretando 1, prende el led y con cualquier otro lo apaga, es similar a lo que pensaste;

void main()
{
char key=0;
kbd_init();  // inicia la func de teclado                   
port_b_pullups(true);
output_a(0x00);                //Limpia el puerto C
   set_tris_a(0x00);           

while(1)
   {
   key=kbd_getc();
   if(key!=0)
   {
   if(key=='1')
      output_high(PIN_A1);
      else
      output_low(PIN_A1);
      }}}

Cuando declaras un char, le da el valor cero definido o algo asi. Ese era tu problema.
Avisá si te sirvió, tambien soy novato, hace dos semanas empece con esto.
Saludos!