Forum: Mikrocontroller und Digitale Elektronik PCF8574t und Keypad


von Francesco L. (fralu)


Lesenswert?

Hallo liebe Community.

Ich habe ein echt komisches Phänomen.
An meiner Raspberry Pi4 ist ein PCF8574t angeschlossen. Auf diesen war 
geplant, ein Keypad 4x3 zu betreiben. Dafür müssen am PCF 4 Pins (High 
Level)als Eingang und 3 Pins als Ausgang (Low Level) konfiguriert 
werden. Das stellt alles kein Problem dar.
Die Programmiersprache ist Java. Verwendet wir die Klasse von PI4J. 
(pcf8574GpioExample)
Wenn eine Taste am Keypad gedrückt wird, werden die 5 Volt vom Eingang 
PIN gegen einen Output PIN auf null gezogen. Bis dahin stimmt alles.

Nun zum eigentlichen Problem.
Wenn die Taste losgelassen wird, sind am Input PIN weiterhin 0 Volt. 
Dieser kehrt nicht mehr auf 5 Volt zurück. Wenn ich den pcf ausstecke 
und erneut einstecke, funktioniert es wieder genau ein Mal.

Nun habe ich festgestellt, dass wenn ich Inputs und Output 
provisioniere, habe ich das oben beschriebene Problem.
Deklariere ich jedoch alle Pins als Eingang, funktioniert es. Der Input 
PIN kehrt erneut auf High zurück, wenn ich diesen mittels Schalter gegen 
GND gezogen habe.
Wird auch nur ein einzelner PIN als Output deklariert (egal ob dieser 
verwendet wird oder nicht) bleibt der Input PIN, nachdem der Taster 
betätigt wurde, und den Input PIN gehen GND zieht auf Low.
Ich komme nicht weiter.

Ich hoffe mich gut ausgedrückt zu haben.

Vielen Dank im Voraus dir eure Hilfe.

Grüße Francesco

von Falk B. (falk)


Lesenswert?

Francesco L. schrieb:
> Ich habe ein echt komisches Phänomen.
> An meiner Raspberry Pi4 ist ein PCF8574t angeschlossen.

Soso, eine Sie? ;-)

> Wenn eine Taste am Keypad gedrückt wird, werden die 5 Volt vom Eingang
> PIN gegen einen Output PIN auf null gezogen. Bis dahin stimmt alles.

OK.

> Nun zum eigentlichen Problem.
> Wenn die Taste losgelassen wird, sind am Input PIN weiterhin 0 Volt.

Sollte nicht sein, es sei denn du hast einen Kurzschluß oder deine 
Software hat das Pin heimlich auf LOW geschaltet.

> Nun habe ich festgestellt, dass wenn ich Inputs und Output
> provisioniere, habe ich das oben beschriebene Problem.
> Deklariere ich jedoch alle Pins als Eingang, funktioniert es. Der Input
> PIN kehrt erneut auf High zurück, wenn ich diesen mittels Schalter gegen
> GND gezogen habe.

Dann hat deine Software ne Macke.

> Wird auch nur ein einzelner PIN als Output deklariert (egal ob dieser
> verwendet wird oder nicht) bleibt der Input PIN, nachdem der Taster
> betätigt wurde, und den Input PIN gehen GND zieht auf Low.
> Ich komme nicht weiter.

Klemm einen 1K Pull-Up Widerstand an deine Eingänge. Wenn der es nicht 
schafft, nach dem Loslassen des Taster das Pin auf HIGH zu ziehen, dann 
MUSS das Pin auf LOW geschaltet worden sein. Vermutlich ein Problem mit 
der Bitmanipulation in der Software.

von Francesco L. (fralu)


Lesenswert?

Wenn ich mir die verwendete Klasse anschaue, habe ich keine Möglichkeit 
den Eingangspin auf Low zu setzen. Den Ausgangspin kann ich auf Low oder 
High setzen.
Meine Erfahrung als Programmierer ist nicht so groß. Könntest du hier 
weiterhelfen?

von Olaf (Gast)


Lesenswert?

> Wenn ich mir die verwendete Klasse anschaue, habe ich keine Möglichkeit

Schau dir keine Klassen anderer Leute an sondern lies das Datenblatt!
So bleibst du fuer den Rest deines Lebens doof. Die 8574 haben noch 
Ausgaenge aus MCS51 Zeiten. Die koennen nicht richtig nach Vcc schalten.
Solange du die Idee dahinter nicht verstehst kannst du dein Vorhaben 
nicht umsetzen.

Olaf

von Peter D. (peda)


Lesenswert?

Ja, da liegt ein Bug in der Klasse vor.
Der PCF8574/A hat keine Richtungsumschaltung. Er ist entweder Ausgang 
low oder Input mit Pullup.

von Olaf (Gast)


Lesenswert?

> Input mit Pullup.

Mit einem sehr schwachen Pullup....

Olaf

von Falk B. (falk)


Lesenswert?

Olaf schrieb:
> Mit einem sehr schwachen Pullup....

Stark genug, ein offenes Pin nach HIGH zu ziehen, auch wenn man mit 
einem DMM mißt. 100uA (minimal) reichen dazu.

von Falk B. (falk)


Lesenswert?

Francesco L. schrieb:
> Wenn ich mir die verwendete Klasse anschaue, habe ich keine Möglichkeit
> den Eingangspin auf Low zu setzen. Den Ausgangspin kann ich auf Low oder
> High setzen.

Dann müssen die Pins, welche als Eingang genutzt werden, beim 
Schreibzugriff IMMER als HIGH geschrieben werden. Denn das sind Open 
Drain IOs mit internem Pull-Up.

https://www.mikrocontroller.net/articles/Port-Expander_PCF8574

> Meine Erfahrung als Programmierer ist nicht so groß. Könntest du hier
> weiterhelfen?

Ich hab zwar keine Ahnung von JAVA, aber zeig mal deinen Quelltext. 
Bitte als Anhang.

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.