[RESOLU] Utilisation bibliothèques PCF8574 et PCF8575

Bonsoir,
J'essaye en vain d'utiliser les librairies PCF8574 et PCF8575.
Mon problème ne se situe pas au niveau des entrées ou des sorties mais dans l'utilisation des interruptions.
Pour mon test j'utilise les exemples fournis des les fichiers bibliothèques (le non fonctionnement est identique avec le PCF8574 ou le PCF8575).
Quelqu'un a-t-il fait des essais concluants avec les interruptions de ces librairies ?
J'essaye de reproduire la démo de Skywodd : [arduino] I2C 16 I/O – PCF8575 | Skyduino - Le DIY à la française
Lorsque je connecte la sortie INT du PCF8575 à la pin 8 de ma UNO R3 (même phénomène avec Duomilanovo) les clignotement deviennent erratiques. Si la pin8 n'est pas relié le comportement est conforme au programme hormis, bien sur, la gestion des interruptions.
Voici le code utilisé :

#include <PCF8575.h> // Required for ... all 

#include <Wire.h> // Required for I2C communication

PCF8575 expander; // Create object from PCF8575 class

void setup(){

  Serial.begin(9600); // Setup serial for read echo
  
  expander.pinMode(0,OUTPUT); // Setup pin D0 as output
  expander.pinMode(15,OUTPUT); // Setup pin D1 as output
  expander.pinMode(3,INPUT); // Setup pin D3 as input

  expander.begin(0x20);
  
  expander.pullUp(3); // Enable pull-up resistor on pin D3 (button)
  
  expander.enableInterrupt(8,ISRgateway); // Enable interrupt by attach interruption handler to arduino pin D8 and save ISRgateway as callback function
  
  expander.attachInterrupt(3,ISRexpander,FALLING); // Attach an virtual interrupt on the pin D3 (button) of the PCF8575
}

void ISRgateway(){
  expander.checkForInterrupt(); // ISRgateway act as an wrapper for attachInterrupt from namespace PCF8575:: to the global scope
}

void ISRexpander(){ // ISRexpander will be call when the PCF8574 pin D3 will goes from high to low
  expander.blink(15,5,200); // Blink the led on pin D0 on PCF8574 (to test TWI into an ISR called function /debug)
}

void loop(){
 expander.blink(0,5,200);
 delay(1000);
} // Loop forever

Si quelqu' un a une piste d'où pourrait provenir ce dysfonctionnement, je suis preneur
Merci pour votre aide

Bonjour,
Personne n'a d'expérience avec ces librairies ?
@+

Aucune expérience.
Mais n'est-il pas plus simple de gérer soi-même l'interruption plutôt que de passer par une usine à gaz qui veut tout faire, même ce dont tu n'as pas besoin, mais qui n'arrive pas à le faire correctement ?

Suffit de patienter un peu et le créateur de la librairie passera surement :wink:

Bonjour,

68tjs:
Aucune expérience.
Mais n'est-il pas plus simple de gérer soi-même l'interruption plutôt que de passer par une usine à gaz qui veut tout faire, même ce dont tu n'as pas besoin, mais qui n'arrive pas à le faire correctement ?

Il est souvent très agréable de faire soi même mais il me manque souvent les compétences :frowning:
@+

Bonjour,

68tjs:
Mais n'est-il pas plus simple de gérer soi-même l'interruption plutôt que de passer par une usine à gaz qui veut tout faire, même ce dont tu n'as pas besoin, mais qui n'arrive pas à le faire correctement ?

Hé c'est pas gentil :stuck_out_tongue:
(bon ok c'est vrai que ça marche pas et que c'est une usine à gaz, bref :grin:)

Pour faire simple et concis : cette librairie est la toute première librairie Arduino que j'ai réalisé, elle doit avoir plus de deux ans maintenant.
A l'époque je savais même pas à quoi servait un "byte" et les interruptions ont été implémenté de manière un peu bizarre.

Une refonte totale du code était prévu il y a plus de 6 mois maintenant mais j'ai jamais eu le temps de m'y mettre.
En gros je suis même pas sûr de pouvoir faire remarcher mon propre code ... c'est pour dire.
Vu que j'ai une pile de mail qui commence à s'empiler depuis avant-hier sur le sujet je vais tenter ce week-end de refaire une librairie propre en partant de zéro.

Bonsoir,
Je peux te dire que je galère avec ce code (que de souffrance pour un non pro du code) pour le point <0 mais il y a énormément de >0 car j'ai appris plein de chose.
Si tu pouvais y jeter un oeil ce serait sympa.
@+

