TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pablo en 15 de Julio de 2007, 22:40:19

Título: Teclado U-Control
Publicado por: pablo en 15 de Julio de 2007, 22:40:19
Hola gente: Me estoy basando en un teclado de 4x4 que tiene la pagina U-Control http://www.ucontrol.com.ar/Articulos/teclado_15_teclas_con_pic_16F628/teclado_15_teclas_con_pic_16F628.htm
El tema es que como parte de mi aprendizaje queria hacerme yo el programa y la verdad que no pego pie con bola. No tengo idea que estoy haciendo mal pero no hace nada.
Hasta ahora lo unico que quice hacer es detectar una fila, PIN_A0 si se daba esto activaba un led que tengo en la pata B4, esto lo estoy probando en proteus y no hace nada estoy haciendo algo mal?

Muchas gracias.
Pablo

#include <16F627A.h>
     
#FUSES NOWDT      //      Watch Dog Timer
#FUSES PUT        //      Power Up Timer
#FUSES NOPROTECT  //      Code not protected from reading
#FUSES BROWNOUT   //    Reset when brownout detected
#FUSES NOMCLR     //      Master Clear pin enabled
#FUSES NOLVP      //      No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
//#FUSES INTRC_IO   //      Internal RC Osc, no CLKOUT
#FUSES NOCPD      //      No EE protection

#use delay(clock=4000000,RESTART_WDT)
#byte port_a=0x05
#byte port_b=0x06

void main(void) {
 
   set_tris_a(0x00);
   set_tris_b(0x00);
   port_a=0x00;
   port_b=0x00;
   while(true) {
      if(!input(PIN_A0))
         output_high(PIN_B4);
      else
         output_low(PIN_B4);
   }
}
Título: Re: Teclado U-Control
Publicado por: BrunoF en 15 de Julio de 2007, 22:57:59
Hola

Estás declarando ambas: columnas y filas como salidas. Entonces el programa no puede leer correctamente.

Proba declarando los pines que estes usando del puertoA como entradas:

Ejemplo:

set_tris_a(0x0F);
set_tris_b(0x00);
Título: Re: Teclado U-Control
Publicado por: pablo en 15 de Julio de 2007, 23:03:02
Bruno, gracias por la respuesta. Lo acabo de probar y tampoco pasa nada. Lo estoy probando en el proteus y quedan todas las patas incluso la de los pulsadores de color rojo y cuando presiono la fila o la columna deberia prender en azul no? Pero esto no pasa, parece como si no estubiera corriendo el programa y se colgara.
Título: Re: Teclado U-Control
Publicado por: BrunoF en 15 de Julio de 2007, 23:23:34
Olvidate del teclado por ahora, recurri a lo basico.

Desconecta la linea que ingresa a RA,0 y conectala directo a 0V. te tiene que poner en alto RB4. Yo no programo en CCS, pero me parece que deberia funcionar con mi correccion.

Si podes, adjunta una imagen del circuito en proteus.

Saludos.
Título: Re: Teclado U-Control
Publicado por: pablo en 16 de Julio de 2007, 12:02:21
Ya esta ese tema Bruno, la verdad no entendia como hacia para controlar las teclas pero ahora creo que lo entendi.
Lo que hice ahora es usar el puerto B para usar como testeo y despues verifico si se presiono una tecla por medio del puerto A.

