Go Down

Topic: [RESOLU] Utilisation bibliothèques PCF8574 et PCF8575 (Read 7059 times) previous topic - next topic

icare

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 : http://forum.arduino.cc/index.php?topic=182507.msg1356237#msg1356237
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). :(
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) ?
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

icare

#16
Aug 22, 2013, 03:47 pm Last Edit: Aug 22, 2013, 09:21 pm by icare Reason: 1
Re,
J'ai essayé de compiler avec la version 1.5.2 d'Arduino, même punition :(
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 :
Code: [Select]
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
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

skywodd


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

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 ;)


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".


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 ?


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).
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

skywodd


Pour essayer de comprendre la création de library, j'avais fait un essai dans un topic un peu plus haut : http://forum.arduino.cc/index.php?topic=182507.msg1356237#msg1356237
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). :(
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 ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

icare

Bonsoir,

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 ;)

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



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
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

skywodd


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

Etape 1 & 3 si tu veut la dernière version du compilateur.
C'est pas obligatoire mais niveau optimisation ya eu un sacré boulot entre la version de base de l'ide et la dernière version d'AVR-GCC.
http://skyduino.wordpress.com/2012/07/07/hack-utiliser-teensyduino-avec-une-carte-arduino-leonardo-ou-compatible-leonardo/
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

skywodd

Concernant ta librairie.

Dans le fichier keywords.txt
- le fichier DOIT être encodé en UTF8 et non en ANSI
- les fins de lignes DOIVENT être au format unix (LF) et non window (CR+LF)
--> un coup de notepad++ (onglet "encodage" et onglet "édition/convertir les sauts de ligne" réglera les problèmes)
- le fichier keywords.txt ne fait que lister les mot-clefs à colorer dans l'ide donc cette ligne ne vas pas :
Code: [Select]
IPCF8574 KEYWORD1  <--- OUI
~IPCF8574 KEYWORD1  <--- NON (à supprimer)



Dans le fichier .h
- mini conseil : pour ta doc utilise doxygen ;)
Code: [Select]
/*
Fichier  : iPCF8574.h
Version  : 1.0
Révision : 17/08/2013
Auteur   : Icare Petibles
Cible    : Arduino 1.0.5
Description : prototypes bibliothèque IPCF8574
*/

deviendrait alors
Code: [Select]
/**
* @file iPCF8574.h
* @version 1.0
* @date 17/08/2013
* @author Icare Petibles
* @remarks For Arduino 1.0.5
* @brief prototypes bibliothèque IPCF8574
*/

L'avantage c'est qu'avec une commande tu peut générer par la suite une documentation au format html et pdf ;)

- tu peut rendre ta librairie rétro-compatible arduino 002x si tu le souhaites (voir dans mon .h comment faire)

- destructeur vide = pas besoin de le déclarer

- constructeur :
Code: [Select]
IPCF8574();           //constructeur
IPCF8574(byte SADDR); //surcharge constructeur

Pas besoin d'une double déclaration, ça ne fait que générer du code en plus

Code: [Select]
IPCF8574(byte SADDR = 0x20);
-> Sans argument "SADDR" vaudra 0x20, avec argument il vaudra la valeur fourni
--> un seul constructeur = une seule fonction = moins de code à maintenir

- Corps du constructeur :
Code: [Select]
IPCF8574::IPCF8574(){   //constructeur par défaut
  m_PCFOUTPORT = 0x00;  //pas de pins en sortie
  m_PCFINPPORT = 0x00;  //pas de pins en entrée
  m_PCFPORT = 0x00;     //variable à 0
  m_ERREUR = 0;         //*
}

Initialisation dans le corps de la fonction du constructeur -> pas génial
Code: [Select]
IPCF8574::IPCF8574() :
m_PCFOUTPORT(0x00), m_PCFINPPORT(0x00), m_PCFPORT(0x00), m_ERREUR(0x00)
{ // Et m_PCFAddress ? Il manque une initialisation !
}


