Pages: 1 [2] 3 4 5   Go Down
Author Topic: [RESOLU] Utilisation bibliothèques PCF8574 et PCF8575  (Read 6388 times)
0 Members and 1 Guest are viewing this topic.
Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1298
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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). smiley-sad
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) ?
@+
Logged

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

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1298
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Re,
J'ai essayé de compiler avec la version 1.5.2 d'Arduino, même punition smiley-sad
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:
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
@+
« Last Edit: August 22, 2013, 02:21:56 pm by icare » Logged

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

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai essayé de compiler avec la version 1.5.2 d'Arduino, même punition smiley-sad
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 smiley-wink

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).
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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). smiley-sad
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 smiley-wink
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1298
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
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
@+
Logged

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

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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/
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
IPCF8574 KEYWORD1  <--- OUI
~IPCF8574 KEYWORD1  <--- NON (à supprimer)


Dans le fichier .h
- mini conseil : pour ta doc utilise doxygen smiley-wink
Code:
/*
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:
/**
 * @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 smiley-wink

- 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:
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:
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:
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:
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:
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
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1298
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
@+
Logged

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

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1298
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

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

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1298
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Re,
Dans le fichier .h
- mini conseil : pour ta doc utilise doxygen smiley-wink
Code:
/*
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:
/**
 * @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 smiley-wink
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
@+
Logged

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

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1298
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
@+
Logged

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

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
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 smiley-wink
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1298
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Merci pour toutes infos, ça va me calmer sur le forum pendant que je lis tout cela  smiley-twist
@+
Logged

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

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1298
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
@+
« Last Edit: August 28, 2013, 05:20:14 pm by icare » Logged

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

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: 1 [2] 3 4 5   Go Up
Jump to: