Autor Tema: Teclado U-Control  (Leído 5973 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Teclado U-Control
« 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);
   }
}

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Teclado U-Control
« Respuesta #1 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);
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #2 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.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Teclado U-Control
« Respuesta #3 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #4 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.



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'; 
      }
   }
}

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Teclado U-Control
« Respuesta #5 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


"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #6 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 = '*'; 
      }

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Teclado U-Control
« Respuesta #7 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.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #8 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.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Teclado U-Control
« Respuesta #9 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #10 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) {
      //}

   }
}

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Teclado U-Control
« Respuesta #11 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #12 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

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Teclado U-Control
« Respuesta #13 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.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Teclado U-Control
« Respuesta #14 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.


 

anything