TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pajaro en 05 de Febrero de 2011, 00:07:57

Título: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro 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 (http://www.todopic.com.ar/foros/index.php?topic=26541.msg218058#msg218058)

Ejemplito RedPic (http://www.todopic.com.ar/foros/index.php?topic=4807.msg36881#msg36881)




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 (http://www.todopic.com.ar/foros/index.php?topic=33508.msg280373#msg280373)

Problema con teclado e Interrupcion RB en CCS y 16F877 (http://www.todopic.com.ar/foros/index.php?topic=32772.0)

Ejemplito 16F876A: Rastreando un Teclado Matricial 4x4 y enviando a la RS232 (http://www.todopic.com.ar/foros/index.php?topic=4807.msg36881#msg36881)

CONFIGURAR TECLADO 4X4 CON KBD2.C  (http://www.todopic.com.ar/foros/index.php?topic=26541.msg217695#msg217695)

teclado 4x4 (http://www.todopic.com.ar/foros/index.php?topic=31371.msg261309#msg261309)

Lectura de un Teclado Matricial 4x4 con un solo pin del PIC  (http://www.todopic.com.ar/foros/index.php?topic=18911.msg133263#msg133263)

Interrupciones externas se inician solas al principio!  (http://www.todopic.com.ar/foros/index.php?topic=31073.msg259174#msg259174)

Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech  (http://www.todopic.com.ar/foros/index.php?topic=26435.msg216627#msg216627)

Teclado Matricial 3x4 4x4  (http://www.todopic.com.ar/foros/index.php?topic=13621.msg79592#msg79592)


Foreros con página Web : Información, recursos, proyectos, ideas ...  (http://www.todopic.com.ar/foros/index.php?topic=8119.msg57238#msg57238)

 
Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro 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 (http://www.todopic.com.ar/foros/index.php?topic=26541.0)

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


Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: Suky 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!
Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro 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.
Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: Suky 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?
Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro 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);


Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: Suky 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!
Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro 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.
Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: Suky 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!
Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro 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. }

Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: Suky 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!
Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro 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.


Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: Suky 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!
Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro 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.


Título: Re: HELP ME... - Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro 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.




Título: Re: HELP ME... - Teclado 4x4 con PCF8574 i2c
Publicado por: AngelGris en 09 de Febrero de 2011, 09:42:57
  Como la interrupción se genera por cambio de estado siempre se van a generar interrupciones cuando presionás o cuando soltás una tecla. También pasa cuando usas directamente el puerto B de por ejemplo un PIC16.

  Cuando mostrás tu función de escaneo uno de los dígitos devueltos es ' ' (espacio), ¿Cuándo devuelve eso? Porque bien podrías verificar que si el caracter devuelto es el ' ' (espacio) no hay tecla presionada.

  Sino se puede recurrir a leer el puerto antes de llamar a la función de escaneo.

  Supongamos que en reposo tu puerto está de la siguiente manera, 11110000. Si presionás una tecla va a cambiar, si luego la soltás te genera otra interrupción pero el estado del puerto vuelve a ser 11110000.
  Entonces al leer el puerto y encontrarte con 11110000 quiere decir que no hay tecla presionada.
Título: Re: HELP ME... - Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 09 de Febrero de 2011, 10:58:04
Hola AngelGris

Lo de del espacio es para  el contador, cuando verifica si se pulso tecla si recorre
todas las filas y columnas y no se pulso tecla te da  la ultima posicion yo le puse " " espacio en blanco
podia haberle puesto Z, o Q de que llego al final y no en contro tecla.

Pero me has dado una idea,
 si pulso tecla y me genera una interrupcion, al pulsar me genera otra siendo este puerto
de entrada, podria poner este puerto al  pulsar como salida, asi cuando se levantara la tecla
no lo detectaria como entrada.
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 10 de Febrero de 2011, 19:44:21
Hola compañeros

Una vez más he conseguido avanzar.
He resuelto el problemilla de doble lectura que tenia cuando pulsaba tecla,
y soltaba tecla.

La cosa era que se producia cambio cambio de estado en las entradas del expansor y me
producia interrupcion.

Lo he solucionado, de forma que cuando pulso tecla esa entrada se coloca como salida.
y solo se produce una interupcion.

La funcion main seria.

Código: C++
  1. #include <16F877A.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6. #FUSES NOPUT                    //No Power Up Timer
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NODEBUG                  //No Debug mode for ICD
  9. #FUSES NOBROWNOUT               //No brownout reset
  10. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  11. #FUSES NOCPD                    //No EE protection
  12. #FUSES NOWRT                    //Program memory not write protected
  13. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  14.  
  15. #use delay(clock=20000000)
  16. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  17. #use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
  18.  
  19. #include "pcf8574.c"
  20. #include "expan_i2c_01.c"
  21.  
  22. //------------------------------------------------------------------------------------
  23.  
  24.  
  25.  
  26. #int_EXT
  27. void  EXT_isr(void) {
  28.         printf("\r pines %d%d%d%d ",EXPAN_P7,EXPAN_P6,EXPAN_P5,EXPAN_P4);
  29.         printf("%d%d%d%d ",EXPAN_P3,EXPAN_P2,EXPAN_P1,EXPAN_P0);
  30.         printf("\r tecla: %c",text_t());
  31. }
  32.  
  33.  
  34.  
  35. void main(){
  36.    //primero configuro el puerto del espan luego activare las interupcion
  37.    //con ello evito que me salte al principiosin pulsar tecla.
  38.    
  39.    expan_bus_rw(0b00001111);
  40.    
  41.    port_b_pullups (0b00000001);
  42.    ext_int_edge( H_TO_L );
  43.    clear_interrupt(INT_EXT);//esto tambien hace falta para lo del principio
  44.    enable_interrupts(INT_EXT);
  45.    enable_interrupts(GLOBAL);
  46.    
  47.     // TODO: USER CODE!!
  48.    while(true){
  49.    
  50.    }
  51.  
  52. }

La funcion escanea o busca tecla nos quedaria asi:

Código: C++
  1. char text_t(){
  2.    int t,f,filas,ini_p;
  3.    char tecla[17]={'1','2','3','F',
  4.                    '4','5','6','E',
  5.                    '7','8','9','D',
  6.                    'A','0','B','C','Z'};
  7.  
  8.  filas=0xEF;
  9.  ini_p=0x0F;
  10.  //expan_bus_rw(ini_p); //configuro puerto del expansor 0b00001111
  11.  //delay_ms(50);
  12.  t=0;                 //iniciliazo contador de tecla  
  13.  for( f=0;  f<4; f++){
  14.    //printf("\r  t: %d, f: %d",t,f);
  15.    expan_bus_rw(filas);
  16.    //rotate_left(&filas,1);
  17.    delay_ms(20);
  18.    if(EXPAN_P0==0){break;}t++; //verifico si se pulso P0;incre nº tecla
  19.    if(EXPAN_P1==0){break;}t++; //verifico si se pulso P1
  20.    if(EXPAN_P2==0){break;}t++; //verifico si se pulso P2
  21.    if(EXPAN_P3==0){break;}t++; //verifico si se pulso P3
  22.    //printf("\r  t: %d, f: %d",t,f);
  23.    rotate_left(&filas,1);
  24.    //expan_bus_rw(filas);        //inicializo de nuevo el puerto
  25.   }
  26. //disable_interrupts(INT_EXT);
  27. expan_bus_rw(ini_p);             //inicializo los puerto como al principio
  28. //enable_interrupts(INT_EXT);
  29. return tecla[t];
  30. }



Ahora nos imprime solo cuando pulsamos tecla,
lo malo es que tenemos que resetear el simulador
para poder pulsar otra tecla nueva.

Además solo me reconode la primera fila.

De nuevo tenemos otros dos nuevo errores.

Si pulsamos la tecla F
nos dice :

Pines 0000 0111
Tecla:F

Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pocher en 11 de Febrero de 2011, 09:14:53
Solo me he mirado por encima los mensajes de este tema.

Añadir por si es de utilidad que cuando yo realicé el teclado con el PCF8574 en PROTEUS no funcionaba, lo probe en real y sí que funcionaba.
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 14 de Febrero de 2011, 20:31:52
Solo me he mirado por encima los mensajes de este tema.

Añadir por si es de utilidad que cuando yo realicé el teclado con el PCF8574 en PROTEUS no funcionaba, lo probe en real y sí que funcionaba.

Hola amigo Pocher
Podrias fijarte unicamente en el post anterior al que escribiste, en la funcion text_t().
me gustaria que me dijeras si hay algo que no te cuadra.

Agredezco toda ayuda, que me puedan brindar ustedes los maestros.

Un saludo.
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 13 de Marzo de 2011, 20:48:32
Hola Amigos,

Despues de algun tiempo con otros problemas,
retomamos el problema de controlar un teclado tipo matriz 4x4
con un expansor PCF8574 o PCF8574A.

el circuito se quiere simular con proteus, para ello se hace uso de:

PIC16F877A --> microControlador.
PCF8574      --> Expansor del bus I2C
Teclado 4x4 --> Teclado matricial 4x4 de 16 teclas.

--------------------------------------

Se sabe que el expansor se puede configurar sus puertos como entradas o como salidas.
un cambio  de estado en las entradas produce una interrupcion en el expansor, permaneciendo el estado de la entrada.

La idea es poner de los 8 puertos mitad como entrada (en rojo en proteus) 1 y mitad salida (azul en proteus) 0, para evitar contocircuito en los puertos se pone una resistencias.

--------------------------------------------------------

para buscar tecla pulsada:
configuramos anteriormente como 0x0F es decir
                                         columnas    filas
                                             0 0 0 0   1 1 1 1
puerto del expansor:
                                             0 1 2 3   4 5 6 7

los puertos del teclado son:
                                             1 2 3 4   5 6 7 8

del 1 al 4 son columnas y del 5 al 8 filas

asi pues pondremos las filas como entradas , al pulsar tecla esta se pondra a 0, la fila
pero ¿como sabemos la columna  de pulso la tecla?,
pues bien cambiamos la polaridad del puerto lo que antes fue 0 ahora es 1 de esta forma
las columnas se ponen como entradas y las filas como salidas.

De esta forma sabemos la fila y la columna que se pulso.
para calcular la tecla correpondiente se hace un simple calculo:

la posicion:

mi_tecla=(Fila x 4) + Columna
mi_tecla se puede iniciar a un valor  -1 por ejemplo.

tanto la fila como la columna empiezan en 0

El numero de teclas del teclado es: [posicion]

0  1  2  3
4  5  6  7
8  9  A  B
C D  E  F


su serigrafia o letras pintadas son: [serigrafia]

1  2  3  F
4  5  6  E
7  8  9  D
A  0  B  C


un Ejemplo:
si pulsamos la tecla con la serigrafia 7,
esto sera la columna 0 y la fila 2

si le aplicamos la formula seria:
(Fila x 4 )+ Columna
    (2 x 4)+ 0

La posicion es 8.

continuara....
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: AngelGris en 13 de Marzo de 2011, 21:08:29
  Primero, Proteus dibuja un cuadradito rojo cuando hay un estado alto y un cuadradito azul cuando hay un estado bajo.
No es que dibuje rojo cuando está como entrada y azul cuando está como salida.

  Lo que hay que cambiar en los puertos no es que funcione como entrada o salida sino el dato que está saliendo del puerto. El dato de salida también dependerá si en las entradas se están utilizando resistencias de pull-up o resistencias de push-down
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 13 de Marzo de 2011, 23:15:43
  Primero, Proteus dibuja un cuadradito rojo cuando hay un estado alto y un cuadradito azul cuando hay un estado bajo.
No es que dibuje rojo cuando está como entrada y azul cuando está como salida.

  Lo que hay que cambiar en los puertos no es que funcione como entrada o salida sino el dato que está saliendo del puerto. El dato de salida también dependerá si en las entradas se están utilizando resistencias de pull-up o resistencias de push-down

Hola AngelGris

¿Has simulado alguna vez un teclado con PCF8574A?, ¿Te funciono bien?
Un saludo
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: AngelGris en 13 de Marzo de 2011, 23:34:05
  Siempre que simulé teclados lo hice conectándolos directamente al PIC. Pero la idea de funcionamiento es la misma....

  Supongamos que utilizas resistencias de pull-up en los bits de entrada, por lo tanto, al hacer una lectura cuando no haya tecla presionada, todos los bits (de entrada) estarán en 1. Supongamos también que la filas son entradas y las columnas son salidas.

  Configuración de puerto 11110000. El bit 0 correspondiendo a la primer columna, el bit 6 correspondiendo a la primer fila.


  En primera instancia se dejan todos lo bits de salida en 0. Así cualquier tecla que se presione puede provocar un cambio de estado en las entradas.

  Una vez que se detecta un cambio de estado (que indica que se presionó alguna tecla), se modifican las salidas para que sólo la columna 1 esté en 0. Se vuelve a leer las entradas, si se lee todo 1 nos indica que la tecla presionada no es de la columna 1. Entonces seguimos barriendo las columnas poniendo en 0 sólo la columna 2, se leen nuevamente las entradas y si es todo 1 la tecla presionada no pertenece a la columna 2. Repetimos el paso con la siguiente columna, poniendo en 0 sólo la columna 3 y leyendo nuevamente las entradas, si ahora encontramos un valor que no sea todo 1 (supongamos 0111) sabemos que la tecla presionada es la que se encuentra en la columna 3 y la fila 4.
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pocher en 14 de Marzo de 2011, 05:17:29
Veo pajaro que le has hechado horas, intentando resolver este proyecto.

He buscado el que me funcionaba físicamente (no funcionaba con PROTEUS) y te lo dejo.

La librería no es mía, es una adaptación posiblemente de otra adaptación, yo también creo que le cambié algunas cosas.

Un saludo

Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 14 de Marzo de 2011, 10:44:47
 Siempre que simulé teclados lo hice conectándolos directamente al PIC. Pero la idea de funcionamiento es la misma....

  Supongamos que utilizas resistencias de pull-up en los bits de entrada, por lo tanto, al hacer una lectura cuando no haya tecla presionada, todos los bits (de entrada) estarán en 1. Supongamos también que la filas son entradas y las columnas son salidas.

 
Configuración de puerto 11110000. El bit 0 correspondiendo a la primer columna, el bit 6 correspondiendo a la primer fila.



  En primera instancia se dejan todos lo bits de salida en 0. Así cualquier tecla que se presione puede provocar un cambio de estado en las entradas.

  Una vez que se detecta un cambio de estado (que indica que se presionó alguna tecla), se modifican las salidas para que sólo la columna 1 esté en 0. Se vuelve a leer las entradas, si se lee todo 1 nos indica que la tecla presionada no es de la columna 1. Entonces seguimos barriendo las columnas poniendo en 0 sólo la columna 2, se leen nuevamente las entradas y si es todo 1 la tecla presionada no pertenece a la columna 2. Repetimos el paso con la siguiente columna, poniendo en 0 sólo la columna 3 y leyendo nuevamente las entradas, si ahora encontramos un valor que no sea todo 1 (supongamos 0111) sabemos que la tecla presionada es la que se encuentra en la columna 3 y la fila 4.




Hola AngelGris,
si ponemos las filas como entrada (cuadrito rojo proteus )y las columnas como salida (Cuadrito azul proteus)

puertos
expansor   teclado

P0            T1
P1            T2
P2            T3
P3            T4
P4            T5
P5            T6
P6            T7
P7            T8

filas                 del teclado   T1-T2-T3-T4
columnas         del teclado   T5-T6-T7-T8

configuracion del puerto del expansor PCF8574x
                 columnas         filas
                 4   3  2  1      4  3  2  1

bit             7   6  5  4      3  2  1  0
estado       0   0  0  0      1  1  1  1

expansor   7   6   5  4     3   2  1  0
teclado      8   7   6  5     4   3  2  1

Quisiste decir esto:

bit 0     fila      1
bit 1     fila      2
bit 2     fila      3
bit 3     fila      4

bit 4  columna 1
bit 5  columna 2
bit 6  columna 3
bit 7  columna 4





Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: AngelGris en 14 de Marzo de 2011, 12:03:42
si ponemos las filas como entrada (cuadrito rojo proteus )y las columnas como salida (Cuadrito azul proteus)

  Olvidate de eso, no es así. El cuadradito rojo indica un nivel alto y el azul un nivel bajo. Vos podés tener un puerto configurado como salida, pero si el dato es 1 también te va a mostrar un cuadradito rojo.

  supongamos que se tiene el siguiente teclado

(http://s4.postimage.org/1iy30x10k/teclado.jpg) (http://postimage.org/image/1iy30x10k/)

  y lo tenemos conectado de la siguiente manera

 expansor                      teclado
 P0 (bit 0)                     1 (columna 1)
 P1 (bit 1)                     2 (columna 2)
 P2 (bit 2)                     3 (columna 3)

 P4 (bit 4)                     A (fila 1)
 P5 (bit 5)                     B (fila 2)
 P6 (bit 6)                     C (fila 3)
 P7 (bit 7)                     D (fila 4)

  Configurás los bits 4 a 7 como entradas y los 0 a 2 como sallida.

 En primera instancia se dejan todas las salidas con el dato 0. No confundir el tipo de puerto (entrada o salida) con el dato que tiene el puerto.

  Cuando una tecla es presionada, se genera un cambio de estado en algunos de los pines configurados como entrada.
  Ahora se comienza el barrido del teclado haciendo lo siguiente

  Poner un 0 en P0, mientras que P1 y P2 tienen que ser 1. Esto es el dato de salida que tiene que haber en el puerto.
  Se leen los puerto de entrada. Si todas las entradas indican 1 es porque la tecla presionada no pertenecía a la columna 1. Esto se entiende debido a que  la columna 1 tiene un 0, si yo hubiese pulsado cualquier tecla perteneciente a dicha columna, una de las filas debería tener el dato 0.

  Si el valor leído (en los pines configurados como entrada) eran todos 1 eso indicaba que la tecla no pertenecía a la columna 1.
  Ahora se pone a 0 P1 y se deja en 1 P0 y P2.
  Se leen los puertos de entrada. Si alguna entrada está en 0, quiere decir que la tecla pertenece a la columna 2. Porque toda la columna 2 está en 0 y si presiono alguna tecla de dicha columna el 0 se vera en uno de los pines de entrada..

  Si el dato leído era todo 1, se repite el paso para la columna 3.

  Al finalizar todo el proceso de barrido del teclado hay que volver a dejar todas las columnas en 0.

  Como se observa basta con saber que columna está en 0 y que fila está en 0 para saber que tecla está presionada.

  Ejemplo: si presiono la tecla 8 sólo la columna 2 estará en 0 y sólo  la fila 3 estará en 0.
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 15 de Marzo de 2011, 18:21:42
Hola AngelGris,

breve analisis y sistesis de lo escrito por el compañero.


- cofiguro puertos del expansor.


P0 (bit 0)  -  T1   C1    0
P1 (bit 1)  -  T2   C2    0
P2 (bit 2)  -  T3   C3    0
P3 (bit 3)  -  T4   C4    0
P4 (bit 4)  -  T5   F1    1
P5 (bit 5)  -  T6   F2    1
P6 (bit 6)  -  T7   F3    1
P7 (bit 7)  -  T8   F4    1

filas     entradas (1)  P4-P7
columnas  salida   (0)  P0-P3

el teclado tiene 3x4 asi que c4 la podemos dejar sin conectar o
asignarle un valor como si estubiera conectada y poder usar un teclado 4x4




configuro puerto del expansor:  escribo 0xF0

si pulso tecla cambia las entradas (filas):

pongo dato en columnas (escribo dato en columnas[salidas])  1110

-- analizando esto : solo la columna 1 podra pasar el 0

                       (leo dato de filas[entradas])  

puerto bus               I/O   RW
P0 (bit 0)  -  T1   C1    0    0
P1 (bit 1)  -  T2   C2    0    1
P2 (bit 2)  -  T3   C3    0    1
P3 (bit 3)  -  T4   C4    0    1
P4 (bit 4)  -  T5   F1    1    ?  
P5 (bit 5)  -  T6   F2    1    ?
P6 (bit 6)  -  T7   F3    1    ?
P7 (bit 7)  -  T8   F4    1    ?

creo que hay un pequeño lio entre las entradas y las salidas.


Volvemos a empezar: ...

1.- configuro el expansor de esta forma

  
Px -> puerto del expansor
Tx -> puerto del teclado
Cx -> columnas del teclado
Fx -> Filas    del Teclado
0/1 -> configuracion del puerto
0 -> salidas
1 -> entradas

P0 (bit 0)  -  T1   C1    0
P1 (bit 1)  -  T2   C2    0
P2 (bit 2)  -  T3   C3    0
P3 (bit 3)  -  T4   C4    0
P4 (bit 4)  -  T5   F1    1
P5 (bit 5)  -  T6   F2    1
P6 (bit 6)  -  T7   F3    1
P7 (bit 7)  -  T8   F4    1

--------------------------------
hasta aqui todo va bien

en la simulacion si unimos el expansor y el teclado sin ponerle las resistencias
para evitar el corto circuito del expansor.

cambia el estado de las entradas no de las salidas.
independientemente sean 0xF0 o 0x0F.

Lo verificamos con el proteus.
probamos a inicializar los puertos del expansor pero con 0xF0 y probamos a pulsar.
despues cambimos la inicilizacion del expansor con 0x0F y probamos a pulsar



cuando se produce un cambio de estado en las entradas se produce interrupcion.

--------------------------------
hasta aqui todo va bien

si ahora le colocamos las resistencias para evitar que se cortocircuiten los puertos del expansor,
empiezan las cosas raras.

no es lo mismo una resitencias analogica, que una digital.
no es lo mismo poner las resistencias en las filas, que en las columnas.
si ademas quiero ponerle un led que cuando se pulse tecla se encienda el led la cosa se complica.


 


Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: AngelGris en 15 de Marzo de 2011, 22:06:13
  Hola pajaro, fijate en el comentario del colega pocher

.............
He buscado el que me funcionaba físicamente (no funcionaba con PROTEUS) y te lo dejo.
............

  Tal vez estés teniendo algún error simplemente porque el proteus falla al simular el expansor
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 17 de Marzo de 2011, 19:01:56
hola Amigos

sigo con el teclado y el expansor, lo probe fisicamente y decta las teclas pulsada,
pero hay otro problema.

Mi teclado es este:

1 2 3 F
4 5 6 E
7 8 9 D
A 0 B C

aqui debajo los pines de conesiones
1234 5678

1-4 columnas
5-8 Filas

Pues bien el problema es
que si pulso 1 coincide dice en el lcd:
Codigo tecla: 1
Tecla:1

lo mismo para: 5, 9 y C
creo que es porque coinciden, el valor de la fila y el de la columna.

-------------

ahora vienen los problemas:

si pulso 2 me dice que es 4
si pulso 3 me dice que es 7
si pulso F me dice que es A

Es como si estubieran cambiadas las filas y las columnas.

------------------------------
Haciendo más pruebas:
añado una linea al programa

printf(lcd_putc,"dato:%2x f: %2d, c: %2d",datos,f,c);
con ella se que dato hay la fila y la columna de la tecla.
mientras este pulsada, si la suelto se pone la ultima.

pues bien.
Las conexiones fisicas del expansor las tengo de tal forma:

patita    12  11  10   9    4   3   2   1     expansor

bit          7    6    5   4    3   2   1   0     expansor

invertido 8    7    6   5   4    3   2   1    teclado


nada sigue dando problemas

tambien anote el dato que me sacaba en pantalla



ordenado por filas:
===================

tecla - dato      su binario

1 - ee   1110 1110
2 - ed   1110 1101
3 - eb   1110 1011
F - e7   1110 0111

4 - de   1101 1110
5 - dd   1101 1101
6 - db   1101 1011
E - d7   1101 0111

7 - be   1011 1110
8 - bd   1011 1101
9 - bb   1011 1011
D - b7   1011 0111

A - 7e   0111 1110
0 - 7d   0111 1101
B - 7b   0111 1011
C - 77   0111 0111



 

ordenado por Columnas:
===================

tecla - dato      su binario

1 - ee   1110 1110
4 - de   1101 1110
7 - be   1011 1110
A - 7e   0111 1110

2 - ed   1110 1101
5 - dd   1101 1101
8 - bd   1011 1101
0 - 7d   0111 1101

3 - eb   1110 1011
6 - db   1101 1011
9 - bb   1011 1011
B - 7b   0111 1011

F - e7   1110 0111
E - d7   1101 0111
D - b7   1011 0111
C - 77   0111 0111



 


analizando el codigo leo:
 if (!bit_test(dato,4)) c=1;

esta funcion que hace, realmente ?

bit_test(variable,bit);
 testea el bit de la variable..

si el bit 4 de la variable dato es distinto es la columna 1.

¿Es correcta esta interpretación?


Un saludo


Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 18 de Marzo de 2011, 08:12:45
Hola Amigos

Sigo con la batalla del expansor...


Analizando el codigo del  amigo porcher...

en la funcion

dato=PCF8574_Lee();

int8 PCF8574_Lee(void)
{
      int8 dato;
      i2c_start();                   // Start condition
      i2c_write(PCF8574A_Lectura);   // Device address   (Aqui INT pasa otra vez a 1)
      //dato = i2c_read();            //original
      dato = i2c_read(0);
      i2c_stop();                    // Stop condition
      return dato;
}


esta linea

 dato = i2c_read(0);

nos lee el dato ,pero la pregunta es
¿por donde empieza leyendo?


Algun amigo sabe que le esta ocurriendo...
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: AngelGris en 18 de Marzo de 2011, 09:03:12

.............

esta linea

 dato = i2c_read(0);

nos lee el dato ,pero la pregunta es
¿por donde empieza leyendo?


Algun amigo sabe que le esta ocurriendo...


  ¿Como por donde empieza leyendo?

  Para mi, lo que hace esa función es leer el dato que tiene el puerto del expansor, No es que lee bit a bit sino que lee los 8 bits juntos.

  Por ejemplo si el integrada está configurado con el nibble alto como entrada y el nible bajo como salida, y suponiendo que las salidas están todas en 0 y que el bit 7 (que es entrada) está en 0 porque hay una tecla presionada, la lectura será

0111 para el nible alto. Para el nibble bajo hay que ver como trabaja el expansor. Si fuera como el puerto de los PIC se lee el mismo dato que tiene a la salida, por lo tanto el nibble bajo sería 0000. Quedando, de esta manera, el dato leido como

01110000
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 19 de Marzo de 2011, 16:49:48
hola AngelGris

columnas entradas
filas salidas;

fila:0xfe -> 1111 1110

ponemos el puerto

columnas   filas

1111       1110

si pulso tecla del 1
es fila 1 columna 1
por lo tanto quedara asi

1110 1110
y es asi porque dato nos dice que es "ee"

si pulso la tecla del 2
es fila 1 columna 2
por lo tanto seria
1101 1110 esto seira "de"

por el contrario fisicamente
al pulsar la tecla del 2

me la reconocecomo si hubiera pulsado
la tecla del 4.

la tecla del cuantro es
fila 2 columna 1

1110 1101

de esto deduzco que estan cambiadas filas por columnas
si pulso las tecla de la primera fila me las reconoce como si fueran las teclas
de la primera columna.

esto es :
si pulso estas teclas

1 - ee   1110 1110  
2 - ed   1110 1101
3 - eb   1110 1011
F - e7   1110 0111

me las reconoce asi

1 - ee   1110 1110
4 - de   1101 1110
7 - be   1011 1110
A - 7e   0111 1110

en el codigo, en la linea de

 if (!bit_test(dato,4)) c=1;

si dato es 4 c=1...

aqui hay algo que NO me cuadra

si tiene que mirar si el bit 4 del bit es distinto

como va esto ...




este es el codigo:


//------------------------
   int8 f,c,datos;
   signed int8 dato=-1;
   int8 fila=0b11111110;     //Primera fila (P0=1)

   for (f=0; f<4; f++)     //Recorre las 4 filas (lineas)
   {
      PCF8574_Escribe(fila);
      delay_ms(20);                //Para que le de tiempo a escribir
      dato=PCF8574_Lee();      
      c=0;
      if (!bit_test(dato,4)) c=1;             //Col 1 4
      else if (!bit_test(dato,5)) c=2;        //Col 2 5
      else if (!bit_test(dato,6)) c=3;        //Col 3 6
      else if (!bit_test(dato,7)) c=4;        //Col 4 7
      if(c) break;                             //Si c es distinto de 0 sale del for
      rotate_left(&fila, 1);     //Siguientes filas, va desplazando el 0 hacia la izquierda  
   }  
datos=dato;
   if(c)
      dato=(f*4)+c;
   else
      dato=-1;                      //Ninguna tecla pulsada

   PCF8574_Escribe(0b11110000);     //Vuelve a poner como salida (0) las Lineas
 
//------------------------


Un Saludo

Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 20 de Marzo de 2011, 19:26:26
hola amigos

Resolvi parte del enigma del cambio de filas y columnas.
Al parecer al hacer la conexion, invertia el conector, por eso hacia esas cosas raras.

Pero aun asi no termina de sacar la tecla correspondiente.

Al parecer el diseño se corresponde con una posición del bus en los pines del conector y
una posicion de la serigeria o numeros de las teclas del teclado.

En mi caso mi teclado tiene los pines debajo de las letras en vez de encima,
de esta forma debo de rotar 180 grados las teclas

una vez colocado el puerto del expansor y puertos del teclado asi:

                  columnas      filas
io expansor  1  1  1  1      0  0  0  0

expansor     7  6  5  4      3  2  1  0
teclado        1  2  3  4      5  6  7  8


si pulso la letra de la tecla 1 me imprime la C
si pulso la letra de la tecla 2 me imprime la B
si pulso la letra de la tecla 3 me imprime la 0
si pulso la letra de la tecla F me imprime la A

es decir:

1 2 3 F
4 5 6 E
7 8 9 D
A 0 B C

lo reconoce como

C B 0 A
D 9 8 7
E 6 5 4
F 3 2 1

si solo cambio el valor de la variable C
de forma de

c=1 por c=4
c=2 por c=3
c=3 por c=2
c=4 por c=1

esto me pruduce que gire el teclado 90 grados

me los reconoce asi

A 0 B C
7 8 9 D
4 5 6 E
1 2 3 F

como hago para cambiar el orden de las fila..?


Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: AngelGris en 21 de Marzo de 2011, 10:17:54
  Algo sencillo de hacer es medir la continuidad entre los distintos pines del conector mientras presionas las distintas teclas de esa manera vas a saber con certeza que pin corresponde a cada fila y que pin corresponde a cada columna.
Título: Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
Publicado por: pajaro en 21 de Marzo de 2011, 15:29:31
Hola Amigos

Al final ayer noche consegui lo que perseguia,
que me detectara las teclas que le pulsaba,
si AngelGris,  asi fue mas o menos como
como llegue a la sintesis del problema,
tuve que modificar un poco el codigo, al final el codigo quedo asi:

int8 escanea_tecla(void){
   int8 f,c,datos;
   signed int8 dato=-1;
   //int8 fila=0b11111110;     //Primera fila (P0=1) //pines arriba
   //invierto orden de columnas y rotacion parapines abajo
   int8 fila=0b11110111;     //Primera fila (P3)
   f=0;
   for (f=0; f<4; f++)     //Recorre las 4 filas (lineas)
   {
      PCF8574_Escribe(fila);
      delay_ms(20);                //Para que le de tiempo a escribir
      dato=PCF8574_Lee();
      c=0;
      if (!bit_test(dato,4)) c=4;             //Col 1 dato 4
      else if (!bit_test(dato,5)) c=3;        //Col 2 dato 5
      else if (!bit_test(dato,6)) c=2;        //Col 3 dato 6
      else if (!bit_test(dato,7)) c=1;        //Col 4  dato7
      if(c!=0) break;                         //Si c es distinto de 0 sale del for
      //rotate_left(&fila, 1);     //Siguientes filas, va desplazando el 0 hacia la izquierda
      rotate_right(&fila, 1);     //Siguientes filas, va desplazando el 0 hacia la derecha
   }  
datos=dato;
   if(c)
      dato=(f*4)+c;
   else
      dato=-1;                      //Ninguna tecla pulsada

   PCF8574_Escribe(0b11110000);     //Vuelve a poner como salida (0) las Lineas  
                                    //y como entrada (1) las Columnas
    lcd_gotoxy(3,1);                                
    printf(lcd_putc,"dato:%2x f:%2d, c:%2d",datos,f,c);                                
   return dato;
}



Lo más seguro que en un futuro próximo ingenie algo
para que sea el software el que detecte el hardware de la conexion del teclado matricial
al puerto del expasor y se auto reconfigure sin tener que cambiar el hardware.

No seria dificil a primera vista,
preguntar donde se encuentra 4 tecla y dependiendo de la posición
sería un tipo de teclado u otro.

Bueno esto para otro hilo.

----------------------------------------------------------------------------------------------------------
 :: Reconocimiento del hardware de un teclado y Reconfiguración automatica del mismo. ::
----------------------------------------------------------------------------------------------------------


***  " Quisiera mostrar agradecimientos, a los compañeros del foro,
          que me brindaron su tiempo y su atención asi como
          ejemplos de codigo, para todos aquellos,
          mis más cordiales agredeciemientos. "


Un saludo

Título: Re: Teclado 4x4 con PCF8574 i2c
Publicado por: mastercel en 03 de Enero de 2018, 01:35:04
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. }




en tu diagrama no pones ninguna resistencia en el pin de interrupción, cabe mencionar que lleva 1, y que tambien las resistencias de teclado son de 330ohms , asi mismo la rutina si sirve como indicas pero creo seria mejor tratar de hacer un gif para entender mejor el sistema , ya que cuesta trabajo entender asi como explicas.