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

    Ich war schon lange nicht mehr da, aber jetzt !

    Ich habe einen eigenartigen Effekt beim Auslesen mit I2C in C eines ADS1115 .

    Mit IOCTL gehts ganz wunderbar und die gemessene Spannung stimmt auch.

    Mit WiringPi stimmt die Spannung nicht und ist recht unkonstant (siehe Raspi.png)

    Irgentwie hab ich ein Brett vorm Kopf und komm nicht dahinter, vielleicht hat jemand eine Idee.

    Raspi ist ein PI3 mit StretchLight.

    Vielen Dank

  • Moin PretzRudi,

    du bist dir sicher das deine "int" 16Bit groß sind? Warum nimmst du nicht 'uint8_t' oder 'uint16_t'?

    Code
    ix=wiringPiI2CWriteReg16 (handle,01,0x85c3);

    Du machst mit "ix" nichts. Kann man da auch weg lassen.

    Ich beschreibe mal mit Worten die Funktion "readads"

    In wipiADC.c:

    - Adresse in den Baustein schreiben

    - Warten bis ein bestimmtes Bit gesetzt ist

    - Wenn ja, dann holst du 2 Bytes

    Ende

    In ioctlADC.c:

    - Adresse in den Baustein schreiben

    - Warten bis ein bestimmtes Bit gesetzt ist

    - Dann schreibst du '0' in das Register des Bausteins

    - 2 Bytes auslesen

    Ende

    Das rot markierte wird bei wpiADC.c nicht gemacht. Es sei das das in dem Aufruf wiringPiI2CReadReg16 erledigt wird.

    Dann rufst du in main() val=readads(); auf und gehst dann in die while-Schleife. Das machst du bei ioctl nicht.

    73 de 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.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

    Einmal editiert, zuletzt von Bernd666 (15. Januar 2020 um 14:13)

  • Hallo Bernd666,

    Das rot markierte wird bei wpiADC.c nicht gemacht. Es sei das das in dem Aufruf wiringPiI2CReadReg16 erledigt wird.

    ix=wiringPiI2CReadReg16(handle,00)

    Dann rufst du in main() val=readads(); auf und gehst dann in die while-Schleife. Das machst du bei ioctl nicht

    Weil ich dachte daß das erste Lesen bei WiringPi vielleicht noch nicht OK ist, es ändert aber nichts.

    Du machst mit "ix" nichts. Kann man da auch weg lassen.

    Weiß ich, gefällt mir aber besser .

    du bist dir sicher das deine "int" 16Bit groß sind? Warum nimmst du nicht 'uint8_t' oder 'uint16_t'?

    Nein int ist 32 Bit spielt aber keine Rolle hab's auch mit uint16_t versucht, ändert klarer weise nichts.

    Ich glaube inzwischen, daß WiringPi beim ADS1115 ein Timing Problem hat.

    Beim MP9801 der ähnlich anzusprechen ist, sind die Ergebnisse von IOCTL und WiringPi exakt ident.

    Liebe Grüsse

    :danke_ATDE:

  • Moin PretzRudi,

    die Bytes beim WiringPi gehören geswapt !

    Und wie sieht das im Code aus?

    Ansonsten, wenn dein Thema erledigt ist, bitte, als erledigt markieren.

    Das geht oben bei "Thema bearbeiten".

    Danke!

    73 de 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.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Beim WiringPiI2CWrite16 gehören vorher Low-und Highbyte vertauscht !

    Hallo Rudi,
    Ich möchte auch eine Spannung mit einem ADS1115 messen und habe das gleiche Problem, wie du.
    Müssen beim Schreiben UND beim Lesen Low- und Highbyte vertauscht werden oder gibt es noch andere Probleme?

    Weißt du zufällig warum man die Bytes überhaupt vertauschen muss?

Jetzt mitmachen!

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