Hilfe gesucht, Erklärung einer Funktion in Python

  • Hallo zusammen,

    das ist mein erster Beitrag.

    Mein Name ist Andre, bin 46 Jahre (alter Sack) und beschäftige mich hobbymäßig mit Heimautomatisierung auf dem Raspi.

    Was hab ich vor:

    Ich will mittels Raspberry ein paar Umweltsensoren auslesen und auf dem Display grafisch darstellen.

    Wenn alles läuft binde ich noch meine Fritzbox mit ein und steuere darüber die Thermostate.

    Soweit so gut.

    Ich bin allerdings auf CODESYS für Raspberry (Soft-SPS) unterwegs und habe dementsprechend von Python nicht sonderliche Ahnung.

    Derzeit bin ich dabei, mir ein Gerätetreiber für ein ICP10125 zu schreiben.

    Das ist ein barometrischer Luftdrucksensor, der über den I2C-Bus läuft.

    Für den ICP10125 gibt es ein Python-Gerätetreiber.

    In diesem ist eine Funktion enthalten, über diese alle Lese und Schreibbefehle zu den Registern des Chips gehen.

    Nur leider verstehe ich diese Funktion nicht.

    Es geht hier um die Funktion rdwr()

    Kann mir jemand erklären wie die funktioniert?

    Ich hatte zunächst versucht, die CHIP_ID zu lesen.

    Da ich aber nicht weis, auf welches Register, ich welche Byte-Reihenfolge senden muss und

    welches Register ich anschließend lesen muss, sagt der ICP demzufolge nö mit dir rede ich nicht.

    PS: ansprechen kann ich den Chip, da ich gewisse Daten auf die Adresse 16#63 (0x63) senden kann.

    Über Hilfe wäre ich äußerst Dankbar.

    Gruß

    Andre

  • Hilfe gesucht, Erklärung einer Funktion in Python? Schau mal ob du hier fündig wirst!

  • Humpelschlumpf An der Klasse ist schon mal falsch das `sensor_constants` eine Klassenvariable und damit global ist und für alle Exemplare gilt.

    Dann werden `temperature` und `pressure` ausserhalb der `__init__()` eingeführt und durch `measure()` sowohl gesetzt als auch zurückgegeben. Das ist wirr und verwirrend.

    `calculate_altitude()` steckt als reine Funktion in der Klasse. Wird aber auch gar nicht verwendet. Auch `crc8` hat als Funktion in der Klasse nichts zu suchen.

    Die `rdwr()`-Methode ist sowohl was die Argumente als auch die Rückgabewerte angeht ein bisschen sehr flexibel. Für meinen Geschmack zu flexibel. Mindestens der Rückgabewert sollte konsistent eine Liste mit Zahlen sein, statt manchmal auch eine einzelne Zahl.

    Was genau verstehst Du denn nicht? Mal davon abgesehen, dass die IMHO zu viel macht, ist das was sie macht, ja nicht so besonders kompliziert.

    Ungetesteter, überarbeiteter Quelltext:

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Hallöchen,

    wie ich schon sagte, ich hab von Python wenig Ahnung.

    Dies ist hier der Orginaltreiber von TDK invensense.

    Ich versuche zu verstehen, an welche Adresse ich das jeweilige Kommando sende und von welcher Adresse ich die Antwort bekomme.

    So wie ich das bisher verstanden habe, müsste ich also z.B. für die CHIP_ID den Wert 0xEFC8 an die CHIP_ADRESSE 0x63 Senden und

    bekomme dann von der Adresse 0x63 die CHIP_ID 0x08 zurück.

    Korrekt?

    Genauso müsste das dann auch mit den Kalibrierwerten laufen.

    Schreibe das ARRAY move_address_ptr[] an die 0x63 und lese dann 4x die 0x63 ???

    Hab ich das richtig verstanden?

    Die nächste Schwierigkeit wird dann das schreiben von 16Bit-werten sein.

    Normalerweise kann ich nur jeweils 1 Byte übergeben (write8(16#63, 16#EF);)

    Bei write8(16#63, 16#EFC8); gibt es einen Compilerfehler.

    Hier müsste ich mich noch mal schlau machen.


    Grüße

    Andre

  • So mal ein Zwischenstand meiner Bemühungen.

    Ich hab jetzt die Komunikation in Codesys nachgebaut.

    Natürlich geht es nicht, wäre ja auch zu einfach.

    Schon beim senden des 1. Befehls, geht der ICP in Störung. Überprüfen konnte ich das mit dem Befehl:

    i2cset -f 1 0x63 0xEF 0xC8 i

    i2cget -y 1 0x63

    Als Ergebnis bekomme ich dann ein ERROR.

    Sobald ich jedoch kurz das Pythonscript laufen lasse, redet der ICP wieder und ich bekomme dann ein 0x01.

    Das Problem liegt also bei Codesys. Normalerweise kann ich nur Byteweise senden, der ICP jedoch will WORD.

    Es scheint aber die Möglichkeit zu geben, Daten in WORD zu senden. Dazu mache ich mich gerade schlau.

    Mein weiteres Vorgehen ist, den Datenverehr auf dem I2C-Bus zu analysieren.

    Dazu habe ich mir ein Logic Analyzer bestellt und werd mal den Datenverkehr untersuchen.

    Ich schätze, der Vergleich des Datenverkehrs beim Pythonscript und Codesys wird mir Aufschluss geben wo es wirklich klemmt.

    Gruß

    Andre

  • So nun bin ich schlauer.

    Ich hab den LogicAnalyzer angeschlossen und mal die Kommunikation mit getrackt.

    Das Pythonscript hab ich auf read CHIP_ID und read OTP beschränkt.

    Chip ID >>> 0x63 0xef 0xc8

    Antwort <<< 0x63 0x01 0x48 0xf1 Das Ergibt 0x0148 + 0xf1(CRC8) >>>> Binär 101001000 wobei die 1000 für die Chip_ID steht.

    MOVE_ADDRESS_PTR >>> 0x63 0xc5 0x00 0x66 0x9c

    read OTP>>> 0x63 0xc7 0xf7

    Antwort <<< 0x63 0x01 0x84 0xcb ergibt 388 + 0xcb(CRC8)

    read OTP>>> 0x63 0xc7 0xf7

    Antwort <<< 0x63 0x02 0x7f 0x8e ergibt 639 + 0x8e(CRC8)

    read OTP>>> 0x63 0xc7 0xf7

    Antwort <<< 0x63 0x03 0x9e 0x8A ergibt 926 + 0x8a(CRC8)

    read OTP>>> 0x63 0xc7 0xf7

    Antwort <<< 0x63 0x0f 0x04 0xdc ergibt 3844 + 0xdc(CRC8)

    Jetzt ist mir alles klar. Der ICP arbeitet zwar mit 16Bit, aber die Daten werden dennoch Byteweise gesendet und empfangen.

    Das heißt, ich muss die Kommandos einfach nur in ein ARRAY packen und senden.

    Beim lesen genauso. Daten von 0x63 lesen und in ein ARRAY schreiben.


    Nachtrag:

    Ich habs jetzt genauso eingegeben uns siehe da, ich bekomme eine Antwort.

    Einmal editiert, zuletzt von Humpelschlumpf (21. März 2023 um 09:05) aus folgendem Grund: Nachtrag:

Jetzt mitmachen!

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