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

Bonjour,
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.
@+
« Last Edit: September 05, 2013, 09:19:49 am by icare » 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: 1238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir Skywodd,
Problème de compréhension code :
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 :
Code:
#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 :
Code:
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 ?
@+
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

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.

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?
Oui broche D8 de l'arduino et non du PCF8574.

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 smiley-cool
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
« Last Edit: September 07, 2013, 05:59:56 am by skywodd » Logged

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

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

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
« Last Edit: September 07, 2013, 02:57:12 pm by icare » 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: 1238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :
Code:
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.
@+
« Last Edit: September 07, 2013, 05:05:35 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

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

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

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

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() ?
« Last Edit: September 09, 2013, 02:05:22 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

[EDIT] Comment faire un blink sans utiliser delay() ?
Avec millis() (voir exemple "blinkwithoutdelay")
Logged

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

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

Bonsoir;
[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. smiley-sad
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

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

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

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

Re,
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?
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: 1238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley
« Last Edit: September 15, 2013, 11:42:38 am 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

Attend, du coup ça marche ou ça marche plus ?
Je suis complétement à la ramasse en ce moment smiley-zipper
Logged

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

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

Bonjour,
Attend, du coup ça marche ou ça marche plus ?
Je suis complétement à la ramasse en ce moment smiley-zipper
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.
« Last Edit: September 16, 2013, 11:00:29 am by icare » 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: 1238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.45 KB - downloaded 9 times.)
Logged

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

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