Python Programm schaltet falsch

  • Hallo Forum,

    ich versuche mich gerade an die Programmierung meines ersten "klitztekleinen" Pythonprogramm.

    Als Hardware habe ich den Raspberry PI 2, eine Digital-Ausgangskarte(DA) mit 8 Ausgängen und eine Digital-Eingangskarte(DE) mit 8 Eingängen über den I2C Bus.

    Mein Ziel war und ist es die DA-Ausgänge mit den DE-Eingängen zu schalten.

    Nach dem anschließen der Hardeware habe ich zuerst geschaut ob beiden Karten vom PI erkannt werden (i2cdetect -y 1).

    i2cdetect -y 1

    0 1 2 3 4 5 6 7 8 9 a b c d e f

    00: -- -- -- -- -- 08 -- -- -- -- -- -- --

    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3f

    DA hat die Adresse 20, DE Adresse 3f. Gebe ich z.B. die Anweisung: i2cset -y 1 0x20 0x00;i2cget -y 1 0x3f erhalte ich 0x00 und alle 8 LED's leuchten.

    Mit der Anweisung: i2cset -y 1 0x20 0xff;i2cget -y 1 0x3f erhalte ich 0xff und alle LED's schalten sich aus

    Hier kann ich jetzt alles von 0x00 bis 0xFF eingeben ich bekommen immer die richtige Auswahl und LED oder LED`s geschaltet.

    z.B. DA 0x01>DE 0x01, DA 0xD3>DE 0xD3, DA 0xA9>DE 0xA9 usw.

    Jetzt würde ich es gerne als kleines Programm laufen lassen und das Ein- und Ausschalten über Python als Endlosschleife starten. Leider ist bei mir im Programm ein Fehler und ich weiss nicht wo er liegt. Starte ich das Programm beiben bei mir die zwei LED's, also Bit 7 und Bit 8 an. Diese beiden LED's leuchten dann dauerhaft.

    Das ist die Ausgabe die ich nach dem starten bekomme.

    python3 ~/Tkinter/io.py

    63

    Ausgänge sind ein

    19

    Ausgänge sind Aus

    63

    Ausgänge sind ein

    19

    Ausgänge sind Aus

    63

    Ausgänge sind ein

    19

    Ausgänge sind Aus

    63

    Ausgänge sind ein

    19

    Ausgänge sind Aus

    63

    Ausgänge sind ein

    19

    Ausgänge sind Aus

    usw.

    Breche ich nun das Programm ab bleiben die beiden LED's an. Gebe ich jetzt den Befehl von oben wieder ein:

    i2cset -y 1 0x20 0x00;i2cget -y 1 0x3f

    0x00 > richtig

    i2cset -y 1 0x20 0xff;i2cget -y 1 0x3f

    0x3f > ?????

    ODER

    i2cset -y 1 0x20 0xef;i2cget -y 1 0x3f

    0x2f > ?????

    Erst ein abschalten der Spannung auf dem I2C Bus (Nicht den PI Spannungslos) läßt die Anweisung i2cset -y 1 0x20 0xff;i2cget -y 1 0xFF = 0xFF oder i2cset -y 1 0x20 0x00;i2cget -y 1 0x00 richtig darstellen.

    Das Programm macht immer diesen Fehler nur weiss ich beim besten Willen nicht wo mein Fehler liegt.

    Somit erst einmal Schluss und ich wünsche allen hier im Forum einen schönen Sonntag Abend.

    Gruß aus Dorsten(NRW)

    Herbert

  • Dinge, die mir sofort auffallen:

    - der I2C-Bus ist EIN Bus. Mit dem du mit mehreren Geraeten reden kannst. Davon also ZWEI Instanzen zu haben, weil du mit einem pro Geraet kommunizieren willst ist falsch. Du musst nur EINEN nehmen.

    - es mag eine Petitesse sein, aber nichtssagende Namen wie addr_01 und addr_02 sind auch nicht besser, als da gleich die respektiven Nummern hinzuschreiben. Viel besser ist es, sprechende Namen zu verwenden, wie du sie in den Kommentaren ja auch benutzt. Also zB INPUT_ADDRESS und OUTPUT_ADDRESS. Das reduziert dann auch die Chance spaeter im Skript, die zwei Adressen aus versehen zu vertauschen. Und da es Konstanten sind, und die in Python gross geschrieben werden, eben auch alles gross geschrieben.

    Das wuerde ich erstmal bereinigen, vor allem natuerlich den ersten Punkt - aber auch der zweite ist wichtig, denn schliesslich sollen wir den Code ja auch nachvollziehen koennen, und das faellt damit deutlich leichter.

  • Hallo Msdeljljh,

    mir ist aufgefallen, dass Du auf bei i2cset -y 1 0x20 0xff zwei Byte (Adresse und Daten) verwendest und im Programmcode

    drei Byte als Parameter übergibst: outset.write_byte_data (addr_01, 0x20, 0xFF).

    Kann es sein, dass Du die Adresse zweimal übergibst?

    Das Gleiche bei i2cget -y 1 0x3f; inget.read_byte_data(addr_02, 0x3f).

    Gibt es Datenblätter zu den Ein/Ausgabebausteinen?

  • Zeig einmal, wie Du die 8 Aus- und 8 Eingänge der beiden "Karten" verdrahtet hast, oder hängen je 8 Pins in der Luft ?

    Verrate auch, ob Du 8 oder 16 Bits am i2c Bus überträgst (Byte vs Word) und um welchen i2c to paralell Kontroller ("Karte") es sich pberhaupt handelt.

    Dass ein Shebang nur in dersten Scriptzeile berücksichtigt wird, und Du im Linux den UTF-8 Zeichensatz verwenden solltest, der bei Python3 schon standard ist, sei nur nebenbei erwähnt.

    Servus

    RTFM = Read The Factory Manual, oder so

  • Hallo Forum

    ghubi01

    Danke für die Rückmeldung.

    Das Ändern auf 1(DIN) oder 2 (DOUT) Parameter ergibt eine Fehlermeldung.

    Die Zeile:

    bus.write_byte_data(ADDRESS_DIGI_OUT01,0x20,0xff)

    geändert in:

    bus.write_byte_data(ADDRESS_DIGI_OUT01,0xff)

    ergibt:

    Traceback (most recent call last):

    File "probe.py", line 16, in <module>

    bus.write_byte_data(ADDRESS_DIGI_OUT01,0xff) # Bank A Output

    TypeError: write_byte_data() takes exactly 3 arguments (2 given)

    Die Zeile:

    bus.read_byte_data(ADDRESS_DIGI_IN01,0x3f)

    geändert in:

    bus.read_byte_data(ADDRESS_DIGI_IN01)

    ergibt:

    Traceback (most recent call last):

    File "/home/pi/Tkinter/io.py", line 17, in <module>

    bus.read_byte_data(ADDRESS_DIGI_IN01)

    TypeError: read_byte_data() takes exactly 2 arguments (1 given)

    Datenblätter habe ich unten mit eingefügt.


    RTFM auch an Dir ein Danke für die Hilfe

    Wie im Bild angefügt ist der Aufbau. GND von Raspberry Pi und 5V Netzteil sind miteinander verbunden das Labornetzteil z.Z. nicht. Hatte vorher aber auch dieses mit Pi und 5V Netzteil verbunden.

    zu:".....

    Dass ein Shebang nur in dersten Scriptzeile berücksichtigt wird, und Du im Linux den UTF-8 Zeichensatz verwenden solltest, der bei Python3 schon standard ist, sei nur nebenbei erwähnt.....".

    Ich hatte diese Zeile vorher nicht eingefügt und eine Fehlermeldung bekommen weil ich Umlaute im Text hatte.

    "File "probe.py", line 11

    SyntaxError: Non-UTF-8 code starting with '\xd6' in file probe.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details"

    Nochmals vielen Dank aus Dorsten(NRW)

    Herbert

  • Es müssen schon drei Argumente zum schreiben und zwei zum lesen sein. Der IC wird ja über Register adressiert. Es sollte für diesen beliebten IO Expander doch schon Code Beispiele geben ?

    Einmal editiert, zuletzt von MistyFlower59469 (9. März 2020 um 09:22)

  • ok, ich muss mich korrigieren. Der hat keine Adressen. Sondern nur ein Byte zu lesen/schreiben. Dafür gibt es andere Aufrufe auf dem smbus Interface. Kann ich aber erst später raussuchen.

  • Msdeljljjth

    änder mal bus.write_byte_data ab in bus.write_byte.

    Das Gleiche für "read".

    Erklärung:

    write_byte(ADRESSE,DATA); schreibt ein Byte in das angesprochenen I2C-Device

    write_byte_data(ADRESSE,REGISTER,DATA); schreibt ein Byte in das Register des angesprochenen I2C-Device

    read_byte(ADRESSE); liest ein Byte vom angesprochenen I2C-Device

    read_byte_data(ADRESSE, REGISTER); liest ein Byte aus einem Register des angesprochenen I2C-Device

  • 5V Signale an PI?:conf:

    keine gute Idee!

    Bist du sicher das die I2C Anbindung am PI potenzialfrei ist?:denker:

    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)

  • Dafuer hat er einen Pegelwandler in dem sehr gelungenen Schaltplan

    war mir zu winzig, ich erkannte es nicht zumal ich nur 5V Speisung sah!:angel:

    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)

  • Und der Testaufbau mit der direkten Verbindung der I/O Pins an den PCF8574 Modulen kann auch nur dann funktionieren, wenn die 12 V aktiviert sind ("Netzteil") UND keine Pullups/Pulldowns an einem Pin den Status verfälschen. Ich würde 8 LEDs an der Ausgabeseite und einen 8er DIP Switsch, oder eine 2 x 8 Pinleiste mit Codiersteckern verwenden, aber das ist Geschmacksache.

    Jetzt sollte das Python Programm genauso tip-top werden, wie der Schaltplan.

    Mit einem Python3 Shebang in der ersten Zeile, erstellt mit einem UTF-8 Editor (sonst stört wieder das Ö im Komentar) und ohne doppelte Chip-Adressen (schon indirekt erledogt).

    Servus !

    RTFM = Read The Factory Manual, oder so

  • Hallo Forum

    Veilen Dank an Alle für die Hilfe und Geduld.

    hyle

    Vielen Dank für die Begrüßung und ich werde versuchen mich daran zu halten.


    @_deets_

    Bin kein besonders guter Zeichner und habe hier versucht das wichtigste aufzuzeichnen,

    zudem habe ich gehofft, dass durch die Schaltpläne etwas mehr Licht hier zu sehen ist.

    Sollte es positiv gemeint sein vielen herzlichsten Dank, wenn negativ verspreche ich mir mehr Mühe zu geben!.

    jar

    Danke für den Hinweiss: "5V Signale an PI?" ,

    zuerst hatte ich den Pegelwandler vergessen mitzubestellen. Das es zu klein geworden ist tut mir leid.

    Hatte gedacht der Hinweiss:"Pegelanpassung von 3,3 Volt auf 5 Volt und IC-Repeater" würden reichen. Deswegen habe ich auch keine 1 zu 1 Verbindung von DOUT zu DIN gezeichnet sondern förmlich ein Kabel.

    ghubi01

    Auch an Dir ein herzliches Dankeschön!

    Habe den Code wie Du geschrieben hast verändert.

    python3 ~/Tkinter/io.py

    Die 255 sind jetzt, wenn ich es richtig verstehe meine 8 Bit 0xFF = 1111 1111.

    deweiteren die 0 8 Bit 0x00 = 0000 0000

    Habe jetzt den Wert von 0xFF in 0xAA geändert und erhalte nach umwandeln in DEC 170.

    Nach dieser Änderung, wie es "ghubi01" weiter oben erklärt hat, leuchten auch D7 und D8 nicht mehr.

    Zum Schluss muss ich euch leider gestehen das ich nicht weiss was ich dort jetzt ganz genau gemacht habe. Werde versuchen etwas darüber im WWW zu finden. Ausserdem würde ich auch gerne ein paar Tips zu den Bezeichnungen die ich gewählt habe hören/lesen (zB. zu lang, zu kurz, usw.).

    Meine Bezeichnung :

    Code
    ADDRESS_DIGI_OUT01

    auf evtl. AD_DI_O01 kürzen?

    Code

    Somit bedanke ich mich nochmals gerne bei Allen beteiligten für die Hilfe, Geduld und hoffe das ich das mit dem CODE einstellen nun richtig gemacht habe.

    Vielen Dank aus Dorsten(NRW)

    Herbert

  • jar

    Danke für den Hinweiss: "5V Signale an PI?" ,

    zuerst hatte ich den Pegelwandler vergessen mitzubestellen. Das es zu klein geworden ist tut mir leid.

    Hatte gedacht der Hinweiss:"Pegelanpassung von 3,3 Volt auf 5 Volt und IC-Repeater" würden reichen. Deswegen habe ich auch keine 1 zu 1 Verbindung von DOUT zu DIN gezeichnet sondern förmlich ein Kabel.

    alles GUT, der PI bringt ja eigene pullups nach 3,3V mit bei den Standardpins, da ich immer den o.ä verwende

    https://eckstein-shop.de/SparkFun-Logic…er-Pegelwandler

    da fehlte mir halt die Verbindung zu 3,3V vom PI, es gibt halt unzählige Schaltungen für I2C und nicht immer ohne pullups und nicht immer OC (open collector);)

    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)


  • Hallo Forum,

    RTFM

    Zitat


    zu:"

    Und der Testaufbau mit der direkten Verbindung der I/O Pins an den PCF8574 Modulen kann auch nur dann funktionieren, wenn die 12 V aktiviert sind ("Netzteil") UND keine Pullups/Pulldowns an einem Pin den Status verfälschen."

    Ich habe einmal während des Betriebes die 12 Volt des Netzteil's abgeschaltet. In diesem Fall springt der Ausgabewert von 170 auf 255.

    zu:

    Zitat

    Ich würde 8 LEDs an der Ausgabeseite und einen 8er DIP Switsch, oder eine 2 x 8 Pinleiste mit Codiersteckern verwenden, aber das ist Geschmacksache.


    muss ich gestehen das ich nicht genau weiß wie es gemeint ist :"....8er DIP Switsch, oder eine 2 x 8 Pinleiste mit Codiersteckern....".

    Auch hier ein herzliches Dankeschön für deine Geduld und Hilfe.

    Somit allen einen schönen Montag aus Dorsten(NRW)

    Herbert

  • War positiv gemeint. Hier wird oft nach nem Schaltplan gefragt, und du hast einen sogar ungefragt geliefert ?? Der muss natürlich auch gelesen werden ?

  • Hallo Forum,

    Vielen Dank an euch für die Unterstützung und Hilfe es hat mich sehr gefreut wie schnell mir hier geholfen wurde.

    Hier noch einmal, zur besseren Übersicht, eine Vor- und Nachher Beschreibung.

    Ziel war es für mich das die 8 digitalen Ausgänge die 8 digitalen Eingänge im 5 Sekunden Takt schalten.

    Vorher:

    Da es hier so SUPER geklappt hat nochmals an dieser Stelle ein Danke an euch und einen schönen ruhigen Montag Abend.

    Für mich ist somit das Problem gelößt und ich werde einmal schauen das ich den Code wirklich verstehen und begreifen werde.

    Ich Grüße euch aus Dorsten(NRW)

    Herbert

Jetzt mitmachen!

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