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!
@ 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.
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.
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); } }
@ 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?
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!
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.
@ 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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.