4 byte aus Sensor auslesen mit WiringPi I2C

  • Hallo,

    Ich nutze den RPI um von einem Sensor 4 bytes auszulesen. Leider bis jetzt ohne Erfolg. Ich Empfange von dem Sensor Daten bytes die aber leider nicht zuzuordnen sind.

    Es handelt ich dabei um einen Differenzdrucksensor der Fa. Microelectronics. zum Datenblatt geht es hiermit:
    http://www.analogmicro.de/_pages/sens/am…_data_sheet.pdf

    Auf Seite 8 ist beschrieben wie die Datenübertragung abzuwickeln ist. Mir ist jedoch nicht klar wie ich das mit den WiringPi Funktionen für den i2c bus umsetzen kann. Hat hier Jemand erfahrung damit?

    Ich Habe es auf folgende Art versucht:

    wiringPiSetup ();
    fd = wiringPiI2CSetup (0x28);
    int reg;
    reg=1;
    data = wiringPiI2CReadReg8(fd,reg);

    damit bekomme ich in nicht erkennbarem Ablauf den wert 86 oder 6 zurück. Wenn ich am Sensor einen Druck anbringe ändert sich die Werte auch.

    Mit ist nicht klar wie reg aussehen und welchen datetyp reg haben muss. Nach der Definition der Funktion Reed jedenfalls int.

    Hat jemand eine Idee oder Erfahrung damit?

    Danke

  • es kommen bei I2C immer nur Bytes!

    4 Bytes sehen nach einem long oder int32_t oder uint32_t aus.

    Die Bytes in die richtige Reihenfolge big endian oder little endian zu bringen wäre dann deine Aufgabe.

    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)

  • Moin,
    lese dir bitte mal die Seite 7 des Datenblatts genau durch.

    Dort steht auch das man 4 Bytes bekommt. 2 Bytes Druck und 2 Byte Temperatur.

    Aber les erstmal.

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

  • danke, geht aber an den TO, es ist sein Wunsch, er muss das lesen und verstehen und umsetzen, wir können nur Denkanstösse geben Bytefolge etc.

    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 (11. Oktober 2016 um 09:04)

  • Hallo Jar, hallo Bernd,


    Moin Jar,
    war auch an den Te gerichtet.

    Gruss Bernd

    ich habe mir angewöhnt, die Person, an die sich mein Kommentar wendet, direkt anzusprechen (Hallo ...). Und wenn ich im Verlauf der Antwort noch jemanden mit einem Hinweis versorgen möchte, dann mit @Duda.

    Wenn man Eure Antworten so liest, kann für einen unbedarften Leser der Eindruck entstehen, dass Ihr Euch gegenseitig bzgl. Deutung von Datenblättern und deren programmtechnische Umsetzung gegenseitig belehren möchtet. Und das ist meiner Meinung nach bei keinem von Euch beiden erforderlich ;)

    Hoffen wir mal, dass der TE sich auch mal wieder meldet und signalisiert, dass Eure Hinweise "angekommen" sind...

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (16. Oktober 2017 um 19:36)

  • Hallo Florian_K,


    ...
    data = wiringPiI2CReadReg8(fd,reg);
    ... den wert 86 oder 6 zurück. Wenn ich am Sensor einen Druck anbringe ändert sich die Werte auch.
    ...


    ich denke mal, da wirst Du 4x jeweils ein Byte lesen müssen ... die wiringPiI2CReadReg8()-Funktion also 4x hintereinander aufrufen müssen. Zumindes würde ich das so interpretieren, dass der Master nach jedem Byte ein ACK schickt.
    Wie die empfangenen Daten dann interpretiert werden, steht ja im Datenblatt:

    Zitat


    a total of four data bytes are transmitted from the pressure sensor to the I²C-master. The two bytes for the current digital pressure value are first sent, followed by the two bytes for the current digital temperature value, always beginning with the most significant byte.

    Versuch's einfach mal und lass Dir die vier Byte erstmal nur ausgeben und vergleiche sie dann.

    //EDIT: wiringPi stellt Dir ja nur zwei Funktionen zum Lesen eines bzw. zwei Byte zur Verfügung. Evtl. musst Du da eine andere Library verwenden, wenn das so nicht funktioniert. Die pigpio ( ist in der Regel eh schon installiert ) ermöglicht es, bis zu 32 Byte auf einmal zu lesen ( -> click <- ).
    Möglicherweise ist die das Mittel der Wahl und Du kannst die vier Byte in einem Rutsch holen.


    cu,
    -ds


  • Hallo Jar, hallo Bernd,
    ich habe mir angewöhnt, die Person, an die sich mein Kommentar wendet, direkt anzusprechen

    da ich gleich hinter dem TO geschrieben hatte war das für MICH klar an den TO gerichtet und die Antwort hinter mir musste ich auf mich beziehen.


    Hoffen wir mal, dass der TE sich auch mal wieder meldet und signalisiert, dass Eure Hinweise "angekommen" sind...

    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 (12. Oktober 2016 um 20:28)

  • Hallo und Danke für deinen Beitrag dreamshader. ich konnte meine Aufgabe mit PiGpio umsetzen.

    das Problem mit Wirng Pi war dass immer nur das erste Byte ausgegeben wurde. wenn man die [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]wiringPiI2CReadReg8(fd,reg) Funktion 4 mal hintereinander Aufruft wird die Übertragung jedes Mal neu initialisiert und damit auch immer nur das gleiche Byte ausgelesen.[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Mein code sieht jetzt folgendermaßen aus:[/font]

    #include <math.h>
    #include <stdio.h>
    #include "pigpio.h"


    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]int main (int argc, char * argv[]){[/font]
    int i2c, status; // i2c Handle, pigpio init status
    int i;
    int readOK;
    unsigned i2cReg; // i2c zu lesendes Register
    char buf[4]; // Datenspeicher
    int count; // Anzahl zu lesender Bytes
    int data[4]; // Datenspeicher Binär
    status = gpioInitialise();
    if (status < 0)
    {
    fprintf(stderr, "pigpio initialisation failed.\n");
    return 1;
    }
    i2cReg = 1;
    count = 4;
    i2c = i2cOpen(1,0x28,0);
    readOK = i2cReadI2CBlockData(i2c,i2cReg,buf,count);
    if (readOK >= 0) {
    printf("Lesen erfolgreich\n");
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]}
    gpioTerminate();[/font]return 0;
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]}[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Kompiliert mit: gcc -Wall -pthread -o filename filename.o -lpigpio -lrt -lm[/font]

    Einmal editiert, zuletzt von Florian_K (12. Oktober 2016 um 20:28)

  • Servus,
    das hatte ich schon befürchtet, dass beim byteweise lesen jedesmal ein "Begin Transmission" geschickt wird.
    Aber wenn's mit pigpio geht, ist ja super.
    Jedenfalls danke für die Statusmeldung :thumbs1:

    cu,
    -ds-

Jetzt mitmachen!

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