Bonjour,
Je pense que je viens d'être frapper par la loi de Peter (tout être fini par atteindre son niveau d'incompétence).
Je laisse tomber mais je reste à l'écoute si jamais Skywodd refait sa lib.
@+

Bonjour,
Jaloux des jeunes neurones qui courent à 200 à l'heure, j'ai essayé avec le seul qui me reste (de neurone) de comprendre la conception de bibliothèque. J'ai pris comme exemple le PCF8574 pour faire mes expériences. J'ai joint, en annexe, un commencement de logiciels qui allument des LEDs connectées au PCF (LED entre le + et les sortie P? du PCF8574.
Si les "dieux" du C, du C++ et de la POO veulent bien se pencher sur les quelques lignes de programme et me dire si je suis dans la "droite ligne du parti".
Je suis parti du principe de la boîte très complexe avec une interface utilisateur relativement simple et sans faire exploser la boîte, bien sûr.
J'attends avec impatience vos remarques pour éviter d'être lyncher par tous les concepteurs POO de la terre que je risque de rencontrer :slight_smile:
@+

psl_130816_pcf8574_02.zip (2.8 KB)

Quote from: 68tjs on August 14, 2013, 12:13:30 pm
Mais n'est-il pas plus simple de gérer soi-même l'interruption plutôt que de passer par une usine à gaz qui veut tout faire, même ce dont tu n'as pas besoin, mais qui n'arrive pas à le faire correctement ?
Hé c'est pas gentil smiley-razz

skywodd personne n'était visé en particulier et surtout pas toi, je ne connaissais même pas l'auteur de cette bibliothèque..
C'était juste une réflexion générale suite à des tentatives douloureuses d'utiliser des bibliothèques récupérées sur le web.

Rectification :
"Personne n'était visé en particulier"
Si en fait : les gars de chez arduino qui savent vendre des cartes mais qui n'ont pas été capables, ou qui n'ont pas voulu se donner la peine (la tchatche oui, mais les actes...) de créer un dépôt de bibliothèques vérifiées et avec une documentation normalisée.
Rien que le fait de proposer un canevas pour renseigner les points suivants :

  • les pins, timers, interruptions, interfaces de communication utilisées,
  • une documentation Doxigen pour la description et l'emploi des méthodes.
    n'induirait pas une charge insurmontable pour l'auteur et simplifierait grandement la vie des utilisateurs.

68tjs:
Rectification :
"Personne n'était visé en particulier"
Si en fait : les gars de chez arduino qui savent vendre des cartes mais qui n'ont pas été capables, ou qui n'ont pas voulu se donner la peine (la tchatche oui, mais les actes...) de créer un dépôt de bibliothèques vérifiées et avec une documentation normalisée.
Rien que le fait de proposer un canevas pour renseigner les points suivants :

  • les pins, timers, interruptions, interfaces de communication utilisées,
  • une documentation Doxigen pour la description et l'emploi des méthodes.
    n'induirait pas une charge insurmontable pour l'auteur et simplifierait grandement la vie des utilisateurs.

La team Arduino c'est devenu du "business for money" pure et simple, la preuve : il ne font même plus les cartes eux même.
Ils sous-traitent à des entreprises qui voguent sur le côté OpenHardware du projet Arduino pour vendre des cartes SIM (shield GSM) et un chipset GSM, ou des processeurs Atheros.
La dernière carte "Arduino Yun" est l'ensemble parfait du futur du projet Arduino : pas de schéma, pas de doc, rien de concret, pas même de tuto pour le OpenWRT embarqué.
On sent le mix d'un routeur Atheros et d'une carte leonardo mais c'est tout. Et vu le chipset Atheros en question il ne faut même pas espérer un datasheet tout est sous NDA.

Pour la doc actuelle : pas besoin de commenter ...
Pour la doc doxygen (y pas i ;)) ça les forceraient à documenter des morceaux de code dont les commentaires sont à laisser sur place n'importe quel développeur un minimum consciencieux.
Pour le dépôt centralisé des librairies ils l'ont fait. Mais l'ide ne possède aucune fonction pour télécharger les librairies disponibles et le simple fait de devoir envoyer ses librairies à la team Arduino sans pouvoir faire de suivi de version (et devoir remplir un formulaire à chaque fois) font que personne n'as fait la démarche.
(le topic en question : http://forum.arduino.cc/index.php/topic,73531.0.html)

Ps: je suis en train de regarder pour la librairie PCF8574 v2. Ce sera rétro-compatible avec les codes basés sur la v1, le code crade en moins :wink:
Par contre il faudra toujours utiliser des résistances de tirage matériels, les résistances de tirage logiciels sont vraiment inutilisables.

Up,

Version 2.0 :

A voir si ça marche sur le long terme mais pour le moment ça semble fonctionner.
J'ai ajouté un petit code de test avec 3 leds et 1 bouton.

Attention aux fonctions set(), clear() et write(), elles ne prennent pas en compte l'état/mode des broches (je ferait peut être une petite modif là dessus, à voir).
Situation à probléme : write(255) (ou set()) avec une broche placée en INPUT dans le lot : l'état de l'input sera forcée, il y a donc risque de rater une interruption si on les utilisent.

Bonsoir,
Merci Skywodd, je vais tester de ce pas
@+

Bonsoir,
Un premier essai avec interrupt une erreur de compilation :
PCF8574.cpp: In constructor 'PCF8574::PCF8574()':
PCF8574.cpp:28: error: expected primary-expression before '{' token
PCF8574.cpp:28: error: expected primary-expression before '{' token
L'erreur semble provenir des lignes suivantes de PCF8574.cpp :

....
PCF8574::PCF8574() :
		_PORT(0), _PIN(0), _DDR(0), _address(0)
#ifdef PCF8574_INTERRUPT_SUPPORT
				, _oldPIN(0), _pcintPin(0), _intMode({0}), _intCallback({0}) //<<<-----
#endif
{
}
....

Si je remplace la ligne :

				, _oldPIN(0), _pcintPin(0), _intMode({0}), _intCallback({0})

par :

				, _oldPIN(0), _pcintPin(0), _intMode(), _intCallback()

ça compile
Comment faire pour initialiser les tableaux par cette méthode d'écriture du constructeur ?
@+

[edit1]
J'ai fait la modification suivante et la compilation de l'exemple va jusqu'à la fin (reste à tester) :

/*
PCF8574::PCF8574() :
		_PORT(0), _PIN(0), _DDR(0), _address(0)
#ifdef PCF8574_INTERRUPT_SUPPORT
				, _oldPIN(0), _pcintPin(0), _intMode({0}), _intCallback({0})
#endif
{
}
*/
PCF8574::PCF8574(){
  _PORT = 0;
  _PIN = 0;
  _DDR = 0;
  _address = 0;
#ifdef PCF8574_INTERRUPT_SUPPORT
  _oldPIN = 0;
  _pcintPin = 0;
  for(int i = 0; i<=7; i++){
    _intMode[i] = 0;
  }
  for(int i = 0; i<=7; i++){
    _intCallback[i] = 0;
  }
#endif
}

Mais je ne suis sur que ce soit la bonne méthode !
@+

[EDIT2]
Le programme exemple fonctionne, il ne me reste plus qu'à approfondir les tests et comprendre le fonctionnement
@+

[EDIT3]
Avec :

PCF8574::PCF8574() :
		_PORT(0), _PIN(0), _DDR(0), _address(0)
#ifdef PCF8574_INTERRUPT_SUPPORT
//				, _oldPIN(0), _pcintPin(0), _intMode({0}), _intCallback({0})
				, _oldPIN(0), _pcintPin(0), _intMode(), _intCallback()
#endif
{
}

Le programme fonctionne également (en attendant des tests plus approfondis) mais je ne sais pas comment les variables _intMode(), _intCallback() sont initialisées.
@+

icare:
Un premier essai avec interrupt une erreur de compilation :
PCF8574.cpp: In constructor 'PCF8574::PCF8574()':
PCF8574.cpp:28: error: expected primary-expression before '{' token
PCF8574.cpp:28: error: expected primary-expression before '{' token
L'erreur semble provenir des lignes suivantes de PCF8574.cpp :
(...)
ça compile

Chez moi ça compile sans probléme ...
Mais j'ai une version à jour de AVR-GCC (le compilateur, actuellement je suis en version 4.7.2), c'est peut être la qu'est le probléme ...

icare:
Comment faire pour initialiser les tableaux par cette méthode d'écriture du constructeur ?

Ça dépend du standard C++ que supporte le compilateur ...

icare:
Le programme exemple fonctionne, il ne me reste plus qu'à approfondir les tests et comprendre le fonctionnement
(...)
Le programme fonctionne également (en attendant des tests plus approfondis) mais je ne sais pas comment les variables _intMode(), _intCallback() sont initialisées.

En C++ les champs sont initialisés à 0 donc dans le cas de la librairie c'est bon :wink:

Je vais faire un petit update de tout ça :wink:

Bonjour Skywodd,
Merci pour ta réponse.
Pour essayer de comprendre la création de library, j'avais fait un essai dans un topic un peu plus haut : [RESOLU] Utilisation bibliothèques PCF8574 et PCF8575 - #9 by icare - Français - Arduino Forum
Je souhaitais avoir l'avis d'experts pour voir si j'étais dans la droite ligne de ce qu'il faut faire mais je n'ai aucune réponse (personne n'a d'ailleurs télécharger le fichier). :frowning:
J'ai utilisé le cas du PCF8574 pour ce test avec discrimination des entrées et des sorties.
Pourrais-tu me donner ton avis sur ces quelques lignes de programme (si tu en as le courage et le temps, bien sur) ?
@+

Re,
J'ai essayé de compiler avec la version 1.5.2 d'Arduino, même punition :frowning:
Comment peut-on savoir la version du compilateur utilisé par Arduino ?
@+

[EDIT1]
Dans le fichier PCF8574.cpp, il faudrait peut être changer la ligne pointée :

void PCF8574::pinMode(uint8_t pin, uint8_t mode) {

	/* Switch according mode */
	switch (mode) {
	case INPUT:
		_DDR &= ~(1 << pin); 
//		_PORT &= ~(1 << pin); <<<<--------------------------------
		_PORT |= (1 << pin);
		break;

	case INPUT_PULLUP:
		_DDR &= ~(1 << pin);
		_PORT |= (1 << pin);
		break;

	case OUTPUT:
		_DDR |= (1 << pin);
		_PORT &= ~(1 << pin);
		break;

	default:
		break;
	}

	/* Update GPIO values */
	updateGPIO();
}

[EDIT2]
Je viens de faire un montage avec 4 PCF8574 :

  • 3 commandent des leds (défilement de leds)
  • le dernier 4 leds et 4 boutons poussoirs (les BP "toggle les leds via interruption)
    Cela fonctionne impec sauf la première action sur le BP (n'importe lequel) ne génère pas d'interruption
    @+

icare:
J'ai essayé de compiler avec la version 1.5.2 d'Arduino, même punition :frowning:

C'est pas une question de version de l'ide, c'est le compilateur lui même.
La team arduino utilise une très vielle version de AVR-GCC qui n'est du reste même plus soutenu ...
J'ai fait une mise à jour du code pour supporter cette vielle version :wink:

icare:
Comment peut-on savoir la version du compilateur utilisé par Arduino ?

Ouvrir une console (touche window + R) puis naviguer jusqu'au dossier "xxxx/hardware/tools/avr/bin" et faire "avr-gcc -v".

icare:
Dans le fichier PCF8574.cpp, il faudrait peut être changer la ligne pointée :
(...)

Je ne pense pas, pourquoi faudrait-il mettre d'office les INPUT en tant que pull-up ?

icare:
Cela fonctionne impec sauf la première action sur le BP (n'importe lequel) ne génère pas d'interruption

C'est une question d'initialisation de _oldPIN, je sait pas trop comment résoudre ce probléme (proprement).

icare:
Pour essayer de comprendre la création de library, j'avais fait un essai dans un topic un peu plus haut : [RESOLU] Utilisation bibliothèques PCF8574 et PCF8575 - #9 by icare - Français - Arduino Forum
Je souhaitais avoir l'avis d'experts pour voir si j'étais dans la droite ligne de ce qu'il faut faire mais je n'ai aucune réponse (personne n'a d'ailleurs télécharger le fichier). :frowning:
J'ai utilisé le cas du PCF8574 pour ce test avec discrimination des entrées et des sorties.
Pourrais-tu me donner ton avis sur ces quelques lignes de programme (si tu en as le courage et le temps, bien sur) ?

Je regarde ça demain dés que j'ai une minute de libre :wink:

Bonsoir,

skywodd:
C'est pas une question de version de l'ide, c'est le compilateur lui même.
La team arduino utilise une très vielle version de AVR-GCC qui n'est du reste même plus soutenu ...
J'ai fait une mise à jour du code pour supporter cette vielle version :wink:

Comment fait-on pour utiliser une version plus récente ?

skywodd:

icare:
Dans le fichier PCF8574.cpp, il faudrait peut être changer la ligne pointée :
(...)

Je ne pense pas, pourquoi faudrait-il mettre d'office les INPUT en tant que pull-up ?

Ok, je ne l'avais pas vu sous cet angle
@+