[RESOLU] Utilisation bibliothèques PCF8574 et PCF8575

Bonsoir, La répétition de l'interruption semble provenir de chekForInterrupt car si l'on commente chekForInterrupt dans ISRgateway, on n'a pas de répétition de l'interruption. Elle est unique à chaque appuie sur le BP. Mais j'ai du mal à comprendre ce qui se passe dans cette partie du programme :(

icare: La répétition de l'interruption semble provenir de chekForInterrupt car si l'on commente chekForInterrupt dans ISRgateway, on n'a pas de répétition de l'interruption. Elle est unique à chaque appuie sur le BP.

Si tu commentes checkForInterrupt() plus rien ne vas marcher ... cette fonction test la présence d'une interruption.

Bonjour,

skywodd: Si tu commentes checkForInterrupt() plus rien ne vas marcher ... cette fonction test la présence d'une interruption.

Alors là, je suis + que ok avec toi. Je voulais juste dire que j'ai bien une entrée dans ISRgateway et un retour unique à chaque appui. Les interrupts multiples viennent dès que l'on passe dans checkForInterrupt. @+

Bonsoir Skywodd,
Problème de compréhension code :

  /* Enable PCF8574 interrupts, use pin D8 as "INT" pin and ISRgateway() as callback function */
  expander.enableInterrupt(8, ISRgateway);

On utilise bien la pin D8 de la carte Arduino?
Le code de enableInterrupt :

