PCF8574 - Verständnisfrage

Gast #3398622
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!
#3398627
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.
Gast #3398699
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);
  }
}
Angehängte Dateien:
#3398828
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?
Gast #3398845
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!
Gast #3399075
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren