Lire les ports d’un PCF8574 en utilisant 1 interruption

Bonjour,
Je voudrais lire les ports d'un PCF8574 après l'activation d’une interruption reçue par l’Arduino.
Sans utiliser d’interruption, pas de problème avec ce code pour lire la valeur du registre :

Wire.requestFrom(addresse_PCF,1);
  if(Wire.available())
   data =Wire.read();
   data <<4 ;
   Serial.println(data,BIN);

Par contre dès que je passe le port du PCF8574 à HIGH en branchant une résistance de pull up, je n’arrive plus à lire les valeurs du registre : Quoi qu’il se passe, sur les ports (je presse et relâche des boutons) , la valeur lue est 11111111

Si vous une idée ou une solution ...

Il est écrit dans sa datasheet que ce circuit est seulement "quasi" birectionnel.
Le terme "quasi" est important.
Il existe des bibliothèques pour gérer ce produit mais cela relève plutôt de l'acharnement térapeutique.

Il est préférable d'oublier ce composant antedilivien et de passer à des composants modernes bien plus simples à utiliser comme le MCP23017 ou sa version SPI MCP23S17.

Bonjour,

En ces temps de confinement, redonner vie à l’ancêtre peut être un défi intéressant...

Pour cela, il faudrait que vous publiez :

  • ce que vous voulez faire. Ce n'est peut-être pas possible avec l'ancêtre en question,
  • le type de carte Arduino utilisée,
  • le schéma électrique complet, montrant en particulier ce que vous raccordez au 8574,
  • le code complet "qui marche",

(li]le code complet "qui ne marche pas".[/li]

A+ et bonne bidouille,

Microquettas

Bonjour,
Ce que je veux faire : lire l'état de 4 boutons poussoirs chacun connecté sur un pin du PCF8574.
Je voudrais utiliser le mécanisme d'interruption du PCF8574 : en cas de modification d'une de ses entrées (si un bouton est pressé), il passe sa sortie dédiées aux interruptions à LOW (si j'ai bien compris la doc)

Cette sortie est l'entrée d'une carte arduino qui gère les interruption.
Mais je n'arrive plus à avoir l'info de quelle entrée du PCF8574 change d'état dès que j'utilise les interruptions
Mais le code basique ne fonctionne plus dès que je mets un pullup sur la sortie des interruption du PCF8574 comme le préconise la doc

la carte est une Uno

Le schéma arrive d'ici peu avec le code :slight_smile:
En attachement le schéma qui fonctionne et la sortie.

Le code :

#include <Wire.h>

byte addresse_PCF =  0x39;
byte data ;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
}
void loop()
{
  Wire.requestFrom(addresse_PCF,1);
    if(Wire.available()){
    data =Wire.read();
    data <<4 ;
    Serial.println(data,BIN);
    delay(2000);
}
}

Bonsoir

ça pourra peut être servir :

une note d'application de Texas Instrument qui détaille le fonctionnement interne des interruptions des PCF8574 http://www.ti.com.cn/cn/lit/an/scpa032/scpa032.pdf

En refaisant tranquillement le montage tout fonctionne en utilisant ce code :

#include <Wire.h>

byte addresse_PCF =  0x39;
byte erreur = 0;
byte data ;
volatile int state = 0; 
void setup()
{
   Serial.begin(115200);
   Wire.begin();
   attachInterrupt(0, blink, FALLING);
}
void loop()
{
  if ( state == 1){
    Wire.requestFrom(addresse_PCF,1);
    if(Wire.available())
      data =Wire.read();
      data <<4 ;
      Serial.println(data,BIN);
     
      state = 0;
      
    }
    
}
void blink(){
     state = 1 ;
}

en connectant le pin 2 de la uno et P13 du PCF8574.

Merci pour votre aide !

pour faire le tour de la question, il y a une 3ème méthode, c'est faire le pooling du fil d'interruption sans avoir recours à une interruption de l'arduino