Autor Tema: Teclado y expansor bus i2c PCF8574  (Leído 3731 veces)

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

Desconectado juanelete

  • PIC12
  • **
  • Mensajes: 74
Teclado y expansor bus i2c PCF8574
« en: 18 de Marzo de 2006, 10:38:00 »
Hola a tod@s

Estoy experimentando con un teclado matricial 4x4, conectado mediante I2c a un PIC16f876 atraves de un expansor de bus PCF8574.

Esta es una forma genial de conectar un teclado, pues ya no tengo que preocuparme de utilizar ningun PIN del PIC, solo los dos del bus I2C.

El PCF8574 dispone de un pin que se activa cuando se pulsa cualquier tecla, permitiendo generar una interrupcion en el PIC.

Hasta aqui todo muy bonito pero... (porque siempre hay un pero).

Cada vez que pulso una tecla, el pic me detecta dos interrupciones, una al pulsar y otra al soltar...  loco

Ya he probado con  ext_int_edge(H_TO_L);  pero hace lo mismo...

Sabria alguien decirme como puedo evitar que se generen las 2 int.

Saludos Sonrisa Gigante

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Teclado y expansor bus i2c PCF8574
« Respuesta #1 en: 18 de Marzo de 2006, 11:00:00 »
Una solución por soft seria que crearas un whileque esperara a soltar el boton, y despues un delay para los rebotes.
Si juegas contra el mejor, pierdes como los demás.

Desconectado omibaya

  • PIC12
  • **
  • Mensajes: 57
RE: Teclado y expansor bus i2c PCF8574
« Respuesta #2 en: 18 de Marzo de 2006, 22:29:00 »
bueno, yo he trabajado con el pcf8574, pero con LCD y como entrada de sensores, quiero probarlo como teclado, pero no he podido aun, pero no es tan dificil......
Hay varias cosas:
Cuando trabajas con el PCF8574 puedes leer o escribir, cuando escribes en el no hay problema, solo le mandas el dato..., pero cuando quieres leer lo que hay, lo lees y el pcf8574 deja en alto su pin de interrupcion esperando un cambio en la entrada del PCF, cuando esto sucede se pone a nivel logico cero.
Tal vez ya lo has hecho, cuando quieres leer un teclado por i2c tienes que enviar constantemente bytes al PCF, es decir le escribes:
- Las filas del teclado se conectan a la parte baja del puerto PCF8574, P0-P3 configuradas como salida.
- Las columnas se conectan a la parte alta del PCF P4-P7
- Escribes 11111110 y luego lees y guardas, escribes 11111101 y lees, 11111011 y lees, 11110111 y lees....
- El pin int del PCF solo va a irse a bajo cuando presionas despues de que el Micro lo lee, asi que debes asegurarte de no volver a leer el PCF hasta que la tecla se haya soltado.

Ojala ese sea tu problema, sino publica tu código y lo examinamos en tre todos

Desconectado omibaya

  • PIC12
  • **
  • Mensajes: 57
RE: Teclado y expansor bus i2c PCF8574
« Respuesta #3 en: 18 de Marzo de 2006, 22:44:00 »
Hay bastante informacion al respecto en el libro de Enrique Palacios "Microcontrolador 16F84A" lo malo es que esta en Asembler, pero la secuencia es la misma

Desconectado juanelete

  • PIC12
  • **
  • Mensajes: 74
RE: Teclado y expansor bus i2c PCF8574
« Respuesta #4 en: 20 de Marzo de 2006, 11:19:00 »
Hola

Creo que el problema no lo tengo en el PCF8574, sino en la int RB0, pues la jodia se activa cuando se pulsa una tecla, al pasar el pin del PCF de 1 a 0 y luego otra vez cuando se suelta la tecla y el pin de PCF pasa de 0 a 1.

Hay una instruccion que es "ext_int_edge(H_TO_L);", que en teoria serviria para que la int RB0 solo se activase por flanco de bajada, osea al pasar de 1 a 0, pero parece que no funciona.

Preferiria (de momento) no tener que meter al proceso en un while y pararlo todo hasta que se suelte la tecla, pue el programa tiene que seguir haciendo otras tareas un poco criticas, y no quiero supeditarlo a que el usuario mantenga pulsada una tecla y pare todos los procesos.

Os dejo un extracto del programa para que le hecheis un vistazo y me aconsejeis.

#define PCF8574_Lectura   0b01000001   // 0100  000  1
#define PCF8574_Escritura 0b01000000   // 0100  000  0


#INT_EXT
void int_rb0()
{  
   cod_tecla=escanea_tecla();
}



void PCF8574_Escribe(int8 dato)
{
      i2c_start();                           // Inicio

      i2c_write(PCF8574_Escritura);   // Direccion dispositivo en modo escritura

      i2c_write(dato);                 // dato

      i2c_stop();     // Stop
}


int8 PCF8574_Lee(void)
{
      int8 dato;

      i2c_start();    // Inicio

      i2c_write(PCF8574_Lectura);     // Direccion dispositivo en modo lectura

      dato = i2c_read();

      i2c_stop();     // Stop

      return dato;
}




int8 escanea_tecla(void)
{
   int8 l,c;
   signed int8 dato=-1;
   int8 fila=0b11111110;  // primera fila


   for (l=0; l<=3; l++)  // Recorre las 4 filas
   {
      PCF8574_Escribe(fila);
     
      rotate_left(&fila, 1);  // siguientes filas, va desplazando el 0 hacia la izquierda
     
      delay_ms(20);     // necesario para asegurarnos que ha terminado la escritura

      dato=PCF8574_Lee();

      c=0;

      if (!bit_test(dato,4)) c=1;          //Col 1
      else if (!bit_test(dato,5)) c=2;     //Col 2
      else if (!bit_test(dato,6)) c=3;     //Col 3
      else if (!bit_test(dato,7)) c=4;     //Col 4

      if(c) break;     // Si c es distinto de 0 sale del for
   }


   if(c)
      dato=(l*4)+c;
   else
      dato=-1;

   PCF8574_Escribe(0b11110000);  // Vuelve a poner como salida (0) las Lineas  y como entrada (1) las Columnas

   return dato;

}


Alguien sabe como evitar que la int RB0 se active 2 veces, una por flanco de bajada y otra por flanco de subida.

Saludos  Giño






Desconectado guancho2002

  • PIC16
  • ***
  • Mensajes: 113
Re: Teclado y expansor bus i2c PCF8574
« Respuesta #5 en: 03 de Noviembre de 2008, 20:03:32 »
Sé que es un tema antiguo pero me surge el mismo problema y no he encontrado la solución por ningún sitio ¿me podéis ayudar?
Me lleva loco lo de la doble interrupción que genera, una cuando presiona y otra cuando sueltas, me hace la rutina de interrupción dos veces...
Gracias de antemano. :(