Problème avec deux PCF8574A

Bonjour à tous, j’ai un petit soucis récurent dans mon projet.

J’utilise deux PCF8574AN, le premier à l’adresse 0x38 pour piloter 8 leds, le second à l’adresse 0x39 ( passage à 0x3A pour quelques tests ) pour piloter 1 led ( dernière sortie ), et lire 5 boutons ( 5 premières entrées ).

Dans un premier temps, je ne désirai que lire l’état des boutons, et je m’étais rendu compte que lors de séances d’écriture, tout se passait sur l’adresse 0x38.
J’ai solutionné le problème en écrivant deux fois de suite, une fois à l’adresse 0x38, puis une seconde fois à l’adresse 0x39, sans jamais vraiment comprendre l’obligation de cet ordre.
Comme les LEDs devaient représenter l’état des boutons, cela ne posait aucun soucis dans le programme.

Maintenant, je désire lire l’état des LEDs sur l’adresse 0x38. Et ce coup-ci, il semble me lire le forçage à 1 des boutons de l’adresse 0x39.

Je n’arrive vraiment pas à comprendre ce qu’il se passe là.

Mon code de lecture / écriture:

byte PCF8574AN_read ( byte _address ) {
	byte _PCF_data;
	
	Wire.beginTransmission ( ( uint8_t ) _address );
	Wire.endTransmission ();
	
	Wire.requestFrom ( ( uint8_t ) _address, 1 );
	
	if ( Wire.available () ) _PCF_data = Wire.read ();
	
	Wire.endTransmission ( 1 );
	
	return _PCF_data;
}

void PCF8574AN_write ( byte _address, byte _data ) {
	Wire.beginTransmission ( ( uint8_t ) _address );
	Wire.write ( ( uint8_t ) _data );
	Wire.endTransmission ( 1 );
}

Bonjour, Fait une recherche sur le forum car le sujet à fait l'objet de nombreux topics. Exemple d'une bibliothèque qui fonctionne bien Un des nombreux topics du site @+

Bonjour, merci pour ton lien, mais ce n'est pas vraiment ce que je rencontre. Pour la lib, je n'ai pas jugé utile de l’essayer vu le peu qu'il y avait à écrire pour mon programme. De plus, je n'ai pas précisé, mais j'utilise un DUE.

En gros, mon soucis est lié à l'utilisation de deux PCF8574AN. Lorsque je n'en utilise que un ( les deux sont branchés physiquement, mais le code ne fait appel qu'à un seul ), il fonctionne correctement.

Lorsque je fais appel à 2, j'initialise mon second pour les entrées, et en cas d'écriture, je suis obligé d'écrire dans l'ordre du premier, puis du second, et ce même si je n'ai rien à écrire sur le premier.

Maintenant que je désire lire le premier, il semble lire les 5 premiers bits du second. Je ferai des essais en fin de journée en écrivant un peu plus sur le second, voir si ce sont seulement 5 bits ou les 8 bits qui sont lus.

En gros, c'est comme si l'adresse était passée de façon aléatoire.

Je me répond à moi même. Je ne sais plus si j'avais trouvé le code sur le net ou si je l'ai adapté de celui que j'ai pour mon EEPROM, mais en tout cas, il semblerait qu'en supprimant ces deux lignes dans la routine de lecture, tout semble se passer sans soucis.

Wire.beginTransmission ( ( uint8_t ) _address );
Wire.endTransmission ();[code]