Autor Tema: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c  (Leído 15211 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
« en: 05 de Febrero de 2011, 00:07:57 »
Hola a todos,
  
Desde hace semanas estoy liado un con un teclado de 4x4 y un PCF8574A, me quede atascado.
Por el momento me estoy leyendo un monton de hilos del foro,ya que los codigos fuentes , no me simulan bien,
pero "NINGUN" ejemplo de este foro me funciona por el momento.

La famosa función escanea teclado, no me funciona.
No he conseguido comprender fragmentos de  los codigos que hay por ahi.
Todos hacen los mismo o parecido y muy poco tienen comentarios de lo que hace el programa,
 por no decir, casi ninguno.

1.- Configuran el puerto para que una mitad sea de entradas y la otra mitad de salidas.
2.- para detectar tecla pulsada con la interrupcion externa del pic colocan la entrada a 1.
3.- para buscar tecla pulsada, dividne el teclado en filas y columnas.
4.- con un for "la mayoria" recorren filas y despues con otro for recorren las columnas.


Pero apartir de aca... no comprendo , las mascaras con las filas , las mascaras con las columnas.
Hasta el momento he intentado crear una gran variedad de librerias, con cachitos de otras, una idea de aqui,
otra de aya, pero a mi ninguna me funciono, cuando no eran pitos..., eran flautas y cuando no... pitos y flautas


He intentado modificar algunas :
Ejemplito SuKy

Ejemplito RedPic




Necesitaria que me ayudasen, o por lo menos si pasaron
ustedes por este problema me digan como salieron de el.  :(  

Un saludo.

======================
Enlaces relacionados con este tema.
(Leidos por el momento...y sigo...)

interrupcion externa, teclado matricial, 16f877a

Problema con teclado e Interrupcion RB en CCS y 16F877

Ejemplito 16F876A: Rastreando un Teclado Matricial 4x4 y enviando a la RS232

CONFIGURAR TECLADO 4X4 CON KBD2.C

teclado 4x4

Lectura de un Teclado Matricial 4x4 con un solo pin del PIC

Interrupciones externas se inician solas al principio!

Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech

Teclado Matricial 3x4 4x4


Foreros con página Web : Información, recursos, proyectos, ideas ...

 
« Última modificación: 21 de Marzo de 2011, 15:38:41 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #1 en: 05 de Febrero de 2011, 20:04:15 »
hola Suky,
tal como me dijise... ("Pregunta en el foro")

En este enlace a un compañero le indicas un codigo para el rastreo de teclado.

http://www.todopic.com.ar/foros/index.php?topic=26541.0 aqui

Respuesta 10 -13

he intentado analizar tu codigo y di algunas cosas por sentadas:
Asi que queria confirmarlas:

SI elegimos la respuesta 10, por ejemplo.

La libreria esta realizada para un teclado de 4x4 conectado a un puerto b de un pic.
De ese puesto B imagino que usaras la misma tecnica de una parte del puerto como entradas y otra  parte como salida.

Cuando pulsas tecla pones un Cero en entrada y asi sabes si se pulso.
¿Como se sabe cuales son las filas y cuales las columnas?
la variable filas es el seteo del puerto
  filas=0x0E    0000 1110  

 :: Preguntas ::

¿Por que te declaras un vector con una posición de más tiene que ver con el contador?
¿utilizas la variable filas para inicializar el puerto ?
¿a medida que verificas si se pulso cero vas contado teclas?
¿La rotacion a la derecha de fila, es para desplazar el cero a la izquierda?
¿esto de la rotacion tiene que ver con las mascaras que encontre en otras librerias?
¿para que se hace y cual es su utilidad?

La parte de la interrupcion no la entiendo pones el puerto como salidas
yo la quiero hacer con el la de externas(b0) se hace poniendola a 1.

Puedes responder a estas dudas.

Un saludo


« Última modificación: 10 de Febrero de 2011, 18:54:54 por pajaro »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #2 en: 05 de Febrero de 2011, 20:18:28 »
hola Suky,
tal como me dijise... ("Pregunta en el foro")

No respondo por MP  ;-)


En este enlace a un compañero le indicas un codigo para el rastreo de teclado.

Respuesta 10 -13

he intentado analizar tu codigo y di algunas cosas por sentadas:
Asi que queria confirmarlas:

SI elegimos la respuesta 10, por ejemplo.

La libreria esta realizada para un teclado de 4x4 conectado a un puerto b de un pic.
De ese puesto B imagino que usaras la misma tecnica de una parte del puerto como entradas y otra  parte como salida.

Cuando pulsas tecla pones un Cero en entrada y asi sabes si se pulso.
¿Como se sabe cuales son las filas y cuales las columnas?
la variable filas es el seteo del puerto
  filas=0x0E    0000 1110   

 :: Preguntas ::

¿Por que te declaras un vector con una posición de más tiene que ver con el contador?
¿utilizas la variable filas para inicializar el puerto ?
¿a medida que verificas si se pulso cero vas contado teclas?
¿La rotacion a la derecha de fila, es para desplazar el cero a la izquierda?
¿esto de la rotacion tiene que ver con las mascaras que encontre en otras librerias?
¿para que se hace y cual es su utilidad?

La parte de la interrupcion no la entiendo pones el puerto como salidas
yo la quiero hacer con el la de externas(b0) se hace poniendola a 1.

Puedes responder a estas dudas.

Un saludo


La idea es colocar 4 pines como salidas y seteandolas a 0, y 4 pines como entrada que mediante las resistencias pull-up leen un 1 lógico. Cuando una de las teclas es pulsada, une un pin de salida con uno de entrada, entonces si está habilitada la interrupción por cambio de estado se acciona.

Ahora, se sabe que hubo un cambio, y para saber cual ha sido se va colocando de a un pin (De los 4 como salida (1110, 1101,1011,0111)) el valor lógico 0 y comprobando las entradas. De esa manera se selecciona una fila y se recorre cada columna y se puede determinar cual tecla fue pulsada. Hay una variable que se utiliza para saber que teclas han sido recorridas, así cuando se sale del bucle sabemos la pulsada. esa misma variable se utiliza como indice para acceder a un arreglo que contiene el "significado" de la tecla.

Por aquí una nota de aplicación de Microchip donde se explica más detallado:

http://ww1.microchip.com/downloads/en/AppNotes/01081a.pdf


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #3 en: 06 de Febrero de 2011, 13:08:53 »
Hola suky

ya adapte el codigo para el expansor, pero siempre me saca 1 en el terminal virtual del simulador.

Código: C++
  1. char text_t(){
  2. char tecla[17]={'1','2','3','F',
  3.                 '4','5','6','E',
  4.                 '7','8','9','D',
  5.                 'A','0','B','C',' '};
  6.  int t,f,filas,ini_p;
  7.  filas=0x0E; //xxxx1110
  8.  ini_p=0xF0;//p0-p3 -->salidas,p4-p7-->entradas
  9.  expan_bus_rw(ini_p); //configuro puerto del expansor 0b11110000
  10.  t=0;                 //inicilizo contador de tecla  
  11.  for( f=0;  f<4; f++){
  12.    if(EXPAN_P0==0){break;}t++; //verifico si se pulso P0;incre nº tecla
  13.    if(EXPAN_P1==0){break;}t++; //verifico si se pulso P1
  14.    if(EXPAN_P2==0){break;}t++; //verifico si se pulso P2
  15.    if(EXPAN_P3==0){break;}t++; //verifico si se pulso P3
  16.    rotate_left(&filas,1);
  17.    expan_bus_rw(ini_p);         //inicializo de nuevo el puerto
  18.  }
  19. return tecla[t];
  20. }

al arrancar la simulacion me da 1, siempre da 1 pulses la que pulses.
Que le pude ocurrir.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #4 en: 06 de Febrero de 2011, 14:36:37 »
¿Como lees cada pin del expansor? ¿Como haces para cargar en el expansor una nueva configuración en sus salidas?
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #5 en: 06 de Febrero de 2011, 15:36:21 »
Hola Suky

Para la lectura del los pines del expansor utilizo una funcion que me dice que estado tiene ese pin
la cual redefino par usarla  en el for.

Código: C++
  1. // estado de pines del EXPANSOR BUS
  2. #DEFINE EXPAN_P0 i2c_pcf8574_get_io(M_BUS_RW,1,0)
  3. #DEFINE EXPAN_P1 i2c_pcf8574_get_io(M_BUS_RW,1,1)
  4. #DEFINE EXPAN_P2 i2c_pcf8574_get_io(M_BUS_RW,1,2)
  5. #DEFINE EXPAN_P3 i2c_pcf8574_get_io(M_BUS_RW,1,3)
  6. #DEFINE EXPAN_P4 i2c_pcf8574_get_io(M_BUS_RW,1,4)
  7. #DEFINE EXPAN_P5 i2c_pcf8574_get_io(M_BUS_RW,1,5)
  8. #DEFINE EXPAN_P6 i2c_pcf8574_get_io(M_BUS_RW,1,6)
  9. #DEFINE EXPAN_P7 i2c_pcf8574_get_io(M_BUS_RW,1,7)

con la segunda pregunta, si te refieres a como hago para poner el puerto en salida o entradas
uso otra funcion

Código: C++
  1. int8  ini_p=0x0E;
  2. expan_bus_rw(ini_p);



Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #6 en: 06 de Febrero de 2011, 15:54:56 »
Suponiendo que las i2c_pcf8574_get_io(M_BUS_RW,... estén correctas (seguramente ya las has probado), un problema puede ser expan_bus_rw(ini_p), si esa función escribe un valor en el puerto en los pines que están configurados como salida, tendrías que escribir el valor de la variable fila.

Una cosa es configurar el puerto del expansor y otro es escribir un valor.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #7 en: 06 de Febrero de 2011, 17:11:02 »
Hola Suky

La funcion expan_bus_rw(0b11110000), te pone la parte alta del expansor como entradas a y y la baja como salidas a 0.

corrigeme si me quivoco, si pones a 1 un puerto es entrada o salida, ... es  entrada seguro no.., ahora que dudo me estoy liando .

si ahora hago  expan_bus_rw(0b00001111), el bus se invierte lo que antes eran entradas ahora son salidas.
esa funcion si que va.

lo de escribir el valor de la varable filas,
en el puerto de mi simulador si pulso tecla del 1,  F1C1 me marca el expansor cambio de rojo a zul
como si se hubiera puesto a cero el P4, por la consola virtual me confirma que ese pin esta cero y el resto
tal como se inicilizaron.

se ve esto
P7......   P0
1111 0000
pulso tecla del 1

1110 0000
y me repite
1111 0000

por lo que sea no me identifica las columnas

y la tecla pulsada simpre es 1.
« Última modificación: 06 de Febrero de 2011, 17:14:48 por pajaro »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #8 en: 06 de Febrero de 2011, 19:41:34 »
Hola Suky

La funcion expan_bus_rw(0b11110000), te pone la parte alta del expansor como entradas a y y la baja como salidas a 0.

corrigeme si me quivoco, si pones a 1 un puerto es entrada o salida, ... es  entrada seguro no.., ahora que dudo me estoy liando .


En el datasheet seguro lo indica. En el PCA9538 que use yo, si es de esa manera. 1 -> entrada.

Cuando hablo de escribir en el puerto el valor de filas, sería aquí:

   rotate_left(&filas,1);
   expan_bus_rw(ini_p);         //inicializo de nuevo el puerto
   expan_bus_write(filas);           // o algo por el estilo ;)
 }


Ahora, el teclado tienes resistencias pull-up o pull-down en cada columna?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #9 en: 06 de Febrero de 2011, 20:18:05 »
Hola suky

El esquemita que tengo lo tengo como el archivo que adjunto

el programa principal tengo

Código: C#
  1. #include "main.h"
  2.  
  3. #int_EXT
  4. void  EXT_isr(void)
  5. {
  6.  printf("\r %c",text_t());
  7. printf("\r pines %d%d%d%d ",EXPAN_P7,EXPAN_P6,EXPAN_P5,EXPAN_P4);
  8. printf("%d%d%d%d ",EXPAN_P3,EXPAN_P2,EXPAN_P1,EXPAN_P0);
  9. }
  10.  
  11.  
  12.  
  13. void main()
  14. {
  15.    enable_interrupts(INT_EXT);
  16.    ext_int_edge( H_TO_L );
  17.    enable_interrupts(GLOBAL);
  18.    
  19.    port_b_pullups (0b00000001);
  20.    expan_bus_rw(0b00001111);
  21.     while(true){
  22.    
  23.    }
  24.  
  25. }


en el la funcion de escane a tengo

Código: C
  1. char text_t(){
  2.   char tecla[17]={'1','2','3','F',
  3.                   '4','5','6','E',
  4.                   '7','8','9','D',
  5.                   'A','0','B','C',' '};
  6.  int t,f,filas,ini_p;
  7.  filas=0x0E;                     //xxxx1110
  8.  ini_p=0xF0;                    //inicializo varible para los puertos
  9.  expan_bus_rw(ini_p);     //configuro puerto del expansor 0b11110000
  10.  t=0;                              //inicio contador de tecla
  11.  for( f=0;  f<4; f++){
  12.    if(EXPAN_P0==0){break;}t++; //verifico pulsacion de tecla; incremento contador
  13.    if(EXPAN_P1==0){break;}t++;
  14.    if(EXPAN_P2==0){break;}t++;
  15.    if(EXPAN_P3==0){break;}t++;
  16.    rotate_left(&filas,1);                 //rota la fila
  17.    expan_bus_rw(filas);                // escribo fila rotada
  18.  }
  19. return tecla[t];
  20. }


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #10 en: 06 de Febrero de 2011, 20:30:23 »
Como sabes con la función expan_bus_rw() cuando quieres configurar el "tris" y cuando quieres escribir en el puerto?   :?

Ahora en el debug que realizas debes darte cuenta que P0-P3 en estado normal deberia estar en 1 y no en cero, o sino invertir la lógica, o sea:

   if(EXPAN_P0==1){break;}t++; //verifico pulsacion de tecla; incremento contador
   if(EXPAN_P1==1){break;}t++;
   if(EXPAN_P2==1){break;}t++;
   if(EXPAN_P3==1){break;}t++;


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #11 en: 06 de Febrero de 2011, 21:22:18 »
Como sabes con la función expan_bus_rw() cuando quieres configurar el "tris" y cuando quieres escribir en el puerto?   :?

Ahora en el debug que realizas debes darte cuenta que P0-P3 en estado normal deberia estar en 1 y no en cero, o sino invertir la lógica, o sea:

   if(EXPAN_P0==1){break;}t++; //verifico pulsacion de tecla; incremento contador
   if(EXPAN_P1==1){break;}t++;
   if(EXPAN_P2==1){break;}t++;
   if(EXPAN_P3==1){break;}t++;


Saludos!

if(EXPAN_P0==1){break;}t++;
if(EXPAN_P0==0){break;}t++;

no se por que pero el resultado es el mismo

EXPAN_P0

Lo obtengo de:

#DEFINE   EXPAN_P0     i2c_pcf8574_get_io(M_BUS_RW,1,1)  //retorna int la funcion


i2c_pcf8574_get_io(M_BUS_RW,1,1) es una funcion que me dice si el pin 1 de la direccion 1 de M_BUS_RW

se encuentra a 0 o a 1.

M_BUS_RW ---> es un define  de

#DEFINE M_BUS_RW     0b01110010   //0x72    modo escritura  del  PC8574A

Respecto a esa pregunta  del tris te refieres a decirle que pines son de entradas y cuales de salida?
, puedes describir lo de escribir en el puerto, no he comprendido, a lo mejor viene por ahi, el problema.... .

con expan_bus_rw(int dato)

lo que hace es mediante el bus i2c le dices que en la direccion del expasor escribes el dato
por ejemplo, cuando inicializo el puerto.

le digo del p0 al p3 entradas  el resto salidas hago expan_bus_rw(0b00001111).


Me da la impresion de que algo se me escapa.


« Última modificación: 06 de Febrero de 2011, 21:25:08 por pajaro »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #12 en: 06 de Febrero de 2011, 21:51:48 »
Respecto a esa pregunta  del tris te refieres a decirle que pines son de entradas y cuales de salida?
, puedes describir lo de escribir en el puerto, no he comprendido, a lo mejor viene por ahi, el problema.... .

Ese expansor puede configurar sus pines? O sea, unos como entrada y otros como salida? Cuando le indicas al expansor que pines quieres como salida y que pines como entrada?

En este caso necesitas 4 como entradas (pines de las columnas) y 4 como salidas (pines de las filas). Relee desde el primer mensaje, y revisa la nota de aplicación de Microchip... También lee el datasheet del expansor, para saber configurarlo


Escribir, es setear un valor en los pines configurados como salida.


Éxitos con el proyecto.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #13 en: 07 de Febrero de 2011, 18:08:48 »
Hola ,sigo aqui..

Parece que me quede solo en esto.Bueno seguiremos.

He estado mirando el codigo, ¿como soluciono el tema que me repita la lectura?
es como si hubiera un rebote al pulsar tecla, me lee la entrada dos veces seguidas,
al pulsar tecla y cuando se pone de nuevo al valor por defecto.

Al arrancar la simulacion tambien me lee sin, yo pulsar tecla.

es decir si tengo.

1111 0000  cuando arranca el simulador

y pulso tecla  :-/

1110 0000 tecla pulsada mantenida

1111 0000 tecla cuando suelto

se produce un cambio de interrupcion, en el PCF8574


¿como se puede solucionar esto...?
Le paso a alguien esto antes.

Un saludo.


« Última modificación: 10 de Febrero de 2011, 19:12:48 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: HELP ME... - Teclado 4x4 con PCF8574 i2c
« Respuesta #14 en: 09 de Febrero de 2011, 01:04:58 »
Hola compis
Solucione uno de los problemas,
La cosa era que cada vez que se arrancaba la simulación, es decir
saltaba la interrupción, sin yo pulsar tecla.

Consegui solucionarlo:

Código: C++
  1. //primero configuro el puerto del espansionador  luego activare las interrupción
  2.    //con ello evito que me salte la interrupcion al principio sin pulsar tecla.
  3.    expan_bus_rw(0b00001111);
  4.    
  5.    //port_b_pullups (0b00000001);
  6.    ext_int_edge( H_TO_L );
  7.    clear_interrupt(INT_EXT);   //esto tambien hace falta para lo del principio
  8.    enable_interrupts(INT_EXT);
  9.    enable_interrupts(GLOBAL);

Ese problema solventado.
-----------------------------

Ahora queda el problema :

El expansor BUS i2c cuando detecta un cambio de estado en sus entradas
produce una interrupción.

Cual es el problema?, cuando pulso tecla cambia el estado, pero cuando suelto tecla
vuelve a cambiar, por eso me lee dos veces, porque me produce dos interrupciones.

Alguien sabe como solucionar el problema.




« Última modificación: 10 de Febrero de 2011, 19:16:49 por pajaro »


 

anything