#ifdef PCF8574_INTERRUPT_SUPPORT
void PCF8574::enableInterrupt(uint8_t pin, void (*selfCheckFunction)(void)) {

  Serial.println(">enableInterrupt");
	/* Store interrupt pin number */
	_pcintPin = pin;

	/* Setup interrupt pin */
#if ARDUINO >= 100
	pinMode(pin, INPUT_PULLUP);   //****<----
#else
	pinMode(pin, INPUT);
	digitalWrite(pin, HIGH);
#endif

Dans ce cas :

	pinMode(pin, INPUT_PULLUP);   //****<----

Le pinMode est celui de PCF8574.cpp et non celui de la carte Arduino
Je pense que cette siutation doit perturber le programme ou pas ?
@+

icare: Alors là, je suis + que ok avec toi. Je voulais juste dire que j'ai bien une entrée dans ISRgateway et un retour unique à chaque appui. Les interrupts multiples viennent dès que l'on passe dans checkForInterrupt

Ha ok. Ce probléme est normal, il y a quelque chose lors de la lecture des GPIO par checkForInterrupt qui modifie l'état des broches et fait basculer le signal INT. Le datasheet parle très brièvement de cela mais je ne comprend absolument pas ce qu'ils veulent dire dans la doc.

icare:  /* Enable PCF8574 interrupts, use pin D8 as "INT" pin and ISRgateway() as callback function */  expander.enableInterrupt(8, ISRgateway);

On utilise bien la pin D8 de la carte Arduino?

Oui broche D8 de l'arduino et non du PCF8574.

icare: Le pinMode est celui de PCF8574.cpp et non celui de la carte Arduino Je pense que cette situation doit perturber le programme ou pas ?

. . . Je l'avais jamais fait cette boulette tient 8) Il faut ajouter un :: devant le nom de la fonction pour que ce soit celle du scope globale (= le "vrai" pinMode) qui soit appelée. Bien vu !

Edit: màj ok https://github.com/skywodd/pcf8574_arduino_library/commits/master

Bonsoir Skywodd, Je suis entrain de faire des tests, il me semble (reste à vérifier) que cela vienne de l'utilisation de delay dans blink. Bizarre !!! Je vais vérifier tout cela

[EDIT] Fausse piste

Bonsoir Skywodd,
Je suis toujours dans les tests.
Avec ta dernière version, on a un fonctionnement un coup sur deux (flip flop). A force de mettre des Serial.print un peu partout pour suivre le déroulement du programme je me suis rendu compte que le phénomème flip flop avait disparu !
Peut être un problème de timing ?

[EDIT]
Je viens de supprimer tous les messages de traçage dans le programme et j’ai un fonctionnement sans l’effet flip flop. Pour que cela fonctionne j’ai fait la modification suivante :

void ISRdemo() {
  /* Blink hardware LED for debug */
  digitalWrite(13, HIGH);  
  /* Blink PCF8574 output 0 (5 times during 500ms) for demo */
//  expander.blink(0, 5, 500);  <-------------------
  expander.toggle(0);            //<++++++++++++++
  /* Blink hardware LED for debug */
  digitalWrite(13, LOW);
}

J’ai simplement remplacer l’utilisation de expander.blink par expander.toggle => miracle ce la fonctionne à tous les coups. Peut être que mon constat précédent sur delay est l’origine du fonctionnement erratique.
@+

Un probléme qui serait lié au temps d'envoi du Serial ... Possible mais là ça va être galère de trouver l'origine du bug. Je devais câbler un petit montage de test sur breadboard durant le WE mai j'ai pas eu le temps :~

Bonsoir Skywodd, Le problème ne vient pas du Serial.print puisque je les ai tous supprimés. Le problème vient de l'utilisation de la fonction delay() pendant le traitement de l'interruption. @+ [EDIT] Comment faire un blink sans utiliser delay() ?

icare: [EDIT] Comment faire un blink sans utiliser delay() ?

Avec millis() (voir exemple "blinkwithoutdelay")

Bonsoir;

skywodd:

icare: [EDIT] Comment faire un blink sans utiliser delay() ?

Avec millis() (voir exemple "blinkwithoutdelay")

Je n'étais pas assez clair dans ma question. Je pensais faire un blink pendant l'interruption doc sans utiliser delay ou millis qui ne fonctionnent pas correctement. :(

icare:
Je n’étais pas assez clair dans ma question. Je pensais faire un blink pendant l’interruption doc sans utiliser delay ou millis qui ne fonctionnent pas correctement. :frowning:

En fait de base un delay c’est une très mauvaise idée, une interruption doit être la plus rapide possible.
Mon exemple avec blink dans l’interruption c’est pas tiptop (c’est juste pour montrer que ça marche).

Re,

skywodd: En fait de base un delay c'est une très mauvaise idée, une interruption doit être la plus rapide possible. Mon exemple avec blink dans l'interruption c'est pas tiptop (c'est juste pour montrer que ça marche).

Je sais mais j'étais déjà dans de l'applicatif avec des PCF8574 et les interruptions. Il y a les Threads qui fonctionnent mais lorsque je fais un reset cela ne marche plus. Existe-il un exemple ou tuto qui fonctionnent?

Bonjour, J'ai utiliser de manière intensive la librairy PCF8574 (y compris et surtout avec les interruptions) de Skywodd et je dois dire que cela fonctionne à merveille. Bravo et merci Skywodd. Les autres soucis que j'ai ne sont plus liés à la bibliothèque mais à non maîtrise du C @+ [EDIT] J'ai testé pas mal de librairy du PCF8574 (tous plus ou moins similaires) mais la seule qui fonctionne avec les interruptions est celle de Skywodd modifiée par ses soins. :)

Attend, du coup ça marche ou ça marche plus ? Je suis complétement à la ramasse en ce moment :zipper_mouth_face:

Bonjour,

skywodd: Attend, du coup ça marche ou ça marche plus ? Je suis complétement à la ramasse en ce moment :zipper_mouth_face:

La librairie fonctionne très bien en utilisation. On a un accès pour rien à ISRgateway (un aller retour avec pas détection de nouvelle interruption). Donc ça marche en exploitation, les puristes sont peut être "shocking" mais je n'ai pas le niveau pour faire mieux et cela répond à mes besoins. Encore merci pour la modification @+ [EDIT] J'avais oublié. Il faut que tu modifies l'exemple joint de ta librairie en remplaçant dans ISRdemo le blink par un toggle (par exemple) car le dysfonctionnement vient le l'utilisation de delay pendant l'interruption.

Bonsoir,
Je me suis permis de jouer un peu avec la librairie pour tester des fonctionnalités dont je vais avoir besoin sans trop ralentir la boucle loop().
Une partie du programme n’est pas top mais à défaut de trouver mieux j’ai fait avec les moyens du bord (disant avec mes maigres connaissances en C)
Fichiers joints en annexe:
Merci pour vos commentaires

psl_130907_pcf8574_12.zip (11.4 KB)

Bonsoir,
Vous trouverez ci-joint un exemple d’utilisation de la library Skywodd PCF8574 en multi-interruptions.
Le programme utilise 3 PCF8574 et chacun à un bouton poussoir qui déclenche une interruption.
Le schéma du montage est inclus dans le zip
@+

pcf8574_02.zip (16.3 KB)

Bonsoir,
Une autre version de l’utilisation de la lib Skywodd. Les leds clignotent sur des tâches “pseudo parallèle” et les interruptions font également clignoter des leds. La fonction blink de la lib d’origine ne fonctionne pas très bien.
La boucle loop() prend entre 80 et 1550 us (suivant la situation des différents temps) pour faire clignoter de façon // les 7 leds.
On va pouvoir faire des guirlandes de Noël avec des clignotement aléatoires.
@+

pcf8574_03.zip (21 KB)