(http://i147.photobucket.com/albums/r295/pablofiscella/Bien.jpg)

Esto que se ve en la imagen salio de esta forma entrando en un bucle mientras tenga 5v la pata A0.

Código: [Seleccionar]
void main(void) {
   byte paso=0;
   byte Tecla = 0;

   set_tris_a(0x0001111);
   set_tris_b(0x00);
   port_a=0x00;
   port_b=0xf0;
   while(true) {
         paso++;     
      //else
      //   delay_ms(2000);
      if(paso==1) {
         output_high(PIN_B0);
         output_low(PIN_B1);
         output_low(PIN_B2);
         output_low(PIN_B3);
      }else if(paso==2) {
         output_bit(PIN_B0,0);
         output_bit(PIN_B1,1);
         output_bit(PIN_B2,0);
         output_bit(PIN_B3,0);
      }else if(paso==3) {
         output_bit(PIN_B0,0);
         output_bit(PIN_B1,0);
         output_bit(PIN_B2,1);
         output_bit(PIN_B3,0);
      }else if(paso==4) {
         output_bit(PIN_B0,0);
         output_bit(PIN_B1,0);
         output_bit(PIN_B2,0);
         output_bit(PIN_B3,1);
         paso=0;
      }
      delay_ms(100);
      while(input(PIN_A0)) {
      }
   }
}

El problema es que cuando quiero testear 2 patas juntas deja de frenarse como se ve en la imagen te paso el codigo de como pensaba hacerlo.
Gracias por la ayuda.
Código: [Seleccionar]
void main(void) {
   byte paso=0;
   byte Tecla = 0;

   set_tris_a(0x0001111);
   set_tris_b(0x00);
   port_a=0x00;
   port_b=0xf0;
   while(true) {
         paso++;     
      //else
      //   delay_ms(2000);
      if(paso==1) {
         output_high(PIN_B0);
         output_low(PIN_B1);
         output_low(PIN_B2);
         output_low(PIN_B3);
      }else if(paso==2) {
         output_bit(PIN_B0,0);
         output_bit(PIN_B1,1);
         output_bit(PIN_B2,0);
         output_bit(PIN_B3,0);
      }else if(paso==3) {
         output_bit(PIN_B0,0);
         output_bit(PIN_B1,0);
         output_bit(PIN_B2,1);
         output_bit(PIN_B3,0);
      }else if(paso==4) {
         output_bit(PIN_B0,0);
         output_bit(PIN_B1,0);
         output_bit(PIN_B2,0);
         output_bit(PIN_B3,1);
         paso=0;
      }
      delay_ms(100);
      while(input(PIN_A0)) {
        if(input(PIN_B0))
            Tecla = '7'; 
         if(input(PIN_B1))     
            Tecla = '4'; 
         if(input(PIN_B2))     
            Tecla = '1'; 
         if(input(PIN_B3))     
            Tecla = '*'; 
      }
      while(input(PIN_A1)) {
         if(input(PIN_B0))     
            Tecla = '8'; 
         if(input(PIN_B1))     
            Tecla = '5'; 
         if(input(PIN_B2))     
            Tecla = '2'; 
         if(input(PIN_B3))     
            Tecla = '0'; 
      }
      while(input(PIN_A3)) {
         if(input(PIN_B0))     
            Tecla = '9'; 
         if(input(PIN_B1))     
            Tecla = '6'; 
         if(input(PIN_B2))     
            Tecla = '3'; 
         if(input(PIN_B3))     
            Tecla = '#'; 
      }
      while(input(PIN_A4)) {
         if(input(PIN_B0))     
            Tecla = ' '; 
         if(input(PIN_B1))     
            Tecla = 'A'; 
         if(input(PIN_B2))     
            Tecla = 'B'; 
         if(input(PIN_B3))     
            Tecla = 'C'; 
      }
   }
}
Título: Re: Teclado U-Control
Publicado por: BrunoF en 16 de Julio de 2007, 13:11:09
Hola pablo.

Bueno, no se si tus intenciones son que te explique por qué se comportan de distinta forma los dos programas que expusiste o que te de una solucion al problema...

En tu primer programa, el programa "se detiene" cuando pulsas la tecla porque pusiste:

while(input(PIN_A0)) {
      }

Y eso produce que el programa no logre salir de ese bucle hasta que sueltes la tecla.

En el segundo programa en ningun momento haces eso, y no podrias hacerlo tampoco tan sencillamente, ya que si encerras al programa en un bucle asi al tener presionada una tecla, el programa no podria escanear la otra.

Ahora, te posteo un programa que detecta hasta las 16 teclas presionadas. Eso si, tendrias que cambiar el circuito.
El teclado se conecta todo al puertoB, y en el puerto A se van mostrando una a una los valores(binarios) de las teclas presionadas encontradas.

Código: C
  1. #include <16f84a.h>           //Modelo de PIC usado para este ejemplo
  2. #fuses XT,NOWDT,NOPROTECT,PUT //Fusibles: Oscilador <= 4Mhz, Perro Guardian Desactivado, Sin proteccion contra lectura, Demora al inicio activada
  3. #use delay (clock=4000000)    //Defino cristal 4Mhz
  4. #use standard_io(a)
  5. #use fast_io(b)
  6. #byte port_a=0x05             //Defino puertoA
  7. #byte port_b=0x06             //Defino puertoB
  8.  
  9. byte Tecla[15];               //Array de 16 bytes. Cada uno contiene la posible tecla pulsada.
  10. byte Cantidad;                //Variable que indicara la cantidad de teclas presionadas.
  11.  
  12.  
  13. void main(void)
  14. {
  15.  
  16. byte i,j,Temp;                      //Defino variables a usar...
  17.  
  18. set_tris_a (0b00000);               //puertoA todo como salida
  19. set_tris_b (0b11110000);            //<RB4:RB7> como entradas, <RB3:RB0> como salidas
  20. port_b_pullups(TRUE);               //Habilito Weak Pull Ups puerto b
  21.  
  22. port_a=0;                           //Inicializo puertoA cero
  23. do{                                 //loop
  24.    port_b=0b00001110;                  //Fila 1 en bajo
  25.    Cantidad=0;                         //Inicializo Cantidad teclas encontradas=0
  26.    for(i=0;i<4;i++){                   //Recorro fila x fila
  27.      Temp=port_b;                      //Almaceno valor del puertoB en Temp
  28.      if (Temp < 240){                  //¿Hay algo presionado?
  29.        for(j=4;j>0;j--){               //Si. Busco columna por columna
  30.          if(!bit_test(Temp,7)){        //¿Columna con tecla presionada?
  31.            Tecla[Cantidad]= i*4+j;     //Si.Guardo el numero de tecla presionada en el array.
  32.            Cantidad++;                 //Incremento cantidad de teclas encontradas...
  33.          }                             //Cierro IF
  34.          rotate_left(&Temp,1);         //Rotacion para seguir con la proxima columna
  35.        }                               //Cierro FOR
  36.      }                                 //Cierro IF
  37.      rotate_left(&port_b,1);           //Rotacion para seguir con la proxima fila
  38.    }
  39.    for(j=0;j<Cantidad;j++){
  40.       port_a=port_a=Tecla[j];          //Mostrar una x una las teclas encontradas
  41.       delay_ms(1000);
  42.    }
  43. }while(TRUE);                       //Infinitamente reviso el teclado
  44. }                                   //Cierro main


Título: Re: Teclado U-Control
Publicado por: pablo en 16 de Julio de 2007, 13:28:40
Gracias por la respuesta, ahora analizo bien tu programa.

Pregunta, no puedo ver si 2 patas estan prendidas al mismo tiempo?

Lo que yo intentaba era que mientras tenga 5v en la pata A0 ver cual de las filas tambien estaba con 5v.

Las condiciones las puse dentro del bucle.

      while(input(PIN_A0)) {
        if(input(PIN_B0))
            Tecla = '7'; 
         if(input(PIN_B1))     
            Tecla = '4'; 
         if(input(PIN_B2))     
            Tecla = '1'; 
         if(input(PIN_B3))     
            Tecla = '*'; 
      }
Título: Re: Teclado U-Control
Publicado por: BrunoF en 16 de Julio de 2007, 15:05:31
Ojo! no confundas Hexadecimal con binario!

set_tris_a(0x0001111); hex

con

set_tris_a(0b0001111); bin


Pregunta, no puedo ver si 2 patas estan prendidas al mismo tiempo?

Lo que yo intentaba era que mientras tenga 5v en la pata A0 ver cual de las filas tambien estaba con 5v.

¿Filas? Segun tu circuito, podrias ver las columnas! A las filas las controlas vos...

byte tmp;

Podrias hacer:
while(input(PIN_A0)) {
  tmp= port_a && 0x0F; //me quedo solamente con el nibble bajo
  swap(tmp);                //invierto nibbles
  port_b = port_b && 0x0F;         //limpio nibble alto puertob
  port_b = port_b ll tmp;             //uno ambos nibbles para mostrar las columnas
}

Eso deberia funcionar. Al menos la idea...:D

Saludos.

Título: Re: Teclado U-Control
Publicado por: pablo en 16 de Julio de 2007, 18:10:57
Ups, perdoname pero no entiendo que es lo que hace esto, lo mio es un poco basico.
Lo del binario o hexa tenes razon y lo de la columna tambien.

En el programa hasta ahora logre que se frene cuando presiono un pulsador y quede con 5v la columna y la fila.
Puedo verificar las columnas pero no puedo ver las filas.
Perdon, seguramente el codigo que me pasaste hace eso pero no lo entiendo nunca trabaje bit por bit, o como se llame.
Lo que yo queria es verificar if una columna y una fila estaban con 5v al mismo tiempo pero cuando verifico la fila hace cualquier cosa.

Gracias por la paciencia.
Título: Re: Teclado U-Control
Publicado por: BrunoF en 16 de Julio de 2007, 21:48:21
El tema es que me parece que no terminaste de asimilar por completo el funcionamiento de un teclado con este tipo de multiplexación.

La idea es activar, por ejemplo, una fila a la vez, y leer las columnas. Es lo que se conoce como arreglo o array.

Puedo numerar el teclado asi.

0123
4667
89ab
cdef

Supongamos que yo controlo las FILAS, y esta es la parte que no entiendo. VOS controlas las filas. Entonces, ¿para qué querés "leer" las filas?.

Entonces, quedaría asi:

fila 10123
fila 24667
fila 389ab
fila 4cdef
columna 1columna 2columna 3columna 4

Entonces, lo que se hace es solamente "activar" una fila por vez. Supongamos que empiezo por la primera:

fila 10123
fila 24667
fila 389ab
fila 4cdef
columna 1(pulsador 0)columna 2(pulsador 1)columna 3(pulsador 2)columna 4(pulsador 3)
Referencia:
5V
0V
Depende del estado del pulsador

Entonces, una vez que activo sólo la primer fila, leo el estado de las columnas. Si una columna posee el mísmo estado lógico que la fila activa(es decir, en este caso 5V) entonces está siendo presionada. O sea que por cada fila puedo comprobar 4 pulsadores. Estos pulsadores seran aquellos en los que la fila activa esté involucrada(es decir que con la fila 1 activa, puedo leer el estado de los pulsadores 0,1,2 y 3)

Lo mísmo voy haciendo con cada una de las 4 filas:

Fila 2:

fila 10123
fila 24667
fila 389ab
fila 4cdef
columna 1(pulsador 4)columna 2(pulsador 5)columna 3(pulsador 6)columna 4(pulsador 7)
Referencia:
5V
0V
Depende del estado del pulsador

Fila 3:

fila 10123
fila 24667
fila 389ab
fila 4cdef
columna 1(pulsador 8)columna 2(pulsador 9)columna 3(pulsador a)columna 4(pulsador b)
Referencia:
5V
0V
Depende del estado del pulsador

Fila 4:

fila 10123
fila 24667
fila 389ab
fila 4cdef
columna 1(pulsador c)columna 2(pulsador d)columna 3(pulsador e)columna 4(pulsador f)
Referencia:
5V
0V
Depende del estado del pulsador

Entonces, a partir de ahí podes hacer el código que quieras. El algoritmo que hice hace un tiempo y expuse en uno de mis posts previos almacenaba en un array todas las teclas encontradas durante cada barrido del teclado.

Saludos.
Título: Re: Teclado U-Control
Publicado por: pablo en 16 de Julio de 2007, 22:46:33
Que explicacion, muchas gracias. Ahora esta me quedo claro.

Ahora habilite una linea y verifico cada columna para ver si se presiono algun pulsador.
Hasta ahi funciona perfecto, Lo que hice es verificar y asignar a una variable la el numero de tecla presionada.
Para verificarlo puse una condicio abajo con Tecla = 1 y entra pero cuando quiero prender la salida A4 y A5, el proteus solo me muestra durante esos 5 segundos la ultima pata A5 y la pata A4 queda apagada.
Estoy configurando algo mal?

Código: [Seleccionar]
void main(void) {
   int8 paso=0;
   byte Tecla = 1;
   byte tmp;

   set_tris_a(0b0011111);
   set_tris_b(0x00);
   port_a=0x00;
   port_b=0x00;

   while(true) {
      //if(!input(PIN_A0)&&!input(PIN_A1)&&!input(PIN_A3)&&!input(PIN_A4))
         paso++;   
      Tecla = 0;
      if(paso==1) {
         output_bit(PIN_B0,1);
         output_bit(PIN_B1,0);
         output_bit(PIN_B2,0);
         output_bit(PIN_B3,0);
         if(input(PIN_A0)) {
            Tecla = 1;
         } else if(input(PIN_A1)) {
            Tecla = 2;
         } else if(input(PIN_A3)) {
            Tecla = 3;
         } else if(input(PIN_A4)) {
            Tecla = 4;
         }
      }else if(paso==2) {
         output_bit(PIN_B0,0);
         output_bit(PIN_B1,1);
         output_bit(PIN_B2,0);
         output_bit(PIN_B3,0);
         if(input(PIN_A0)) {
            Tecla = 5;
         } else if(input(PIN_A1)) {
            Tecla = 6;
         } else if(input(PIN_A3)) {
            Tecla = 7;
         } else if(input(PIN_A4)) {
            Tecla = 8;
         }
      }else if(paso==3) {
         output_bit(PIN_B0,0);
         output_bit(PIN_B1,0);
         output_bit(PIN_B2,1);
         output_bit(PIN_B3,0);
         if(input(PIN_A0)) {
            Tecla = 9;
         } else if(input(PIN_A1)) {
            Tecla = 10;
         } else if(input(PIN_A3)) {
            Tecla = 11;
         } else if(input(PIN_A4)) {
            Tecla = 12;
         }
      }else if(paso==4) {
         output_bit(PIN_B0,0);
         output_bit(PIN_B1,0);
         output_bit(PIN_B2,0);
         output_bit(PIN_B3,1);
         paso=0;
         if(input(PIN_A0)) {
            Tecla = 13;
         } else if(input(PIN_A1)) {
            Tecla = 14;
         } else if(input(PIN_A3)) {
            Tecla = 15;
         } else if(input(PIN_A4)) {
            Tecla = 16;
         }
      }
      delay_ms(500);

      if(Tecla == 1) {
         output_high(PIN_B4);
         output_high(PIN_B5);
         delay_ms(5000);
      }
      //   if(bit_test(port_b,7) == 1) {
      //      Tecla = 1;
      //   }
      //}
      //if(Tecla==1) {
      //}

   }
}
Título: Re: Teclado U-Control
Publicado por: BrunoF en 16 de Julio de 2007, 23:39:11
Para verificarlo puse una condicio abajo con Tecla = 1 y entra pero cuando quiero prender la salida A4 y A5, el proteus solo me muestra durante esos 5 segundos la ultima pata A5 y la pata A4 queda apagada.

¿A4(RA4) y A5(RA5) ó B4(RB4) y B5(RB5)?

Si estás usando RA4 como salida, deberias saber que ese pin es de tipo open drain, por lo que necesita de una resistencia de 1k o menos conectada a 5v(pull up) para poder funcionar en dos estados logicos.

Saludos.
Título: Re: Teclado U-Control
Publicado por: pablo en 22 de Julio de 2007, 11:50:23
Bruno, disculpame. Se me quemo el pic y me colgue un poco. Te cuento que en el protreus lo pude hacer funcionar pero cuando lo probaba en la placa no funcionaba, no se si la placa tiene algun problema o tengo algun problema en la configuracion de los Fuses del micro porque funciona sin cristal.
Pero voy a tratar de conseguir el micro y sigo posteando dudas.
No queria quedar como desagradecido.

Bruno, muchas gracias.
Saludos.
Pablo
Título: Re: Teclado U-Control
Publicado por: BrunoF en 22 de Julio de 2007, 20:35:07
No hay problema.Como quemaste el pic? Seguro que está quemado? Por qué no probas con un oscilador externo?

Saludos.

Título: Re: Teclado U-Control
Publicado por: pablo en 23 de Julio de 2007, 15:29:21
Te cuento que soy un improvizado en esto de la electronica, todo lo estoy haciendo para manejar mi acuario. No se nada de eletronica, aclaro esto antes de que digas que bolu%#.
Para poder probar si funcionaba conecte a las 4 patas de la salida 4 leds y no puese bien las resistencias, no me acuerdo bien que hice pero creo que no quedaban conectadas osea que quedaron los leds directos. Cuando lo quice grabar de nuevo no me dejo, me comenzo a marcar error, probe con otro soft que se que funcionaba y tambien marco en el mismo lugar.

La semana que viene voy a comprarlo y lo pruebo.  Gracias por la ayuda.
Título: Re: Teclado U-Control
Publicado por: maunix en 24 de Julio de 2007, 08:47:34
Te cuento que soy un improvizado en esto de la electronica, todo lo estoy haciendo para manejar mi acuario. No se nada de eletronica, aclaro esto antes de que digas que bolu%#.

pablo, ya verás que en este foro nadie te tratará de bolu%# por no saber de electrónica... muchos empezaron de cero aquí mismo y no por ello los han defenestrado de ninguna forma.

Mientras pongas entusiasmo, ganas, esfuerzo y demuestres voluntad de aprender nadie te negará la ayuda aquí!! eso te lo garantizo.
Título: Re: Teclado U-Control
Publicado por: aitopes en 24 de Julio de 2007, 08:54:12
pablo, ya verás que en este foro nadie te tratará de bolu%# por no saber de electrónica... muchos empezaron de cero aquí mismo y no por ello los han defenestrado de ninguna forma.

Mientras pongas entusiasmo, ganas, esfuerzo y demuestres voluntad de aprender nadie te negará la ayuda aquí!! eso te lo garantizo.


Coincido con Maunix. Yo tambien empece aqui, en el foro, hace un año, y nunca me senti "discriminado",todo lo contrario, me han ayudado muchisimo!

Respecto del teclado, debido a que estoy mudando la web, ahora el link para acceder al circito ese es http://www.ucontrol.com.ar/wiki/index.php/Teclado_con_PIC16F628A

Saludos!
Título: Re: Teclado U-Control
Publicado por: pablo en 28 de Julio de 2007, 23:21:52
No ya se siempre tuve la mejor, aclaro para que se entiendan mis preguntas.
Aca aprendi de cero a programar en c y pude hacerme un controlador con display y todo, para mi todo un logro, siempre me gusto la electronica y nunca pude hacer nada por desconocimiento, ahora con los pics me siento todo un electronico. Algun dia llegare a aprender electronica en serio. Por ahora lo reemplazo con programacion y con estos maravillosos pics, que para lo que necesito son maravillosos.
En la semana compro nuevamante el pic y lo pruebo.
Disculpen la demora en la respuesta pero estube de viaje.

Como siempre mas que agradecido.
Pablo
Título: Re: Teclado U-Control
Publicado por: pablo en 31 de Julio de 2007, 01:33:51
Bueno, volvi al ruedo, como no me tenia confianza compre 2 micros, gracias a dios porque al rato ya habia quemado 1 juro que esta vez no tengo idea como.

Despues de luchar con mi codigo encontre uno por la web y lo modifique para la distribucion y necesitades propias.
Le conecte a la salida 1 led en cada pata para ver que pasaba cuando pulsaba un boton y algunos botones no funcionaron pero puede se de la placa porque en el proteus funciona bien.
El defecto que tiene es que cuando no presiono nada se prenden y se apagan algunos de los leds. Esto indica que cuando lo quira usar va a estar enviando datos como si hubiera presionado una tecla.
Por mas de que lo intente no encontre como quitar ese parpadeo.
Si le ven algu defecto al codigo por favor tirenme una soga.
Gracias.
Pablo

Código: [Seleccionar]
#include <16F628A.h>     
#FUSES NOWDT      //      Watch Dog Timer
#FUSES NOPUT        //      Power Up Timer
#FUSES NOPROTECT  //      Code not protected from reading
#FUSES NOBROWNOUT   //    Reset when brownout detected
#FUSES NOMCLR     //      Master Clear pin enabled
#FUSES NOLVP      //      No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES INTRC_IO   //      Internal RC Osc, no CLKOUT
#use delay(clock=4000000)
#byte port_a=0x05
#byte port_b=0x06
#use fast_io(a)
#use fast_io(b)


char c;


void delay()
{
delay_ms(5);
}

char kbd_getc()          // función que explora todo el teclado
{
   port_b=0b00000001;                  // verifica columna 1
   if(bit_test(port_a,0)==1)
   {delay();
   return ('1');}                     // si se presiono el uno devuelve 1
   if(bit_test(port_a,1)==1)
   {delay();
   return ('2');}                     // si se presiono el cuatro devuelve 4
   if(bit_test(port_a,3)==1)
   {delay();
   return ('3');}                     // si se presiono el siete devuelve 7
   if(bit_test(port_a,4)==1)
   {delay();
   return ('4'); }                   // si se presiono el * devuelve 10 = A

   port_b=0b00000010;                  // verifica columna 2
   if(bit_test(port_a,0)==1)
   {delay();
   return ('5');}                     // si se presiono el dos devuelve 2
   if(bit_test(port_a,1)==1)
   {delay();
   return ('6');}                     // si se presiono el cinco devuelve 5
   if(bit_test(port_a,3)==1)
   {delay();
   return ('7');}                     // si se presiono el ocho devuelve 8
   if(bit_test(port_a,4)==1)
   {delay();
   return ('8');}                    // si se presiono el cero devuelve 0

   port_b=0b00000100;                  // verifica columna 3
   if(bit_test(port_a,0)==1)
   {delay();
   return ('9');}                     // si se presiono el tres devuelve 3
   if(bit_test(port_a,1)==1)
   {delay();
   return ('A');}                     // si se presiono el seis devuelve 6
   if(bit_test(port_a,3)==1)
   {delay();
   return ('B'); }                    // si se presiono el nueve devuelve 9
   if(bit_test(port_a,4)==1)
   {delay();
   return 'C';  }                  // si se presiono el # devuelve 11 = B

   // si se tiene una matriz 4x3 no se usará el pin RB3
   port_b=0b00001000;                  // verifica columna 4
   if(bit_test(port_a,0)==1)
   {delay();
   return ('D');}                    // si se presiono la C devuelve 12 = C
   if(bit_test(port_a,1)==1)
   {delay();
   return ('E');}                    // si se presiono la D devuelve 13 = D
   if(bit_test(port_a,3)==1)
   {delay();
   return ('F');}                    // si se presiono la E devuelve 14 = E
   if(bit_test(port_a,4)==1)
   {delay();
   return ('*');}                    // si se presiono el F devuelve 15 = F
   if((bit_test(port_a,0)==0)&&(bit_test(port_a,1)==0)&&(bit_test(port_a,3)==0)&&(bit_test(port_a,4)==0))
      return (0);                    // devuelve 16 en caso de no haber presionado ningun pulsador
   // podria colocarse otra alternativa en caso de que no se presione ningun pulsador
}

void main()                      // programa principal
{
   set_tris_b(0x00);             // define RB0 a RB3 (columnas) como salidas y RB4 a RB7 (filas) como entradas
   port_b=0;                     // inicializa puerto B
   set_tris_a(0xff);             // define puerto A como todas entradas excepto RA0
   port_a=0;                     // inicializa puerto A
   port_b_pullups(TRUE);         // activa pull up del puerto b, no hará falta conectar resistencias

   while(true)                   // bucle de trabajo
   {
      while(1)
      {
         do
         {
            c=kbd_getc();
           
         }while(c==0);
         if(c=='1') {
            port_b = 0b00010000;
            delay_ms(50);
         } else if(c=='2') {
            port_b = 0b00100000;
            delay_ms(50);
         } else if(c=='3') {
            port_b = 0b00110000;
            delay_ms(50);
         } else if(c=='4') {
            port_b = 0b01000000;
            delay_ms(50);
         } else if(c=='5') {
            port_b = 0b01010000;
            delay_ms(50);
         } else if(c=='6') {
            port_b = 0b01100000;
            delay_ms(50);
         } else if(c=='7') {
            port_b = 0b01110000;
            delay_ms(20);
         } else if(c=='8') {
            port_b = 0b10000000;
            delay_ms(50);
         } else if(c=='9') {
            port_b = 0b10010000;
            delay_ms(50);
         } else if(c=='A') {
            port_b = 0b10100000;
            delay_ms(50);
         } else if(c=='B') {
            port_b = 0b10110000;
            delay_ms(50);
         } else if(c=='C') {
            port_b = 0b11000000;
            delay_ms(50);
         } else if(c=='D') {
            port_b = 0b11010000;
            delay_ms(50);
         } else if(c=='E') {
            port_b = 0b11100000;
            delay_ms(50);
         } else if(c=='F') {
            port_b = 0b11110000;
            delay_ms(50);
         } else {
            port_b = 0b00000000;
            delay_ms(50);
         }
         
      }         
   }
Título: Re: Teclado U-Control
Publicado por: pablo en 31 de Julio de 2007, 17:16:23
Bueno solucione el tema del parpadeo pero ahora si que no entiendo nada.
El programa en el proteus funciona a la perfeccion pero cuando lo pruebo no funciona bien.
Les cuento que es lo que pasa.

La distribucion la hice de esta forma

Entradas para verificar
A0 A1 A2 A3

1   2   3   4  B0       

5   6   7   8  B1

9   A   B  C  B2

D   E   F       B3


Las teclas D,E y F funcionan bien, lo probe con leds en las salidas.
La tecla 1, 5 y 9 manda como si hibiera presionado el 1
La teclas 2, 6 y A manda como si hubiera presionado el 2
La 3, 7 y B Nada
La 4, 8 y C como si hubiera presionado la tecla 3

No me doy cuenta que puede ser porque en el proteus funciona y desde la escaso de mis conocimientos el circuito esta bien hecho.

Se les ocurre que puede ser?
Muchas gracias.

Código: [Seleccionar]
#include <16F628A.h>     
#FUSES NOWDT      //      Watch Dog Timer
#FUSES NOPUT        //      Power Up Timer
#FUSES NOPROTECT  //      Code not protected from reading
#FUSES NOBROWNOUT   //    Reset when brownout detected
#FUSES NOMCLR     //      Master Clear pin enabled
#FUSES NOLVP      //      No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES INTRC_IO   //      Internal RC Osc, no CLKOUT
#use delay(clock=4000000)
#byte port_a=0x05
#byte port_b=0x06
#use fast_io(a)
#use fast_io(b)


char c;


void delay()
{
delay_ms(0);
}

char kbd_getc()          // función que explora todo el teclado
{
   port_b=0b00000001;                  // verifica columna 1
   if(bit_test(port_a,0)==1)
   {delay();
   return ('1');}                     // si se presiono el uno devuelve 1
   if(bit_test(port_a,1)==1)
   {delay();
   return ('2');}                     // si se presiono el cuatro devuelve 4
   if(bit_test(port_a,2)==1)
   {delay();
   return ('3');}                     // si se presiono el siete devuelve 7
   if(bit_test(port_a,3)==1)
   {delay();
   return ('4'); }                   // si se presiono el * devuelve 10 = A

   port_b=0b00000010;                  // verifica columna 2
   if(bit_test(port_a,0)==1)
   {delay();
   return ('5');}                     // si se presiono el dos devuelve 2
   if(bit_test(port_a,1)==1)
   {delay();
   return ('6');}                     // si se presiono el cinco devuelve 5
   if(bit_test(port_a,2)==1)
   {delay();
   return ('7');}                     // si se presiono el ocho devuelve 8
   if(bit_test(port_a,3)==1)
   {delay();
   return ('8');}                    // si se presiono el cero devuelve 0

   port_b=0b00000100;                  // verifica columna 3
   if(bit_test(port_a,0)==1)
   {delay();
   return ('9');}                     // si se presiono el tres devuelve 3
   if(bit_test(port_a,1)==1)
   {delay();
   return ('A');}                     // si se presiono el seis devuelve 6
   if(bit_test(port_a,2)==1)
   {delay();
   return ('B'); }                    // si se presiono el nueve devuelve 9
   if(bit_test(port_a,3)==1)
   {delay();
   return 'C';  }                  // si se presiono el # devuelve 11 = B

   // si se tiene una matriz 4x3 no se usará el pin RB3
   port_b=0b00001000;                  // verifica columna 4
   if(bit_test(port_a,0)==1)
   {delay();
   return ('D');}                    // si se presiono la C devuelve 12 = C
   if(bit_test(port_a,1)==1)
   {delay();
   return ('E');}                    // si se presiono la D devuelve 13 = D
   if(bit_test(port_a,2)==1)
   {delay();
   return ('F');}                    // si se presiono la E devuelve 14 = E
   if(bit_test(port_a,3)==1)
   {delay();
   return ('*');}                    // si se presiono el F devuelve 15 = F
   if((bit_test(port_a,0)==0)&&(bit_test(port_a,1)==0)&&(bit_test(port_a,2)==0)&&(bit_test(port_a,3)==0))
      return (0);                    // devuelve 16 en caso de no haber presionado ningun pulsador
   // podria colocarse otra alternativa en caso de que no se presione ningun pulsador
}

void main()                      // programa principal
{
   set_tris_b(0x00);             // define RB0 a RB3 (columnas) como salidas y RB4 a RB7 (filas) como entradas
   port_b=0;                     // inicializa puerto B
   set_tris_a(0b0001111);             // define puerto A como todas entradas excepto RA0
   port_a=0;                     // inicializa puerto A
   port_b_pullups(TRUE);         // activa pull up del puerto b, no hará falta conectar resistencias

   while(true)                   // bucle de trabajo
   {
      while(1)
      {
         do
         {
            c=kbd_getc();
           
         }while(c==0);
         if(c=='1') {
            port_b = 0b00010000;
            delay_ms(50);
         } else if(c=='2') {
            port_b = 0b00100000;
            delay_ms(50);
         } else if(c=='3') {
            port_b = 0b00110000;
            delay_ms(50);
         } else if(c=='4') {
            port_b = 0b01000000;
            delay_ms(50);
         } else if(c=='5') {
            port_b = 0b01010000;
            delay_ms(50);
         } else if(c=='6') {
            port_b = 0b01100000;
            delay_ms(50);
         } else if(c=='7') {
            port_b = 0b01110000;
            delay_ms(50);
         } else if(c=='8') {
            port_b = 0b10000000;
            delay_ms(50);
         } else if(c=='9') {
            port_b = 0b10010000;
            delay_ms(50);
         } else if(c=='A') {
            port_b = 0b10100000;
            delay_ms(50);
         } else if(c=='B') {
            port_b = 0b10110000;
            delay_ms(50);
         } else if(c=='C') {
            port_b = 0b11000000;
            delay_ms(50);
         } else if(c=='D') {
            port_b = 0b11010000;
            delay_ms(50);
         } else if(c=='E') {
            port_b = 0b11100000;
            delay_ms(50);
         } else if(c=='F') {
            port_b = 0b11110000;
            delay_ms(50);
         } else {
//            port_b = 0b00000000;
//            delay_ms(1050);
         }
         port_b = 0;
         //while((bit_test(port_a,0)==1)||(bit_test(port_a,1)==1)||(bit_test(port_a,3)==1)||(bit_test(port_a,4)==1))
         //{}
         
      }         
   }
Título: Re: Teclado U-Control
Publicado por: pablo en 31 de Julio de 2007, 21:47:37
Agrego algo mas al ultimo comentario, acabo de agregarle un sonido a cada tecla y lo probe en la placa.
Lo raro es que hace un sonido distinto en cada tecla pero sigue haciendo cualquier cosa en el encendido de los leds.
Título: Re: Teclado U-Control
Publicado por: pablo en 01 de Agosto de 2007, 21:32:39
Sigo, probando no quiero parecer pesado, perdon si parece.
Acabo de hacer una prueba con soft el tester.
Anule el barrido y deje prendida toda una fila, por ejemplo la fila 2 prendi el PIN B1 mido con el tester y mide 5v pero cuando presiono el boton de la columna 1 el PIN se pone en 0 obviamente el que recepciona tambien en 0v.

Por ahi sirve de algo, estoy seguro que es tema de configuracion.

Gracias.
Título: Re: Teclado U-Control
Publicado por: BrunoF en 02 de Agosto de 2007, 01:39:40
Hola Pablo.

No puedo decirte cuál es la instrucción que efectúa lo que necesitás. Pero me parece que tu error se debe a que tenés algunos pines del puertoA configurados como analógicos(por defecto se inicializa así).
No suelo programar uC en C(en realidad, hace rato que no programo uC alguno...). Probá poniendo:

#use standard_io(A)

y fijate si ocurre el milagro. :mrgreen: :mrgreen:
Título: Re: Teclado U-Control
Publicado por: micro_cadaver en 02 de Agosto de 2007, 10:39:20
encontre esto en tu codigo

Código: C
  1. void main()                      // programa principal
  2. {
  3.    set_tris_b(0x00);             // define RB0 a RB3 (columnas) como salidas y RB4 a RB7 (filas) como entradas
  4.    port_b=0;                     // inicializa puerto B
  5.    set_tris_a(0b0001111);             // define puerto A como todas entradas excepto RA0
  6.    port_a=0;                     // inicializa puerto A
  7.    port_b_pullups(TRUE);         // activa pull up del puerto b, no hará falta conectar resistencias

ahi configuras los puertos, pero el portA del 16f628a se comporta por defecto como entradas análogas para los comparadores de tiene en su hardware, tienes que configurar esta catracteristica, hacer CMCON = 0x07, CMCON es el registro que controla los comparadores, con ese valor 0x07 lo pones en digital todo el portA. Saludos  :mrgreen:
Título: Re: Teclado U-Control
Publicado por: pablo en 02 de Agosto de 2007, 15:35:25
Bruno probe lo que me dijiete pero no pasa nada sigue igual

Micro_cadaver vos decis que ponga esto?

Código: [Seleccionar]
#byte CMCON
void main() {
    setup_comparator(NC_NC_NC_NC);
    COMCON = 0x07;
}
Título: Re: Teclado U-Control
Publicado por: micro_cadaver en 02 de Agosto de 2007, 15:41:17
no pero...

no conozco el CCs pero me imagino que sabras cual es la direccion del registro CMCON, entonces declaralo asi como el portb y porta, luego ponle cmcon = 0x07; al menos eso yo hago otros compiladores de C, o sino averigua las funciones que tiene el CCS para desactivar los comparadores.

Título: Re: Teclado U-Control
Publicado por: pablo en 04 de Agosto de 2007, 17:59:32
Supuestamente con setup_comparator puedo configurar lo que me decias antes.
Pero igual creo que el 628 por lo poco que entiendo no tiene entradas analogicas.
Sigo sin poder hacerlo funcionar.
La verdad no entiendo porque, porque en realidad no es algo complicado, de hecho en la simulacion funciona.

Si alguien se da cuenta de que le falta al codigo sigo esperando su ayuda.
Gracias.
Pablo
Título: Re: Teclado U-Control
Publicado por: BrunoF en 04 de Agosto de 2007, 18:02:38
Pablo. Podés investigar por tu cuenta.

¿Por qué no lees el datasheet del 628? http://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf

El 16F628 TIENE entradas analógicas. Hay que leer más...
Título: Re: Teclado U-Control
Publicado por: pablo en 04 de Agosto de 2007, 20:07:41
Bruno ya te aclare que no se electronica, igualmente ya habia entrado para mi chino y por lo poco que entiendo sigo sin ver que tiene entradas analogicas.
Me podes decir en que pagina lo dice asi no cometo el mismo error la proxima.
Mediante codigo tambien intente configurar las entradas analogicas para eliminarlas setup_adc_ports y no me lo permitio de ahi que crei estar mas seguro de que lo los tenia, tambien entre en el archivo .h y no encontre nada relacionado con los analogicos.
Si es asi puede que no este configurando bien el puerto y de ahi todos mis problemas, pero no se con que indicarlo porque te repito no me deja poner setup_adc_ports.

Gracias
Título: Re: Teclado U-Control
Publicado por: ESTECA55 en 04 de Agosto de 2007, 21:48:09
(http://img110.imageshack.us/img110/401/analognb4.jpg)
Título: Re: Teclado U-Control
Publicado por: BrunoF en 04 de Agosto de 2007, 22:45:50
Bueno, hagamos asi:

Pasá todo el harware y programa del puertoA al puertoB.

Es decir:

RA0 es ahora RB4 y viceversa
RA1 es ahora RB5 y viceversa
RA2 es ahora RB6 y viceversa
RA3 es ahora RB7 y viceversa

asi descartamos si es problema de los pines analogicos.

Saludos.
Título: Re: Teclado U-Control
Publicado por: pablo en 04 de Agosto de 2007, 23:33:44
Esteca55, gracias por la aclaracion lo vi varias veces y no lo encontre.

Bruno, tenes razon voy a darlo vuelta, se supone que las patas estas si funcionarian normalmente como salidas no?
Lo pruebo y te cuento.

Gracias.
Título: Re: Teclado U-Control
Publicado por: BrunoF en 04 de Agosto de 2007, 23:52:43
Sip. Ningun pin del puertoB es analogico, asi que no tiene que haber problemas haciendo el truncamiento de pines ese.

Y el pic deshabilita los pines analogicos cuando configuras los pines del puertoA como salidas.

Proba y vemos.

Saludos.
Título: Re: Teclado U-Control
Publicado por: pablo en 05 de Agosto de 2007, 21:12:05
Bueno lo hice y sigue haciendo cualquiera, voy a rehacer la placa y vuelvo a probar.
Despues les cuento como sigue.

Gracias.