Test de validité -> pas utile
En programmation tu as deux choix : programmation défensive (tu tests absolument tout, même les données internes) ou "normal" avec ce principe de base "Ce qui ne me sert pas ne doit rien me couter", ici tester l'adresse ne fait qu'ajouter un test en plus qui empêche l'optimisation du code.
Code: [Select]
IPCF8574::IPCF8574(byte SADDR) {
m_PCFOUTPORT(0x00), m_PCFINPPORT(0x00), m_PCFPORT(0x00), m_PCFAddress(SADDR),  m_ERREUR(0x00)
{
}


Wire.begin() dans le constructeur -> TRÈS mauvaise idée, rien ne te dit que l'objet "Wire" est initialisé avant ou après ta propre classe.
En plus c'est la porte ouverte au probléme de double initialisation.

- fonction begin()
--> même remarque pour le test d'adresse
--> double initialisation via Wire.begin() dans le cas où on passe l'adresse au constructeur
--> choix de l'adresse via begin() = pas besoin de spécifier l'adresse dans le constructeur (ne pas faire les choses deux fois)

- fonction pinMode()
--> même remarque pour le test de numéro de pin
--> if(mode == 1) devrait être remplacé par un switch gérant "OUTPUT", "INPUT" et "INPUT_PULLUP", car "1" ne veut rien dire si on ne connais pas la valeur associée
--> m_ERREUR n'as selon moi pas grand intérêt, du reste si les tests disparaissent tu te rend compte de suite que cette variable est inutilisée

- pourquoi digitalWriteOut ? La fonction standard est "digitalWrite"

- même remarque pour digitalReadInp

- pas besoin de volatile sur m_PCFAddress

Pour le reste vu qu'il manque des fonctions je pourrai pas sortir ma boule de cristal :smiley-mr-green:
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

icare

Bonsoir,
Merci pour tes remarques, je vais tenir compte de tous ces points.
C'est normal qu'il n'y ai pas tout le but nétait pas de ré-écrire la librairie mais d'essayer de comprendre le mécanisme.
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

icare

Re,


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

Etape 1 & 3 si tu veut la dernière version du compilateur.
C'est pas obligatoire mais niveau optimisation ya eu un sacré boulot entre la version de base de l'ide et la dernière version d'AVR-GCC.
http://skyduino.wordpress.com/2012/07/07/hack-utiliser-teensyduino-avec-une-carte-arduino-leonardo-ou-compatible-leonardo/

Je vais essayer :)
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

icare

Re,

Dans le fichier .h
- mini conseil : pour ta doc utilise doxygen ;)
Code: [Select]
/*
Fichier  : iPCF8574.h
Version  : 1.0
Révision : 17/08/2013
Auteur   : Icare Petibles
Cible    : Arduino 1.0.5
Description : prototypes bibliothèque IPCF8574
*/

deviendrait alors
Code: [Select]
/**
* @file iPCF8574.h
* @version 1.0
* @date 17/08/2013
* @author Icare Petibles
* @remarks For Arduino 1.0.5
* @brief prototypes bibliothèque IPCF8574
*/

L'avantage c'est qu'avec une commande tu peut générer par la suite une documentation au format html et pdf ;)

J'ai regardé sur le net pour la partie documentation Doxygen et je suis tombé sur "des règles" qui n'utilisent pas la même syntaxe (\qq chose alors que tu utilises @qq chose).
Peut-être un lien pour éclaircir la situation ?
De même, si c'est possible, pour la partie génération de doc ?
Merci
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

icare

Re,


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

Etape 1 & 3 si tu veut la dernière version du compilateur.
C'est pas obligatoire mais niveau optimisation ya eu un sacré boulot entre la version de base de l'ide et la dernière version d'AVR-GCC.
http://skyduino.wordpress.com/2012/07/07/hack-utiliser-teensyduino-avec-une-carte-arduino-leonardo-ou-compatible-leonardo/

Le compilateur est passé en version 4.7.2 au lieu de 4.3.2
La procédure d'installation diffère un peu de la description du site, à savoir :
- le répertoire "etc" existe déjà.
- pas de demande d'ajouter le "PATH"
Merci
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

skywodd


J'ai regardé sur le net pour la partie documentation Doxygen et je suis tombé sur "des règles" qui n'utilisent pas la même syntaxe (\qq chose alors que tu utilises @qq chose).
Peut-être un lien pour éclaircir la situation ?

