www.mikrocontroller.net

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


Autor: Stefanie (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefanie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Stefanie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.