Mit ESP8266 AIN0 am PCF8591 auslesen

  • Aber ich komme nicht dahinter, wie sich defaultmässig die 0x48 ergeben soll.

    Ja, darüber habe ich auch schon mal gegrübelt. Meiner Meinung nach ist der Sachverhalt so: I²C kann bis zu 127 Geräte adressieren (7 Bit). Diese Adresse wird z.B. mit 0x48 angegeben. Die jeweilige I²C Routine hängt hinten dran noch die 0 bzw. 1 (also z.B. 0x90/0x91)- also schickt diese als Adresse...

    laut Schaltplan ist das aber egal mit dem 0x92 0x93, weil A0, A1 und A2 fest auf 0 gedrahtet sind

    GENAU! Also entweder Adresse 0x48 mit Read/Write per fertiger Routine oder eben 0x90/0x91 wenn man es selbst sendet.

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Meiner Meinung muss das so aussehen:

    INIT = send(0x90) send(0x00)

    READ = send(0x91)

    Byte empfangen

    Hallo Bernd,

    genau so dachte ich mir das auch. Empfangen tue ich ja auch was, allerdings immer nur die Zahl 255. Allerdings habe ich hier erst mit dem 0x92, also A0 nen Wert bekommen, vorher kam nur eine Meldung das er quasi keine Verbindung aufbauen konnte.


    Ja, darüber habe ich auch schon mal gegrübelt. Meiner Meinung nach ist der Sachverhalt so: I²C kann bis zu 127 Geräte adressieren (7 Bit). Diese Adresse wird z.B. mit 0x48 angegeben. Die jeweilige I²C Routine hängt hinten dran noch die 0 bzw. 1 (also z.B. 0x90/0x91)- also schickt diese als Adresse...

    GENAU! Also entweder Adresse 0x48 mit Read/Write per fertiger Routine oder eben 0x90/0x91 wenn man es selbst sendet.

    Wie die Zahl Zustande kommt, das kann ich leider nicht sagen, die wurde quasi vorgegeben und steht so auch im Buch drin.

    Wie gesagt, eine Verbindung kommt erfolgreich Zustande, nur der Wert (255) wird egal was ich an dem Drehrädchen mache abgerufen.

  • Moin guenni81,


    du machst es , meiner Meinung, falsch. Schau dir mal dieses Bild an.


    Danke für den Link, das sieht auf alle Fälle mal interessant aus und werde ich mir sobald ich es zeitlich schaffe anschauen.

    Klar, irgendwas muss ich ja falsch machen, sonst ginge es wie erwartet. ;)
    Wie sollte es dann in der Konstellation korrekt sein, ich kann dir leider nicht ganz folgen auf welchen Teil du dich beziehst...

  • Moin guenni81,


    // READ
    i2c_master_start();
    i2c_master_writeByte(0x93); // Öffnen zum lesen
    ackValue = i2c_master_getAck();

    Das ist falsch!


    Du solltest i2c_master_read(0x93) schreiben. Weil eigentlich include ic2.h die Arbeit übernehmen sollte.

    Ich hoffe es ist nun klarer geworden?


    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"

    Vielleicht trifft man sich in der RPi-Plauderecke.

  • Du solltest i2c_master_read(0x93) schreiben. Weil eigentlich include ic2.h die Arbeit übernehmen sollte.

    Ich hoffe es ist nun klarer geworden?

    Hallo Bernd,

    nun ist es ein wenig klarer geworden. Leider existiert bei mir in der header Datei vom i2c nur eine Funktion

    Code
    /**  
      * @brief   read Byte from i2c bus.
      * 
      * @param null
      *  
      * @return  the byte which read from i2c bus.
      */
    uint8 i2c_master_readByte(void);

    Ich habe mich natürlich auch versucht an das vorgehen im ESP8266-RTOS-Sample-Code zu orientieren.

    https://github.com/espressif/e…i2c_Host/user/user_main.c


    Ich denke mal ich werde das ganze nochmal komplett neu Programmtechnisch aufbauen und falls es immer noch nicht funkionieren sollte mal mit dem Raspberry Pi ansteuern und/oder das Arduino Framework zum Funktionstesten mal heran ziehen.

  • Moin guenni81,


    ok. Was passiert denn, wenn du den Code so umstellst?


    Code
    i2c_master_writeByte(0x93); // Öffnen zum lesen
    int8 value = i2c_master_readByte(); // erstes mal lesen


    Ist nur als Denkansatz gedacht!!


    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"

    Vielleicht trifft man sich in der RPi-Plauderecke.

  • Hallo Zusammen,


    ich habe das ganze mal mit dem Arduino Framework versucht und nach dem dies ging wusste ich zumindest das es nicht an der Hardware liegen kann.


    Nach dem ich den Code nochmals Stück für Stück geschrieben habe gibt es nun eine Funktionsfähige Version welche die Werte von dem Drehregler korrekt ausgibt.


    Problem waren im Endeffekt 2 Dinge. Zum einen das vor dem Lesen nochmals ein i2c_master_start() ausgeführt werden muss und zum anderen das beim Lesen nur die Basis Adresse des Moduls angegeben werden darf (also die 0x48 mit einem LSB Bit 1 zum lesen).


    Anbei noch der Code der Funktion, vielleicht bringt es ja irgendwann jemand weiter. ;)

    An dieser Stelle ein schönes Danke schön für eure Hilfe!


    Gruss Günni


  • Moin guenni81,


    danke für die Rückmeldung.


    Schön das es nun geht. Manchmal ist es nicht einfach sich in das gewünschte Protokol rein zudenken...


    Wenn dein Thema damit erledigt ist, bitte, selbiges als erledigt markieren. Das geht oben bei "Thema bearbeiten".


    Danke!


    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"

    Vielleicht trifft man sich in der RPi-Plauderecke.