\qq et @qq = même chose ;)
Doxygen fonctionne avec plusieurs langages de prog, il y a donc des variantes de la syntaxe de base pour éviter les conflits avec le code de base.
J'utilise la syntaxe @qq qui est classique pour le C++, Java, PHP, ...
http://franckh.developpez.com/tutoriels/outils/doxygen/


De même, si c'est possible, pour la partie génération de doc ?

http://axiomcafe.fr/tutoriel-documenter-un-code-avec-doxygen


Le compilateur est passé en version 4.7.2 au lieu de 4.3.2

24 versions majeurs de retard de base c'est pas mal hein :smiley-mr-green:
(et 4 entre la version 4.7.2 et la dernière version officielle)
http://gcc.gnu.org/releases.html


La procédure d'installation diffère un peu de la description du site, à savoir :
- le répertoire "etc" existe déjà.
- pas de demande d'ajouter le "PATH"

C'est possible qu'il est modifié l'installateur depuis que j'ai fait l'article mais rien de bien grave ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

icare

Bonjour,
Merci pour toutes infos, ça va me calmer sur le forum pendant que je lis tout cela  ]:D
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

icare

#28
Aug 28, 2013, 11:43 pm Last Edit: Aug 29, 2013, 12:20 am by icare Reason: 1
Bonsoir,
Je continue à me battre avec cette librairie PCF8574 et j'ai du mal à admettre de ne pas comprendre.
INITIALISATION
Il serait peut être judicieux (dans l'exemple de la librairie) de déclarer expander.begin(0x??) avant les les expander.pinMode(x, mode) puisque expander.pinMode accède à updateGPIO() qui lui écrit vers le PCF8574. L'adresse par défaut étant dans ce cas 0x00.
GESTION DES INTERRUPTIONS
Lors de l'appui sur le bouton poussoir la première fois le programme va vers ISRgateway() mais ne trouve pas la touche. Phénomène connu et lié à _oldPIN.
Par contre lors du second appui le programme se déroule correctement. Si l'on regarde le déroulement du programme dans le détail, on constate les enchaînements suivants :
saut vers ISRgateway
saut vers ISRgateway
saut vers ISRdemo
saut vers ISRgateway
saut vers ISRgateway
retour de ISRgateway
retour de ISRgateway
retour de ISRdemo
retour de ISRgateway
retour de ISRgateway
je pensais que le phénomène était lié au rebond du bouton poussoir. Mais l'utilisation d'un dispositif anti-rebond hard ne change rien au phénomène.
D'où peut provenir cet appel multiple ?
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

skywodd


Il serait peut être judicieux (dans l'exemple de la librairie) de déclarer expander.begin(0x??) avant les les expander.pinMode(x, mode) puisque expander.pinMode accède à updateGPIO() qui lui écrit vers le PCF8574. L'adresse par défaut étant dans ce cas 0x00.

Ce serait effectivement plus judicieux de faire comme ça, j'ai mis à jour l'exemple.


Lors de l'appui sur le bouton poussoir la première fois le programme va vers ISRgateway() mais ne trouve pas la touche. Phénomène connu et lié à _oldPIN.
Par contre lors du second appui le programme se déroule correctement. Si l'on regarde le déroulement du programme dans le détail, on constate les enchaînements suivants :
saut vers ISRgateway
saut vers ISRgateway
saut vers ISRdemo
saut vers ISRgateway
saut vers ISRgateway
retour de ISRgateway
retour de ISRgateway
retour de ISRdemo
retour de ISRgateway
retour de ISRgateway
je pensais que le phénomène était lié au rebond du bouton poussoir. Mais l'utilisation d'un dispositif anti-rebond hard ne change rien au phénomène.
D'où peut provenir cet appel multiple ?

C'est sûr et certain qu'il n'y a pas de rebond ?
Essaye de passer de CHANGE à FALLING dans le code de enableInterrupt() voir ce qui ce passe.
Sinon pouvoir voir le morceau de code qui génère ces messages serait pratique ;)

A mon avis c'est une histoire de changement d'état pendant la vérification des broches.
Le datasheet parle d'un reset du signal "INT" lors de la lecture/écriture des broches, le probléme vient surement de là + du mode CHANGE.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up