-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: BMP180 --> Druck oder I2C Problem ?

  1. #1
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    26
    Beiträge
    48

    BMP180 --> Druck oder I2C Problem ?

    Anzeige

    Hallo liebe Gemeinde,

    leider musste ich festellen, dass einige Sensoren nicht korrekt ausgelesen werden. 10 Stk. an der Zahl habe ich hier rum fliegen. Alle neu bestellt also vermutlich keine Lagerprobleme.

    Was richtig auffällig ist, ist das der Luftdruck arg hoch ist (ca. 1504 hPa)... Bei einigen Sensoren ( 4 Stk.) bekomme ich die richtige Temperatur und den richtigen Luftdruck.

    Kann es sein, dass es ein Problem meiner Routine ist ??? Ich bin wirklich sprachlos...

    Würde mich sehr freuen, wenn sich jemand mal meine Routine anschauen könnte. Berechnung sollte stimmen, da ja einige Sensoren funktionieren und die "Muster Rechnung" laut Datenblatt passt auch. Also der Algorithmus stimmt.


    Vielen Dank schonmal
    Angehängte Dateien Angehängte Dateien
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    Nach meinen Erfahrungen liegt es an den Berechnungen.
    Hab mir deine BMP180.c nur kurz angesehen und mir ist ein *0.01 aufgefallen. Mit solchen Werten bin ich immer sehr vorsichtig. Habe noch dunkle Erinnerungen vom Studium, das bei irgend so einem Wert die Maschine Berechnungsfehler erzeugen kann.
    Hier mal meine Berechnung nach DB
    Code:
    char bmp180_get_cal_param(bmp180_calc_t *cal)
    {
        char ret = 1;
        ret &= bmp180_readInt(0xAA, &(cal->AC1));
        ret &= bmp180_readInt(0xAC, &(cal->AC2));
        ret &= bmp180_readInt(0xAE, &(cal->AC3));
        ret &= bmp180_readUInt(0xB0, &(cal->AC4));
        ret &= bmp180_readUInt(0xB2, &(cal->AC5));
        ret &= bmp180_readUInt(0xB4, &(cal->AC6));
        ret &= bmp180_readInt(0xB6, &(cal->B1));
        ret &= bmp180_readInt(0xB8, &(cal->B2));
        ret &= bmp180_readInt(0xBA, &(cal->MB));
        ret &= bmp180_readInt(0xBC, &(cal->MC));
        ret &= bmp180_readInt(0xBE, &(cal->MD));
        return ret;
    }
    
    char bmp180_online(char *id)
    {
        return bmp180_readByte(0xD0, id);
    }
    
    char bmp180_get_temp(bmp180_calc_t cal, long *temperatur)
    {
        char ret = 1;
        int t;
        long UT, X1, X2, B5, T;
        long AC5, AC6, MC, MD;
        AC5 = cal.AC5;
        AC6 = cal.AC6;
        MC = cal.MC;
        MD = cal.MD;
        ret &= bmp180_start_temp(&t);
        UT = (unsigned int)t;
        X1 = (((UT - AC6) * AC5)>>15);
        X2 = (MC<<11) / (X1 + MD);
        B5 = X1 + X2;
        T = ((B5 + 8L)>>4);
        *temperatur = T;
        return ret;
    }
    
    char bmp180_get_druck(bmp180_calc_t cal, long *druck, unsigned char oss, long *temperatur, int *temp, long *press)
    {
        char ret = 1;
        long p;
        int t;
        long UT, X1, X2, X3, B3, B5, B6, T;
        long AC1, AC2, AC3, AC4, AC5, AC6, MB, MC, MD, B1, B2;
        unsigned long B4, B7, UP;
        AC1 = cal.AC1;
        AC2 = cal.AC2;
        AC3 = cal.AC3;
        AC4 = cal.AC4;
        AC5 = cal.AC5;
        AC6 = cal.AC6;
        MB = cal.MB;
        MC = cal.MC;
        MD = cal.MD;
        B1 = cal.B1;
        B2 = cal.B2;
        ret &= bmp180_start_temp(&t);
        UT = (long)t;
        *temp = t;
        ret &= bmp180_start_druck(&p, oss);
        UP = (long)p;
        *press = p;
        X1 = (((UT - AC6) * AC5)>>15);
        X2 = (MC<<11) / (X1 + MD);
        B5 = X1 + X2;
        T = ((B5 + 8L)>>4);
        *temperatur = T;
        B6 = B5 - 4000;
        X1 = (B2 * ((B6 * B6) >> 12)) >> 11;
        X2 = (AC2 * B6) >> 11;
        X3 = X1 + X2;
        B3 = (((AC1 * 4 + X3) << oss) + 2) >> 2;
        X1 = (AC3 * B6) >> 13;
        X2 = (B1 * ((B6 * B6) >> 12)) >> 16;
        X3 = ((X1 + X2) + 2) >> 2;
        B4 = (AC4 * (unsigned long)(X3 + 32768)) >> 15;
        B7 = ((unsigned long)(UP - B3)) * (50000 >> oss);
        if (B7 < 0x80000000)
            p = (B7 * 2) / B4;
        else
            p = (B7 / B4) * 2;
        X1 = (p >> 8) * (p >> 8);
        X1 = (X1 * 3038) >> 16;
        X2 = (-7357 * p) >> 16;
        *druck= p + ((X1 + X2 + 3791) >> 4);
        return ret;
    }
    
    char bmp180_start_messung(char address, char command, char statusbit)
    {
        char status = command;
        unsigned int timeout = 65535;
        if (bmp180_writeByte(address, command))
        {
            while((status & statusbit) && (timeout-- > 0)) 
            {
                if (!bmp180_readByte(address, &status)) return 0;
            }
            return 1;
        }
        return 0;    
    }
    
    char bmp180_start_temp(int *value)
    {
        int hi;
        if (bmp180_start_messung(0xF4, 0x2E, 0x00 | (1<<BMP180_SCO)))
        {
            bmp180_readInt(0xF6, &hi);
            *value = (int)hi;
            return 1;
        }
        return 0;
    }
    
    char bmp180_start_druck(long *value, unsigned char oss)
    {
        char hi, lo;
        char xlsb;
        if (bmp180_start_messung(0xF4, 0x34 + (oss<<6), 0x00 | (1<<BMP180_SCO)))
        {
            bmp180_readByte(0xF6, &hi);
            bmp180_readByte(0xF7, &lo);
            bmp180_readByte(0xF8, &xlsb);
            *value = (long)((((long)hi)<<16) | (((long)lo)<<8) | ((long)xlsb)) >> (8-oss);
            return 1;
        }
        return 0;
    }
    Habe da bisher noch keinen Fehler festgestellt.

    雅思特史特芬
    开发及研究

  3. #3
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    26
    Beiträge
    48
    Hallo sast,

    nur wieso klappt es dann mit den Musterwerten aus dem Dateblatt und mit einigen Sensoren ? Ist schon komisch...
    Würdest du mir deine Library zur Verfügung stellen?

    & was vill. noch wichtig ist, deine I2C Routine. Ist die Hardware basierend oder auf reiner Software ?
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    Das I2C Zeug ist von hier
    Code:
    #ifndef _I2CMASTER_H
    #define _I2CMASTER_H   1
    /************************************************************************* 
    * Title:    C include file for the I2C master interface 
    *           (i2cmaster.S or twimaster.c)
    * Author:   Peter Fleury <pfleury@gmx.ch>  http://jump.to/fleury
    * File:     $Id: i2cmaster.h,v 1.10 2005/03/06 22:39:57 Peter Exp $
    * Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
    * Target:   any AVR device
    * Usage:    see Doxygen manual
    **************************************************************************/
    Lesen und schreiben sieht so aus:
    Code:
    char bmp180_readByte(char address, char *value)
    {
        unsigned char data[1];
    
        data[0] = address;
        if (bmp180_readBytes(data,1))
        {
            *value = data[0];
            return 1;
        }
        value = 0;
        return 0;
    }
    
    char bmp180_readUByte(char address, unsigned char *value)
    {
        unsigned char data[1];
    
        data[0] = address;
        if (bmp180_readBytes(data,1))
        {
            *value = data[0];
            return 1;
        }
        value = 0;
        return 0;
    }
    
    char bmp180_readInt(char address, int *value)
    {
        unsigned char data[2];
    
        data[0] = address;
        if (bmp180_readBytes(data,2))
        {
            *value = (((int)data[0]<<8)|(int)data[1]);
            return 1;
        }
        value = 0;
        return 0;
    }
    
    char bmp180_readUInt(char address, unsigned int *value)
    {
        unsigned char data[2];
    
        data[0] = address;
        if (bmp180_readBytes(data,2))
        {
            *value = (((unsigned int)data[0]<<8)|(unsigned int)data[1]);
            return 0;
        }
        value = 0;
        return 1;
    }
    
    char bmp180_writeByte(char address, char value)
    {
        unsigned char data[2];
    
        data[0] = address;
        data[1] = value;
        if (bmp180_writeBytes(data,1))
        {
            return 1;
        }
        value = 0;
        return 0;
    }
    
    char bmp180_readBytes(unsigned char *values, char length)
    {
        unsigned char ret, res = 0, zc = 0;
        unsigned char addr = values[0];
                    
        while(zc < length)
        {
            ret = i2c_start(BMP180+I2C_WRITE);        // ret=0 -> Ok, ret=1 -> no ACK
            if (!ret)
            {
                ret = i2c_write(addr + zc);                       // write Instruction Byte
                res = res + ret;
                i2c_stop();                                // set stop conditon = release bus
            } 
            res = res + ret;
            ret = i2c_rep_start(BMP180+I2C_READ);        // ret=0 -> Ok, ret=1 -> no ACK
            if (!ret)
            {
                values[zc] = i2c_readNak();                    // read one byte
                res = res + ret;
                i2c_stop();                                // set stop conditon = release bus
            }
            res = res + ret;
            if(res) return 0;
            zc++;
        }
        return 1;
    }
    
    char bmp180_writeBytes(unsigned char *values, char length)
    {
        unsigned char ret, res = 0, zc = 0;
        unsigned char addr = values[0];
    
        while(zc < length)
        {
            ret = i2c_start(BMP180+I2C_WRITE);        // ret=0 -> Ok, ret=1 -> no ACK
            if (!ret)
            {
                ret = i2c_write(addr + zc);                       // write Instruction Byte
                res = res + ret;
                ret = i2c_write(values[zc + 1]);                       // Date Byte
                res = res + ret;
                i2c_stop();                                // set stop conditon = release bus
            }
            res = res + ret;
            if(res) return 0;
            zc++;
        }
        return 1;
    }
    Ich hab auch nur 3 Stück in Benutzung. Wenn damit die selben Fehler auftreten, dann liegts an den Sensoren oder irgend etwas anderem. Ist auch schon wieder eine Weile her. Ich sammle zwar die Werte noch, aber werte die zZ nicht aus.

    Die cal Werte je Sensor muss man auch nur einmal auslesen. Laut Hersteller ändern die sich ja lebenslang nicht mehr. Wichtig ist nur, dass du auch die richtigen cal Werte zur Berechnung des jeweiligen Sensors verwendest. Die unterscheiden sich ja doch etwas. Aber das hast du sicher beachtet.

    雅思特史特芬
    开发及研究

  5. #5
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    26
    Beiträge
    48
    Danke!

    Und die ganzen Strukturen? Hast du keine BMP180.c ?

    - - - Aktualisiert - - -

    Die cal Werte je Sensor muss man auch nur einmal auslesen. Laut Hersteller ändern die sich ja lebenslang nicht mehr. Wichtig ist nur, dass du auch die richtigen cal Werte zur Berechnung des jeweiligen Sensors verwendest. Die unterscheiden sich ja doch etwas. Aber das hast du sicher beachtet.


    Die Kalibrationswerte habe ich von jedem Sensor einzeln ausgelesen und mit den entsprechenden Sensoren verrechnen lassen. Das sollte wohl gestimmt haben.
    Ich würde jetzt gerne mal deine Routine ausprobieren, ob die Sensoren wirklich einen weg haben. Sonst laufe ich die ganze Zeit auf dem selben Weg hin und her... Ohne Erfolg!
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    Code:
    #define BMP180                0xEE
    #define BMP180_SCO            5
    
    typedef struct bmp180_calc
    {
        int AC1;
        int AC2;
        int AC3;
        unsigned int AC4;
        unsigned int AC5;
        unsigned int AC6;
        int B1;
        int B2;
        int MB;
        int MC;
        int MD;
    } bmp180_calc_t;
    
    
    extern char bmp180_get_cal_param(bmp180_calc_t *cal);
    extern char bmp180_readBytes(unsigned char *values, char length);
    extern char bmp180_readInt(char address, int *value);
    extern char bmp180_readUInt(char address, unsigned int *value);
    extern char bmp180_readByte(char address, char *value);
    extern char bmp180_readUByte(char address, unsigned char *value);
    extern char bmp180_writeBytes(unsigned char *values, char length);
    
    extern char bmp180_writeByte(char address, char value);
    extern char bmp180_start_temp(int *value);
    extern char bmp180_start_druck(long *value, unsigned char oss);
    extern char bmp180_get_temp(bmp180_calc_t cal, long *temperatur);
    extern char bmp180_get_druck(bmp180_calc_t cal, long *druck, unsigned char oss, long *temperatur, int *temp, long *press);
    extern char bmp180_online(char *id);
    Den Rest schaffst du jetzt allein.

    雅思特史特芬
    开发及研究

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo,

    Stimmt die Übertragungsgeschwindigkeit des II2-Buses?

    In BMP180.c werden 8MHz als Systemtakt angenommen.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  8. #8
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    26
    Beiträge
    48
    Zitat Zitat von Peter(TOO) Beitrag anzeigen
    Hallo,

    Stimmt die Übertragungsgeschwindigkeit des II2-Buses?

    In BMP180.c werden 8MHz als Systemtakt angenommen.

    MfG Peter(TOO)

    Hallo Peter,

    ich habe ja noch eine RTC mit an dem I²C Bus dass funktioniert klasse.

    - - - Aktualisiert - - -

    Zitat Zitat von sast Beitrag anzeigen
    Code:
    #define BMP180                0xEE
    #define BMP180_SCO            5
    
    typedef struct bmp180_calc
    {
        int AC1;
        int AC2;
        int AC3;
        unsigned int AC4;
        unsigned int AC5;
        unsigned int AC6;
        int B1;
        int B2;
        int MB;
        int MC;
        int MD;
    } bmp180_calc_t;
    
    
    extern char bmp180_get_cal_param(bmp180_calc_t *cal);
    extern char bmp180_readBytes(unsigned char *values, char length);
    extern char bmp180_readInt(char address, int *value);
    extern char bmp180_readUInt(char address, unsigned int *value);
    extern char bmp180_readByte(char address, char *value);
    extern char bmp180_readUByte(char address, unsigned char *value);
    extern char bmp180_writeBytes(unsigned char *values, char length);
    
    extern char bmp180_writeByte(char address, char value);
    extern char bmp180_start_temp(int *value);
    extern char bmp180_start_druck(long *value, unsigned char oss);
    extern char bmp180_get_temp(bmp180_calc_t cal, long *temperatur);
    extern char bmp180_get_druck(bmp180_calc_t cal, long *druck, unsigned char oss, long *temperatur, int *temp, long *press);
    extern char bmp180_online(char *id);
    Den Rest schaffst du jetzt allein.

    Um jetzt ein Ergebniss zu bekommen...

    Welche Funktionen muss ich nacheinander aufrufen?
    Bei deinen Funktionen gibt es "start_messung" | "start_temperatur"...

    Was muss ich aufrufen um den Druck zu erhalten? (Sorry für die vielen Fragen!)
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  9. #9
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    Was muss ich aufrufen um den Druck zu erhalten? (Sorry für die vielen Fragen!)
    Wie würdest du das denn auf englisch formulieren? Steht doch bereits in meinem ersten Post.
    Du darfst auch gern in der Funktion den Quelltext lesen. Die Berechnung ist ans DB angelehnt und sollte für einen Eingelesenen verständlich sein.

    雅思特史特芬
    开发及研究

  10. #10
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    26
    Beiträge
    48
    Ich fange gerade erst mit "C" richtig an.

    char bmp180_get_cal_param(bmp180_calc_t *cal)
    Was muss ich denn für einen Parameter in der Funktion eingeben? Ich habe bisher nichts so wirklich mit "Pointern" gemacht.
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Antworten: 15
    Letzter Beitrag: 10.02.2012, 07:54
  2. I2C oder UART?
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 29.07.2011, 21:05
  3. Problem mit I2C Sensor DRMOD-I2C-RVI
    Von muerzi im Forum Sensoren / Sensorik
    Antworten: 23
    Letzter Beitrag: 22.02.2010, 19:29
  4. Problem: Zwei MEGA8 via I2C-Bus koppeln (mit I2C-slave-Lib)
    Von Ulfens im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 11.01.2006, 16:25
  5. I2C RN-Motor Doku oder Software Problem ?
    Von fwallenwein im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 01.11.2004, 20:21

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •