Bonjour,
je me pose une question sur l'utilisation du composant PCF8574 qui permet de rajouter des e/s au µp et c'est sur son comportement au travers d'un simulateur: TinkerCAD
je ne sais pas si c'est le logiciel, ou ma programmation, ou un fonctionnement normal, et je souhaiterais avoir votre avis...
Lorsque je commence des projets, il m'arrive de tester des fonctionnement sous Tinkercad surtout quand je ne suis pas souvent chez moi pour tester en réel...
c'est ce qu'il se passe dans ce cas ou j'ai besoin de rajouter 8 entrées (boutons poussoir) au µp pour ce faire je souhaite utiliser un PCF8574 qui possède en plus de ses 8 ports paramétrables une patte permettant de signaler une interruption...
voici le schéma:
le code:
#include <Wire.h>
const byte adrPCF8574 = 0x20;
volatile boolean FlInterrupt0; //!volatile pour l'interruption
volatile boolean FlInterrupt1;
void setup()
{
Serial.begin(9600);
Wire.begin(); //initialisation du bus I2C
Wire.beginTransmission(adrPCF8574); //test si le PCF8574 répond
if(Wire.endTransmission() != 0) {
Serial.print( "PCF8574 @?");
while(1); //arret du pgm
}
//Passage des toutes les E/S du PCF8574 en "entrée"
Wire.beginTransmission(adrPCF8574);
Wire.write(0b11111111); // Mise à 1 des pins P7 à P0 du PCF8574
Wire.endTransmission();
Serial.println(); Serial.println();
byte pinAction = 2; //l'interruption n°0 = pin n°2 (interr n°1=pin n°3)
pinMode(pinAction, INPUT);
attachInterrupt(digitalPinToInterrupt(pinAction), FunInterrupt0, FALLING); // (FALLING/RISING)) attache l'interruption externe
Serial.print("Interruption #"); Serial.print(digitalPinToInterrupt(pinAction));
Serial.print(" Sur la Pin #"); Serial.println(pinAction);
pinAction = 3; //l'interruption n°0 = pin n°2 (interr n°1=pin n°3)
pinMode(pinAction, INPUT);
attachInterrupt(digitalPinToInterrupt(pinAction), FunInterrupt1, FALLING); // (FALLING/RISING)) attache l'interruption externe
Serial.print("Interruption #"); Serial.print(digitalPinToInterrupt(pinAction));
Serial.print(" Sur la Pin #"); Serial.println(pinAction);
FlInterrupt0 = false;
FlInterrupt1 = false;
}
//*****************************************************
//
void loop()
{
if (FlInterrupt0) {
Serial.println(F("interruption #0!!"));
funPCF8574Get();
FlInterrupt0 = false;
}
if (FlInterrupt1) {
Serial.println(F("interruption #1!!"));
FlInterrupt1 = false;
}
}
//*****************************************************
// fonction de l'interruption
void FunInterrupt0 () {
FlInterrupt0 = true; //flag permettant d'aller dans la fonction
}
//*****************************************************
// fonction de l'interruption
void FunInterrupt1 () {
FlInterrupt1 = true; //flag permettant d'aller dans la fonction
}
//*****************************************************
//
void funPCF8574Get () {
Wire.requestFrom(adrPCF8574, 1); //interrogation le PCF8574,
//en lui demandant de retourner 1 octet (qui contiendra l'état des broches P0 à P7)
if(Wire.available()) {
byte reponseDuPCF8574 = Wire.read();
Serial.print(F("PCF8574 = "));
Serial.print(reponseDuPCF8574, BIN);
//affiche quelle broche est à l'origine de l'interruption (remarque : ne prend pas en compte les appuis simultanés)
if(reponseDuPCF8574 == 0b01111111) Serial.print(F(" ==> Déclanchement de la pin P7"));
if(reponseDuPCF8574 == 0b10111111) Serial.print(F(" ==> Déclanchement de la pin P6"));
if(reponseDuPCF8574 == 0b11011111) Serial.print(F(" ==> Déclanchement de la pin P5"));
if(reponseDuPCF8574 == 0b11101111) Serial.print(F(" ==> Déclanchement de la pin P4"));
if(reponseDuPCF8574 == 0b11110111) Serial.print(F(" ==> Déclanchement de la pin P3"));
if(reponseDuPCF8574 == 0b11111011) Serial.print(F(" ==> Déclanchement de la pin P2"));
if(reponseDuPCF8574 == 0b11111101) Serial.print(F(" ==> Déclanchement de la pin P1"));
if(reponseDuPCF8574 == 0b11111110) Serial.print(F(" ==> Déclanchement de la pin P0"));
if(reponseDuPCF8574 == 0b11111111) Serial.print(F(" ==> Toutes les entrees sont 'relachees'"));
Serial.println("");
}
}
le lien directe pour la simulation: Arduino PCF8574 interruption
le fonctionnement que je n'arrive pas à comprendre c'est en ouvrant le moniteur série, je clic sur le bouton a gauche du PCF8574 et cela me renvoie:
interruption #1!!
ici tous ce passe comme prévu , il y à qu'un seul allé dans l'interruption
mais quand je clic sur sur un bouton à droite du PCF8574 cela me revoie:
interruption #0!!
PCF8574 = 11110111 ==> Declanchement de la pin P3
interruption #0!!
PCF8574 = 11111111 ==> Toutes les entrees sont 'relachees'
on peut remarquer qu'il y a 2 passage dans l'interruption...
et quand je clic plus doucement la 1ère interruption à lieu lors de l’appuie sur le bouton, et la 2nde interruption lorsque je relâche le bouton...
pourtant que ce soit pour l'interruption 0 ou 1, elle sont toutes les 2 paramétrées sur "FALLING" dans la commande "attachInterrupt"
donc j'aimerais savoir si c'est un fonctionnement normal avant d'acheter le composant et dans ces condition je trouverais bien un pansement pour gérer ce fonctionnement...
ou peut être c'est ma programmation qui est encore une foi "chelou" ou encore c'est le simulateur qui est en cause....
quel est votre avis?
Je vous remercie