Forum: Mikrocontroller und Digitale Elektronik PCA9555 (I2C Expander) reagiert komisch


von Stefanie (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
wie im PDF dargestellt, so ist mein PCA9555 an den I2C Bus
angeschlossen. Nun teste ich gerade meine Software aus, habe aber so
einige Probleme damit:
Habe folgendes zum Testen geschrieben (schicke hier nur die Register,
die ich der Reihenfolge nach sende);

Version 1:
unsigned char outpMw[6];   /* diese 8 Bytes werden bei Waerme gesendet
*/
outpMw[0] = 0x06;           /* Das erste Konfigurationsregister wird
nun angesprochen */
outpMw[1] = 0x00;           /* Port 0 wird als Ausgang definiert */
outpMw[2] = 0x00;           /* Port 1 wird als Ausgang definiert */
outpMw[3] = 0x02;           /* Das erste Output-Port wird angesprochen
*/
outpMw[4] = 0xFF;           /* vom Port 0 sollen alle Laempchen brennen
*/
outpMw[5] = 0xFF;           /* vom Port 1 sollen alle Laempchen brennen
*/

So habe ich das Datenblatt verstanden, d.h. er schreibt automatisch ins
nächste Register.

Was passiert??
Es brennen alle LEDs mit geraden Zahlen, außer das LED10 es ist also,
als hät ich aus den POORT0 0xAA und auf den PORT1 0xA8.


Version 2 (nun sage ich jedesmal, in welches Register er schreiben
soll):

unsigned char outpMx[8];
outpMx[0] = 0x06;           /* Das erste Konfigurationsregister wird
nun angesprochen */
outpMx[1] = 0x00;           /* Port 0 wird als Ausgang definiert */
outpMx[2] = 0x07;           /* Das zweite Konfigurationsregister wird
nun angesprochen */
outpMx[3] = 0x00;           /* Port 1 wird als Ausgang definiert */
outpMx[4] = 0x02;           /* Das erste Output-Port wird angesprochen
*/
outpMx[5] = 0xFF;           /* vom Port 0 sollen alle Laempchen brennen
*/
outpMx[6] = 0x03;           /* Das zweite Output-Port wird angesprochen
*/
outpMx[7] = 0xFF;           /* vom Port 1 sollen alle, außer die beiden
letzten beiden Laempchen brennen */


unsigned char outp00[8];    /* diese 8 Bytes werden werden wieder auf
Null gesetzt */
outp00[0] = 0x06;           /* Das erste Konfigurationsregister wird
nun angesprochen */
outp00[1] = 0x00;           /* Port 0 wird als Ausgang definiert */
outp00[2] = 0x07;           /* Das zweite Konfigurationsregister wird
nun angesprochen */
outp00[3] = 0x00;           /* Port 1 wird als Ausgang definiert */
outp00[4] = 0x02;           /* Das erste Output-Port wird angesprochen
*/
outp00[5] = 0x00;           /* vom Port 0 soll kein Laempchen brennen
*/
outp00[6] = 0x03;           /* Das zweite Output-Port wird angesprochen
*/
outp00[7] = 0x00;           /* vom Port 1 soll kein Laempchen brennen
*/

unsigned char outpMx[8];
outpMx[0] = 0x06;           /* Das erste Konfigurationsregister wird
nun angesprochen */
outpMx[1] = 0x00;           /* Port 0 wird als Ausgang definiert */
outpMx[2] = 0x07;           /* Das zweite Konfigurationsregister wird
nun angesprochen */
outpMx[3] = 0x00;           /* Port 1 wird als Ausgang definiert */
outpMx[4] = 0x02;           /* Das erste Output-Port wird angesprochen
*/
outpMx[5] = 0xFF;           /* vom Port 0 sollen alle Laempchen brennen
*/
outpMx[6] = 0x03;           /* Das zweite Output-Port wird angesprochen
*/
outpMx[7] = 0xFF;           /* vom Port 1 sollen alle, außer die beiden
letzten beiden Laempchen brennen */


Was passiert??
Es brennen nur noch LED12, LED14 und LED16 und nur LED2/4/6/8 blinken
ganz kurz auf. Es ist also, als hätte ich auf Port 0 0x00 und auf Port
1 0x8A geschrieben.

Noch als Anmerkung: Ich sende immer alles auf einmal, also erst Start,
dann die Adresse und dann jeweils das Array "am Stück" und dann Ende.


Was mach ich falsch? Muß ich ein bestimmtes Timing beachten? Fällt euch
was dazu ein?

von Stefanie (Gast)


Lesenswert?

OH SORRY, war natürlich falsch da oben! Kann man irgendwie den Beitrag
bearbeiten??

Also bei Version2 sende ich natürlich nur einmal das outpMx-Array!!

von Stefanie (Gast)


Lesenswert?

So funktioniert es!!!

unsigned char outdefP0[2];
outdefP0[0] = 0x06;
outdefP0[1] = 0x00;

unsigned char outdefP1[2];
outdefP1[0] = 0x07;
outdefP1[1] = 0x00;

unsigned char outpMP0[2];
outpMP0[0] = 0x02;
outpMP0[1] = 0xFF;

unsigned char outpMP1[2];
outpMP1[0] = 0x03;
outpMP1[1] = 0xFF;


Tja, da schreibt man den halben Tag irgendwelche dummen Tests, aber das
ich alles in kleinen, einzelnen Packeten schicke, dass hab ich nicht
versucht.
Jetzt funktioniert es so, wie ich es will.

Verstehen tu ich es aber nicht wirklich, denn meiner Meinung nach muss
es doch am Stück zum Senden auch gehen, oder??

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.