Go Down

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

icare

#45
Sep 05, 2013, 04:13 pm Last Edit: Sep 05, 2013, 04:19 pm by icare Reason: 1
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.
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

icare

Bonsoir Skywodd,
Problème de compréhension code :
Code: [Select]
  /* 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: [Select]
#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: [Select]
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 ?
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

skywodd

#47
Sep 07, 2013, 12:51 pm Last Edit: Sep 07, 2013, 12:59 pm by skywodd Reason: 1

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

icare

#48
Sep 07, 2013, 06:42 pm Last Edit: Sep 07, 2013, 09:57 pm by icare Reason: 1
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
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

icare

#49
Sep 07, 2013, 11:42 pm Last Edit: Sep 08, 2013, 12:05 am by icare Reason: 1
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: [Select]
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.
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

skywodd

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

icare

#51
Sep 09, 2013, 08:58 pm Last Edit: Sep 09, 2013, 09:05 pm by icare Reason: 1
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() ?
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

skywodd


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

Avec millis() (voir exemple "blinkwithoutdelay")
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

icare

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

skywodd


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. :(

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

icare

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

icare

#56
Sep 15, 2013, 05:25 pm Last Edit: Sep 15, 2013, 06:42 pm by icare Reason: 1
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. :)
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

skywodd

Attend, du coup ça marche ou ça marche plus ?
Je suis complétement à la ramasse en ce moment :smiley-zipper:
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

icare

#58
Sep 16, 2013, 05:26 pm Last Edit: Sep 16, 2013, 06:00 pm by icare Reason: 1
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.
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

icare

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

Go Up