Forum: Mikrocontroller und Digitale Elektronik PCF8574 - Verständnisfrage


von Kevin (Gast)


Lesenswert?

Hallo Forumsgemeinde!

Ich habe ein Problem mit dem Baustein PCF8574 und bin mir nicht sicher 
ob der Grund bei mir und meinem Verständnis oder bei dem Baustein liegt.
Ich möchte den Baustein als Ausgang nutzen und über einen Arduino per 
I2C ansteuern. Das klappt soweit auch wunderbar und alle Ausgänge lassen 
sich sauber setzen und rücksetzen.
Wenn ich nun aber z.B. zuerst den Pin P0 auf 1 (0x01) setze und dann bei 
dem nächsten Schreibzugriff den Pin P1 zusätzlich auf 1 (0x03) setze, 
wird der Pin P0 für einige us auf 0 gesetzt und zusammen mit P1 wieder 
auf 1 gesetzt. Habe dieses Verhalten bei offenem Ausgang gemessen, an 
beide Pins sind nur die Tastköpfe vom Oszi angeschlossen, also keine 
wirkliche Last.
Kommt dieses zurücksetzen des Pins von der Funktionsweise des Bausteins 
oder liegt der Fehler wo anders?

Vielen Dank für Antworten!

von Falk B. (falk)


Lesenswert?

@ Kevin (Gast)

>Wenn ich nun aber z.B. zuerst den Pin P0 auf 1 (0x01) setze und dann bei
>dem nächsten Schreibzugriff den Pin P1 zusätzlich auf 1 (0x03) setze,
>wird der Pin P0 für einige us auf 0 gesetzt und zusammen mit P1 wieder
>auf 1 gesetzt.

Das sollte eigentlich nicht so sein.

>Habe dieses Verhalten bei offenem Ausgang gemessen, an
>beide Pins sind nur die Tastköpfe vom Oszi angeschlossen, also keine
>wirkliche Last.

Möglicherweise ein Messfehler.
Oszi sauber angeschlossen?
Tastköpfe OK?
Ordentliche Masserverbindung?

Poste einen Screenshot unter Beachtung der Bildformate.

>Kommt dieses zurücksetzen des Pins von der Funktionsweise des Bausteins

Nein.

>oder liegt der Fehler wo anders?

Ja.

Denkbar wäre auch eine kapazitive Kopplung zwischen den Pins, vor allem 
auf Steckbrettern. Schalte mal einen externen 1k Pull Up widerstand an 
die Pins und miss noch einmal.

von Pete K. (pete77)


Lesenswert?

Tja, das kann natürlich an Deinem Programm liegen, wenn Du erst den Port 
auf 0 setzt und dann die Ausgänge setzt.

Aber da Du Dein Programm nicht angefügt hast, ist das ein reiner Blick 
in die Glaskugel.

von Kevin (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank für eure Antworten!

Also Messfehler würde ich ausschließen. Oszi Tastkopf ist sauber 
angeschlossen, Masse an der Masse des ICs. Ein Oszi-Screenshot hab ich 
angehängt, die Abstände von 100ms kommen vom Programm. Der gemessene 
Ausgang hängt mit einem 1,2kOhm Widerstand auf +5V.

Programm:
void Main (void)
{
  uint8_t controlPins;
  controlPins=0x00;
  I2c.write(0x38, 0x00, &controlPins, 1);
  controlPins=0x01;
  while(1)
  {
    I2c.write(0x38, 0x00, &controlPins, 1);
    delay(100);
  }
}

von Falk B. (falk)


Lesenswert?

@ Kevin (Gast)

>angehängt, die Abstände von 100ms kommen vom Programm. Der gemessene
>Ausgang hängt mit einem 1,2kOhm Widerstand auf +5V.

Man erkennt nicht wirklich viel, deine Zeitauflösung ist viel zu klein.

>    I2c.write(0x38, 0x00, &controlPins, 1);
>    delay(100);

Da du immer wieder den gleiche Wert schreibst, könnte der Fehler in der 
I2C write Funktion /Methode stecken. Was bedeuten die anderen Parameter?
0x38 ist wahrscheinlich die I2C Adresse. Aber was ist 0x00 und 1?

von Kevin (Gast)


Lesenswert?

Ich habe mir eben mal die I2C-Kommunikation angeschaut und gesehen, dass 
er immer die Adresse und dann zwei Byte sendet. Bei dem oben geposteten 
Beispiel schickt er erst die Adresse (0x38), dann das erste Byte (0x00) 
und dann das zweite Byte (0x01).
Das Problem lag also an meinem Verständnis der I2C-Adressierung.

Danke für eure Hilfe!

von Pete K. (pete77)


Lesenswert?

Kevin schrieb:
> Das Problem lag also an meinem Verständnis der I2C-Adressierung.

Schau noch mal ins Datenblatt, Du solltest schon die volle Kommunikation 
mit start/write/stop senden.
Bei Dir sehe ich kein Start und auch kein Stop.

von Falk B. (falk)


Lesenswert?

@ Kevin (Gast)

>Das Problem lag also an meinem Verständnis der I2C-Adressierung.

Nö, der Funktion I2C.write, die schreibt halt imer zwei Byte, warum auch 
immer. Für die Funktion des ICs braucht man nur eins!

von Kevin (Gast)


Lesenswert?

Die I2C-Funktionen habe ich nicht selber geschrieben, sondern die 
I2C-Lib des Arduino eingebunden.
Leider habe ich die falsche I2c.write-Funktion aufgerufen. Die, die ich 
genutzt habe ist für Bausteine mit mehreren Registern gedacht. Ich bin 
davon ausgegangen, dass bei nur einem Register die Registeradresse dann 
0x00 lautet. Die 1 hinten steht für die Anzahl der zu sendenden Bytes. 
Dadurch, dass ich die Adresse 0x00 und das Byte 0x01 gesendet habe, hat 
er erst die 0x00 und dann die 0x01 in den Bus geschrieben. Der hat also 
wie von ihm gefordert PCF8574 für einen Datenzyklus alle Ausgänge auf 0 
gesetzt und danach die gewünschten Ausgänge gesetzt.
Habe nun die richtige Funktion genommen und es funktioniert so wie es 
soll.

Die Funktion I2c.write schickt ein Start und ein Stop, von daher habe 
ich kein extra Start/Stop eingefügt, sondern nur diese Funktion 
aufgerufen.

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.