Abfrage eines PCF8574 ob Taste gedrückt oder nicht

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo

    Ich möchte mit Micropython und Thonny an einem PCF8574 mit dem I2C Bus einen Taster abfragen.

    Der Taster hängt am P0 und schaltet nach GND. Er wird mit einem R nach Vcc gehalten. Beim drücken soll GND erkannt werden. Die Anzeige soll mit einer LED am P7 erfolgen.

    Der I2C Bus funktioniert bereits und kann mit dem I2C Bus beliebeige LEDs am PCF8574 schalten. Hatte es mit der if Abfrage versucht und bekomme eine Fehlermeldung:

    Code
    if pcf.pin(0) = 1:
            pcf.pin(7, 0) # LED an
                else:                    
                    pcf.pin(7, 1) # LED an

    Verwende die pcf8574.py, die Adresse wird korrekt angegeben und habe sie vorher mit scan überprüft.

    Sorry bin ziemlich neu bei Python.

  • Abfrage eines PCF8574 ob Taste gedrückt oder nicht? Schau mal ob du hier fündig wirst!

  • Fehlermeldung:

    Code
    >>> %Run -c $EDITOR_CONTENT
    Traceback (most recent call last):
      File "<stdin>", line 21
    SyntaxError: invalid syntax
    >>> 

    Im ori hatte die Datei pcf8574.py auch einen Fehler drin. In der Zeile 24 war eine Adresse angegeben. Habe diese Adresse gelöscht nd kann jetzt aus dem laufenden Programm mehrere PCF8574 mit unterschiedlichen Adressen angeben.

    achim

  • Guten Tag,

    in der Datei ist kein Fehler drin. Die Adresse ist dort mit 0x20 abgegeben, und muss damit nicht genannt werden, wenn es sich im einen PCF8574 ( kein PCF8574A ) mit der Hardware Pinkonfiguration A0 = LOW, A1 = LOW, A2 = LOW ist. Andernfalls muss man bei der Initiierung den Parameter "address" mit der über die PIN Beschaltung A0 bis A2 voreingestellten Adresse vornehmen. Zum Beispiel:
    address = 0x22

    Aber wie hast du den I²C Bus initiiert ? Denn auch diesen musst du bei der Objektinitiierung angeben. Das ist der i2c der als erstes vor der Adresse angeben werden muss.

    Dann wäre dir Frage auf welchem µController dieses µPython Programm laufen soll ?

    So würde das Ganze für ein RasPi PICO aussehen.

    es grüßt euer
    Willy

  • Habe mal ein Beispiel zur Ansteuerung von 2 x PCF 8574 angegeben. Beide Adressen stehen im Programm. Wenn die Adresse in der Datei pcf8574.py ist gibt es Probleme die 2 Adresse zu erkennen. Da ich teilweise auch ein Display (LCD mit PCF dran habe sind es dann schon 3 Adressen. Das Programm funktioniert ohne jeden Fehler und die LEDs blinken auf jedem PCF korrekt.

    Habe noch ein paar Angaben zu verschiedenen Funktionen mit drin. Könnten nicht ganz stimmen. Es geht mir um due Erkennung des Tastendrucks.

    Da der 2. PCF auch 4 Taster hat möchte ich das LEDs auf dem anderen PCF bei Tastendruck angehen.

  • Guten Abend,

    Warum gibst du in Zeile 5 und 6 jeweils noch machine mit an, wenn du ohnehin Pin importiert hast ?
    Wenn du diese pcf8574.py im Original gelassen hättest, hast du wieder einen Aufruffehler , weil dann müsstest du wie aufgezeigt address = 0x21 schreiben, und nicht nur 0x21.

    Was hat jetzt das Display mit der Adresse der Schaltenden PCF8574 zu tun ?
    Wenn du den i²C Bus wie in Zeile 8 Initiiert hast, was mit 100_000 auch widersinnig ist, denn der PCF8574 schafft die 400_000 oder 400 kHz, oder du verwendest Leistungslängen die ein Taktratenreduzierung notwendig machen, dann füge mal in deinem Programm ein:


    addesses = i2c.scan()
    Hier müsstet du jetzt in dieser Variablen addresses drei gefundene I²C Slaves angezeigt bekommen. Andernfalls hast du die Belegung / Beschaltung der PINs A0-A2 an den PCF8574 selber falsch ausgeführt.
    Und der dritte PCF8574 für den I²c Displayadapter hat gar nichts mit dieser PCF8574.PY zu tun, denn der Aufruf dieses PCF8574 erfolgt über eine ganz andere Bibliothek, wohl dieser beiden zur LCD Ansteuerung https://peppe8o.com/download/micropython/LCD/lcd_api.py und https://peppe8o.com/download/micropython/LCD/i2c_lcd.py

    es grüßt euer
    Willy

  • Ein scan des Busses habe ich zu Anfang ausgeführt und die 3 Adressen ermittelt. Ob ich jetzt 100kHz oder 400 kHz angebe war nicht gefragt. Es geht dabei nur um die Abfrage der Taster am PCF.

    Auch für das Display verwende ich einen PCF und somit sind 3 verschiedne Adressen notwendig auch wenn das Display andere Datein verwendet

  • Guten Abend,

    ich weiß echt nicht was du treibst !
    Wenn du den Port = Pin mit einem Pullup auf High ziehst, aber mit dem Taster ihn gegen GND ziehst, dann muss das Ergebnis der Anfrage dem logischen Pegel entsprechen.
    Also wäre die Abfrage falls du sonst keinen Beschaltungsfehler hast:

    Python
    while True:
        if pcf2.pin(0) == 0:
            pcf2.pin(7, 1)
        else:
            pcf2.pin(7, 0)

    Das Problem ist aber, dass diese Bibliothek keine Auswertung über PIN13 des IC unterstützt.
    Damit könntest du über einen zusätzlichen Pin welcher mit PIN13 des PCF8574 verbunden ist feststellen ob geschaltet wurde. In dem Moment wo eine Tasterbetätigung festgestellt wird, schaltet dieser Ausgang kurzzeitig auf LOW, das könnte man über einen Interrupt feststellen und in die Abfrage-Routine springen. Denn ohne diese Nutzung von PIN13 darf diese PIN Abfrage Routine hier diese WHILE Endlosschleife keine Verweilzeit in Form eines Sleep enthalten.

    Python
    from machine import Pin
    
    def pin_read():
        '''
        hier der Abfragecode der INPUT Eingänge mit nur einem Durchlauf 
        ohne while inkl. der LED Schaltfunktion
        '''
    
    inter = Pin(3, Pin.IN) # verbunden mit PIN13 des PCF8574
    inter.irq(trigger = Pin.IRQ_FALLING, handler=pin_read)

    es grüßt euer
    Willy

  • Die Taster habe ich vor längerer Zeit aufgebaut. Da war die Aussage, das der Eingangspin nicht unbeschaltet sein soll. Es gab 2 verschiedene Versionen. Entweder Taster auf H mit R gegen + oder auf L mit R gegen GND und jeweils einen Taster entweder auf + oder GND. Hatte dann die Version mit R gegen + und Taster gegen GND aufgebaut. Bei den beîher verwendeten AVR konnte ich das ohne Probleme umstellen bzw. negieren, z.B. mit (?(pin..)).

    Das umschalten der LED funktioniert in dem Bespiel, leider die Abfrage des Tasters nicht.

    Code
    if pcf2.pin(0) == 1:
            pcf2.pin(6, 1) # 0=LED an
        else:
            pcf2.pin(6, 0) # 1-LED aus

    Das LED an/aus kommt aus der Verschaltung der LEDs nach GND/+.

    Wenn die Abfrage des Tasters richtig funktionieren würde müsste doch die LED korrekt schalten?

  • Guten Tag,

    ich habe absolut keine Ahnung was du mit dieser Aussage bezweckst.

    Dein Code falls er in der Formatierung richtig geschrieben ist, nicht mit dem noch einmal zusätzlich eingerückten else dann schaltet die LED mal kurz für den Moment wo eine Tasterbetätigung festgestellt wird auf ON, und geht sofort wieder aus, wenn der Taster losgelassen wird. Aber auch nur dann, wenn der Pegel am Eingang von LOW auf HIGH geht.
    Zur Formatierung im Python Code. Eine ELSE hat immer die gleiche Einrückung wie das zugeordnete IF.

    Hier noch einmal die Erläuterung zu den Registerabfragen:

    Wenn du Taster an einen Eingang des PCF8574 anschließt gibt es zwei Möglichkeiten
    1) Mit einem Pullup wird der Pegel bei geöffneten Taster auf HIGH gehalten. Damit ist die Abfrage im ungeschalteten Zustand des Tasters der mit GND verbunden ist, immer HIGH oder 1 solange keine Tasterbetätigung stattfindet.
    2) Mit einem Pulldown wird der Pegel bei geöffnten Taster auf LOW gehalten. Damit ist die Abfrage des Statusregisters im ungeschalteten Zustand immer 0 , und wechselt auf HIGH bzw. 1 wenn der Taster dann mit der Vc- Pin des PCF8574 verbunden ist.
    Jedoch regiert der PIN13 INT nur wenn der Pegel an einem Eingang auf HIGH wechselt.
    Daher auch die Frage, was soll bei Tasterbetätigung passieren ? Soll die LED nur solange leuchten, wie der Taster gedrückt wird, oder soll die dazugehörige LED angehen, und an bleiben bis zur erneuten Tasterbetätigung ? Dann musst du noch beachten, dass Taster prellen.

    Jetzt musst du auf deine Spannungsversorgung achten.

    Da du keine Angaben gemacht hast wie der PCF8574 über den PIN16 versorgt wird, kann ich hier nur raten. Daher spielen die Größen der Widerstände sowohl Vorwiderstände der LEDs wie auch der Pullup Widerstände ein gewisse Rolle. Denn der Gesamtstrom der durch den PCF8574 fließt darf keinesfalls 80mA überschreiten. Jetzt kommt aber auch noch das Problem hinzu, weil du keinen Schaltplan veröffentlicht hast, woher bekommt der PCF seine Versorgungsspannung ? Ich hoffe nicht das alle drei PCF8574 am GPIO - Pin 36 = Vout 3,3 V des PICO hängen.

    Daher mal bitte den aktuellen Schaltplan beifügen. Auch welche Komponente woher mit welcher Spannung versorgt werden, und dein bisheriger, vollständiger Programmcode.

    es grüßt euer
    Willy

  • Die beiden PCFs werden von +5V betrieben. Am Pico (1 und 2, SDA und SCL) liegen Pegelwandler von 3,3V auf 5V

    Als R verwende ich 10k. Schaltung muss ich raussuchen

  • Guten Tag,

    ich hatte es schon in meinem #9 erwähnt.

    Denn ohne diese Nutzung von PIN13 darf diese PIN Abfrage Routine hier diese WHILE Endlosschleife keine Verweilzeit in Form eines Sleep enthalten.

    Du verfolgst mit den utime.sleep() den vollkommen falschen Software Lösungsansatz. Denn nach jedem dieser Programmsegment macht das Programm ein Pause von 1 Sekunde, und dann den Zeitpunkt zu treffen, wann gerade wieder die Abfrage kommt, und dabei gleichzeitig den Taster gedrückt zu haben ist eher unwahrscheinlich.

    Das Programm wartet auf ein LOW getriggertes Signal aus PIN13 des PCF2 an GPIO2.
    Wenn durch einen erkannten Tastendruck das Signal INT auf LOW fällt springt das Programm in die Interrupt-Routine pcf_taster. Hier erfolgt jetzt die Abfrage der einzelnen PORTs am PCF8574, sowie einer Wertzwischenspeicherung in der LIST LED. Anschließend werden die LEDs ( Bauelemente ) entsprechend der Portzuweisung 4+x auf den entsprechenden Logikpegel geschaltet. Diese sleep_ms(20) soll das mechanische Taster-Prellen unterdrücken.

    Alles was nach der letzten Zeile kommt wieder weiterhin ausgeführt, und nur dann unterbrochen wenn wieder eine Rückmeldung über den INT Kanal kommt. Ist diese Funktion pcf_taster durchlaufen, macht das eigentliche Programm an der Stelle weiter wo es durch den Interrupt unterbrochen wurde.

    es grüßt euer
    Willy

    Einmal editiert, zuletzt von WillyR_aus_C (27. November 2022 um 18:53) aus folgendem Grund: Fehler im Programmcode

  • Hallo

    Da bin ich aber ganz schön geplättet. Habe nicht erwartet das es so wird. Habe die Programme bisher immer so aufgebaut oder weiter gemacht, in dem ich ein Stück Programm nehme was funktioniert und erweitere Teile hinzufüge. Dabei geht es mir auch darum vorhandene Hardware zu nutzen. Da ich mit dem lesen und Anwendung der Sachen aus dem Python Buch nicht soweit vorgedrungen bin, gestatte mir etwas zum Programm zu fragen um es zu verstehen.

    Ist das das Interrupt Programm pcf_taster(pin)?

    Code
    def pcf_taster(pin):
        global pcf2
        global LED
        LED[0] = (1 if pcf2.pin(0) == HIGH else 0)
        LED[1] = (1 if pcf2.pin(1) == HIGH else 0)
        LED[2] = (1 if pcf2.pin(2) == HIGH else 0)
        LED[4] = (1 if pcf2.pin(3) == HIGH else 0)
        for i in range(4):
            pcf2.pin(4 + i, LED[i])
        sleep_ms(Bounce)

    Das ist das Programm Stück für den I2C Bus:

    Code
    SDA_Pin = 0
    SCL_Pin = 1
    Bus_Host = 0 
    PCF_Address1 = 0x20
    PCF_Address2 = 0x21
    i2c_bus = I2C(Bus_Host, sda = Pin(SDA_Pin), scl = Pin(SCL_Pin), freq = 400_000)

    Die Angaben zum Bus gefallen mir. Werde ich ab jetzt benutzen.

    Damit machst du scan auf dem Bus:

    Code
    scan = i2c_bus.scan()
    if PCF_Address1 in scan:
        pcf1 = PCF8574(i2c_bus, PCF_Address1)
    if PCF_Address2 in scan:
        pcf2 = PCF8574(i2c_bus, PCF_Address2)

    Es wird damit auf beiden Adressen der Bus gescant. Warum eigentlich wenn die Adressen bekannt sind?

    Scan mach ich sonst mit einem anderen Programm.

    Pin 13 (Int) habe ich nach aussen geführt und keine Verbindung zum Pico.

    Das Schaltbild habe ich noch nicht gefunden. Vermutlich habe ich es noch mit der alten Software gezeichnet. Wenn ich es nicht finde zeichne ich es noch mal.

    Was meinst du mit genau:

    " Alles was nach der letzten Zeile kommt wieder weiterhin ausgeführt, und nur dann unterbrochen wenn wieder eine Rückmeldung über den INT Kanal kommt. Ist diese Funktion "pcf_taster" durchlaufen, macht das eigentliche Programm an der Stelle weiter wo es durch den Interrupt unterbrochen wurde."

  • Guten Abend,

    Ist das das Interrupt Programm pcf_taster(pin)?

    Das ist kein Programm sondern nur eine Funktion, die über die Definition:

    Python
    inter.irq(trigger = Pin.IRQ_FALLING, handler = pcf_taster)

    aufgerufen wird. Das heißt, wenn der Signalpegel an dem GPIO ( GP2) abfällt, mit dem der PIN13 des PCF8574 verbunden ist, also von HIGH auf LOW wechselt, wird ein Interrupt ( Unterbrechung ) ausgelöst und zu der Funktion gesprungen die mit handler = definiert ist.
    Von solchen GPIO-Eingangssignal abhängigen Interrrupt-Funktionen kannst du in deinem Programm bis zu 10 mal definieren, ohne das du mit einer

    Python
    while True:
        if gpio.value == 1:
            <Ausführungscode>

    permanent die CPU beschäftigen musst, diesen Port fortlaufend abzufragen.

    Es wird damit auf beiden Adressen der Bus gescant. Warum eigentlich wenn die Adressen bekannt sind?

    Das war nur ein Beispiel Programm, deswegen auch nicht zu 100% perfekt. Normal, es ist nun wieder deine Entscheidung kann es ja mal vorkommen, dass ein solcher Chip ausfällt, oder die Verdrahtung nicht mehr ganz okay ist. Wenn es sich um eine mobile Anwendung handelt, die regelmäßig immer mal wieder neu gestartet wird, aber einige Funktionen durch den Ausfall eines dieser Bus-Komponenten nicht vollständig beeinträchtigt ist, könnte man hier noch eine Ausnahmebehandlung anfügen, um zumindest die Funktionen / Programmlauf im Rahmen der noch zur Verfügung stehenden Bus-Slaves sicherzustellen, ohne dass das gesamte Programm mit einer nicht angezeigten Fehlermeldung aussteigt. Würde man z.B. als erstes das Display initiieren, könnte man auf dem Display auch ausgeben, dass zum aktuellen Zeitpunkt der PCF8574 mit dieser oder jener Funktion nicht erreichbar ist, aber der Rest deswegen trotzdem noch funktioniert.
    Wie man eine solche Ausnahmebehandlung mit FLAGs sowie try: | except: richtig programmiert, und welche Rahmenbedingungen dafür einzuhalten sind, hängt in erster Linie davon ab, was das Programm alles machen soll. Aber dazu findest du hier bestimmt über die Forensuche in der Kategorie "Python" ausreichend Beispiel, bzw eröffnest einen neuen Thread dazu. Hier würde es jetzt zu weit führen, und das Ausgangsthema sprengen.

    Pin 13 (Int) habe ich nach aussen geführt und keine Verbindung zum Pico.

    Hier musst du nur aufpassen, dass die Spannung an diesem PIN auch der maximal zulässigen Eingangsspannung eines PICO GPIO entspricht. Ich würde dich mangels umfassender Kenntnis hier an jar verweisen, der dir ggf genauer erklären könnte wie man aus den 5 Volt des PIN13 die benötigten 3,3 Volt macht. Ob hierfür ein einfacher Widerstand zureicht, ein Spannungsteiler oder sogar eine Levelshifter notwendig ist hängt von der Stromstärke ab auf die ein GPIO PIN am PICO mit High reagiert. Keinesfalls darfst du diese 5 Volt am Ausgang des PIN13 direkt auf den Interrupt auslösenden GPIO des PICO schalten !

    Was meinst du mit genau:

    " Alles was nach der letzten Zeile kommt wieder weiterhin ausgeführt, und nur dann unterbrochen wenn wieder eine Rückmeldung über den INT Kanal kommt. Ist diese Funktion "pcf_taster" durchlaufen, macht das eigentliche Programm an der Stelle weiter wo es durch den Interrupt unterbrochen wurde."

    Irgendwo muss ja auch dein Programmteil kommen, der dein Display mit Daten füttert.
    Also kann man auch ein eine klassischen Statemachine mit einer while-Schleife verzichten, wenn du zum Beispiel eine Sensorabfrage mit der Displaydarstellung auch über eine solche Funktion machst, die dann nur periodisch über einen Timer-Interrupt aufgerufen wird.
    Damit reduziert man beträchtlich die CPU-Last, und damit auch den Gesamtstromverbrauch, wenn die CPU nur aktiv wird, wenn entweder ein externer Interrupt ( über einen GPIO ) oder über einen Timer ( Zeitgesteuert ) ausgelöst wird. So kann man periodische Sensor Abfragen, oder Display-Aktualisierungen sehr Ressourcenschonend umsetzen. Dazu muss man nicht Programmschleifen andauernd durchlaufen, oder die Programmausführungsgeschwindigkeit mit sleep ausbremsen. Beachten musst du dabei jedoch, dass du mit jeder Interrupt-Quelle dir ein enges Zeitraster auferlegst. Dieses äußert sich in der Tatsache, dass auch eine solche Interrupt-Funktion von einem anderen Interrupt unterbrochen werden kann. Also solltest du möglichst keine aufwendigen und rechenintensiven Sachen innerhalb seiner solchen Funktion ausführen, sonst müsstest du weiterführend auf Interrupt-Sperren zurückgreifen. Hier aber auch gleich wieder und damit auf deine Anwendung zurückzukommen, den PCF8574: Du bzw. die CPU hat nur 20ms Zeit auf das Signal von PIN 13 ( INT ) des PCF8574 mit einer weiterführenden Abfrage zu reagieren, sonst könnte sich der Zustand an den abzufragenden Ports schon wieder geändert haben. Deswegen Interruptsperren sind z.T. notwendig und unabdingbar. Aber diese müssen wohl Bedacht eingesetzt werden, und man darf keinesfalls Vergessen dieser wieder aufzuheben.

    Und noch ein paar Worte zu deiner Programmerstellmethode und diesen Portexpandern allgemein:

    Teile am besten deine Programmfunktionen in einzelne Blöcke auf. Der Teil fragt die Taster ab, der nächste Teil steuert die restlichen LEDs am zweiten PCF8574, und wiederum der nächste Teil kümmert sich um die Displayaktualisierung. Nun musst du entscheiden, was wird durch den Benutzer von Außen eingebracht, dann sind es GPIO Interrupte, und was sollte oder kann nach einem festen Zeitschema passieren. Damit hättest du drei Funktionen die mit def beginnen und sich ausschließlich um einen einzigen Anwendungsfall kümmern. Dann musst du nur noch die Interrupte initiieren, entweder über einen GPIO, oder einen Timer.
    Da alle Portexpander über einen oder mehrere dieser INT Pins verfügen, muss man damit nicht ständig den I²C Bus durch permanente Abfragen blockieren, sondern reagiert erst in dem Fall auf ein solches Ereignis, wenn es notwendig wird. Bei dieser Art von Display ( LCD Textdisplays, einzeilig oder mehrzeilig ) sind die zu übertragenden Datenmengen noch gering. Hast du allerdings TFT- oder OLED-Displays kommst du irgendwann an die Grenzen des Datenbusses, wenn du zudem noch permanent mit deiner Methode Statemachine parallel versucht irgendwelche Ports abzufragen.
    Also um das mal vereinfacht zu sagen, die Datenblätter lesen, und die zur Verfügung stehenden Möglichkeiten der Hardware auch zum eigenen Vorteil ausnutzen.

    Belese dich, und übe erst einmal Programme so zu schreiben, dass du die CPU Belastung / Auslastung so gering wie möglich hältst, dann kommt die externe Hardware hinzu, und dann beginne die Möglichkeiten der angeschlossenen Hardware für dich und deine Zwecke optimal auszunutzen. Dazu bietet die Programmiersprache µPython fast alle Möglichkeiten, bis hin zu Stromsparmechanismen, um den Strombedarf der durch die CPU verursacht wird weiter zu senken. Aber das würde jetzt viel zu weit führen hier noch weiter in die Details zu gehen.

    EDIT: Aus dem #9 fehlerhaft angegeben Beispiel Codes - die übernommen Fehler entfernt.

    es grüßt euer
    Willy

  • Danke für deine umfassende Erklärung. Da habe ich heute abend genügend zu lesen. Der Int Pin war eigentlich gedacht auf eine Pin eines AVR zu landen der auch 5V verträgt. Mal sehen wie ich den verwenden kann.

    Nach dem ich die ganzen Verzögerungen rausgenommen habe konnte ich den PCF mit Tastern anzeigen lassen. Langsam komme ich weiter. Von deinem Programm bin ich ja noch meilenweit entfernt um es zu verstehen. Aber deine Erklärung wird da sicher weiterhelfen.

    Danke für deine Hilfe.

    achim

  • an jar verweisen, der dir ggf genauer erklären könnte wie man aus den 5 Volt des PIN13 die benötigten 3,3 Volt macht.

    https://www.ti.com/lit/ds/symlink/pcf8574.pdf

    is designed for 2.5-V to 6-V VCC operation

    och der PCF arbeitet doch mit 3,3V, Taster ran und fertig VCC an PI(co oder ESP)

    3.3V an 3.3V, GND an GND, SCL und SDA an SCL und SDA, IRQ an IRQ, Port -> Taster-> nach GND.

    Da der PCF eine Konstanstromquelle 100µA enthält ist offen immer high =1 und Taster nach GND gedrückt = low == 0

    Wenn der PCF natürlich noch 5V schalten soll dann muss man weiter denken, entweder Pegelwandler nachschalten oder vorschalten.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (27. November 2022 um 19:20)

  • Guten Abend,

    och der PCF arbeitet doch mit 3,3V, Taster ran ud fertig VCC an Pico 3.3V GND an GND SCL und SDA an SCL und SDA Taster an Port und nach GND

    Da der PCF eine Konstanstromquelle 100µA enthält ist offen immer high =1 und Taster nach GND gedrückt = low ==0

    Wenn der PCF natürlich noch 5V schalten soll dann muss man weiter denken, entweder Pegelwandler nachschalten oder vorschalten.

    Danke für deine schnell Rückmeldung.
    Wie der TO schrieb, werden die PCF8574 mit 5 V aus einer ext Quelle über Pegelwandler / Levelshifter betrieben. Damit müsste das INT Signal aus PIN13 auf 3,3V gewandelt werden. Nun weiß ich leider nicht welche ART Levelshifter er verwendet, und ob dort noch ein Port für das INT Signal frei wäre. Reicht hier ein einfacher Vorwiderstand, oder braucht man einen Spannungsteiler, oder doch den Levelshifter dafür ? Eigentlich hätte ich jetzt eher gedacht, dass der TO diesen wichtigen Punkt selber anspricht.

    es grüßt euer
    Willy

  • Wie der TO schrieb, werden die PCF8574 mit 5 V aus einer ext Quelle über Pegelwandler / Levelshifter betrieben.

    aber warum schreibt er nicht wieso und das ist nicht das erste mal das Problem, Prosa ist für Juristen, Techniker brauchen Schaltpläne denn wir wollen nicht um Auslegungen oder wer was gedacht hat streiten!

    Vielleicht hat er ja falsch gedacht und ist auf einem Holzpfad, soll vorkommen bei Nichttechnikern ohne Ahnung.

    Es ist immer besser zu beschreiben was man will als falsche Wege vorzugeben.

    Wenn der PCF vom PI ausgewertet werden soll gehört VCC an den PI seine 3.3V und GND INT auch an den PI und nirgends woanders hin! :danke_ATDE:

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (27. November 2022 um 19:38)

  • Als Pegelwandler benutze ich eine Schaltung jeweils für SDA und SCL mit je einem BSS138 und 2xR nach 5V und 3,3V. Einen Pegelwandler für Int habe ich nicht eingebaut.

    Die Platine gibt es fertig von verschiedenen Herstellern. Baue sie selber auf die Platine. Betreibe den I2C bus zwischen den verschiedenen Platinen mit 5V. Wenn ich ICs oder Pico mit 3,3V verwende ist auf der Platine 2xPegelwandler mit dem BSS138. Die Schaltung ist eigentlich bekannt.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!