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