- 3D-Druck Einstieg und Tipps         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: BMP180 --> Druck oder I2C Problem ?

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

    LiFePo4 Akku selber bauen - Video
    Ich rufe aktuell die Temperatur und den Druck so ab :

    bmp180_get_druck(cal,&press,0,&temp,&temp_temp,&pr ess_tmp);
    Folgende Variablen liefern mir folgende Werte :

    cal = habe ich mir noch nicht angeschaut. (Sollte ich dies besser tun?)
    &press = -30418 (Vorzeichen MINUS)
    &temp = 224 (Dieser Wert passt. Ca. 22,4 °C)
    &temp_temp = 29232 (Rohdaten Temperatur)
    &press_tmp = -22634 ( Rohdaten Druck, Vozeichen MINUS)
    Mehr rufe ich aktuell nicht auf.


    ***UPDATE***

    Die Kalibrationswerte scheinen zu stimmen.

    - - - Aktualisiert - - -

    Es scheint irgendwas mit den Zeigern zu sein.

    Führe ich die Routine so aus :

    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;

    /* Musterwerte laut Datenblatt */
    oss = 0;
    AC1 = 408;
    AC2 = -72;
    AC3 = -14383;
    AC4 = 32741;
    AC5 = 32757;
    AC6 = 23153;
    B1 = 6190;
    B2 = 4;
    MB = -32768;
    MC = -8711;
    MD = 2868;

    UP = 23843;
    B5 = 2399;

    #define SCROLL_CAL_VALUE 20

    char Buffer[20];

    // strcpy(Buffer, "AC1 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC1);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "AC2 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC2);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "AC3 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC3);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "AC4 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC4);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "AC5 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC5);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "AC6 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC6);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "MB : ");
    // sprintf(Buffer+strlen(Buffer), "%i", MB);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "MC : ");
    // sprintf(Buffer+strlen(Buffer), "%i", MC);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "MD : ");
    // sprintf(Buffer+strlen(Buffer), "%i", MD);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "B1 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", B1);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "B2 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", B2);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);

    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 / 8192;
    X2 = (B1 * (B6 * B6 >> 12)) >> 16;
    X3 = ((X1 + X2) + 2) >> 2;
    B4 = AC4 * (unsigned long)(X3 + 3276 >> 15;
    B7 = ((unsigned long)UP - B3) * (50000 >> oss);

    if (B7 < 0x80000000)
    p = (B7 * 2) / B4;
    else
    p = (B7 / B4) * 2;


    X1 = (p >> * (p >> ;
    X1 = (X1 * 303 >> 16;
    X2 = (-7357 * p) >> 16;
    long temp_1;

    temp_1 = p + ((X1 + X2 + 3791) >> 4);

    strcpy(Buffer, "Druck : ");
    sprintf(Buffer+strlen(Buffer), "%ld", temp_1);
    scroll_display(Buffer,SCROLL_CAL_VALUE);


    return ret;
    }

    Bekomme ich den Wert laut Musterrechnung (Datenblatt)
    Deklariere ich jedoch keine Variable

    long temp_1;
    und werte den Druck so aus :

    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;

    /* Musterwerte laut Datenblatt */
    oss = 0;
    AC1 = 408;
    AC2 = -72;
    AC3 = -14383;
    AC4 = 32741;
    AC5 = 32757;
    AC6 = 23153;
    B1 = 6190;
    B2 = 4;
    MB = -32768;
    MC = -8711;
    MD = 2868;

    UP = 23843;
    B5 = 2399;

    #define SCROLL_CAL_VALUE 20

    char Buffer[20];

    // strcpy(Buffer, "AC1 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC1);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "AC2 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC2);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "AC3 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC3);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "AC4 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC4);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "AC5 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC5);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "AC6 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", AC6);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "MB : ");
    // sprintf(Buffer+strlen(Buffer), "%i", MB);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "MC : ");
    // sprintf(Buffer+strlen(Buffer), "%i", MC);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "MD : ");
    // sprintf(Buffer+strlen(Buffer), "%i", MD);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "B1 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", B1);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);
    //
    // strcpy(Buffer, "B2 : ");
    // sprintf(Buffer+strlen(Buffer), "%i", B2);
    // scroll_display(Buffer,SCROLL_CAL_VALUE);

    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 / 8192;
    X2 = (B1 * (B6 * B6 >> 12)) >> 16;
    X3 = ((X1 + X2) + 2) >> 2;
    B4 = AC4 * (unsigned long)(X3 + 3276 >> 15;
    B7 = ((unsigned long)UP - B3) * (50000 >> oss);

    if (B7 < 0x80000000)
    p = (B7 * 2) / B4;
    else
    p = (B7 / B4) * 2;


    X1 = (p >> * (p >> ;
    X1 = (X1 * 303 >> 16;
    X2 = (-7357 * p) >> 16;
    long temp_1;

    *druck = p + ((X1 + X2 + 3791) >> 4);

    strcpy(Buffer, "Druck : ");
    sprintf(Buffer+strlen(Buffer), "%ld", *druck);
    scroll_display(Buffer,SCROLL_CAL_VALUE);


    return ret;
    }
    Kommt irgendein anderer Wert raus...

    Scheint als würde mit den Zeigern irgendwas nicht richtig laufen?
    Geändert von Janiiix3 (20.05.2015 um 11:18 Uhr)
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  2. #22
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Mal rein interessehalber, was kommt denn bei

    p = p + ((X1 + X2 + 3791) >> 4);
    *druck = p;

    strcpy(Buffer, "Druck : ");
    sprintf(Buffer+strlen(Buffer), "%ld", *druck);
    scroll_display(Buffer,SCROLL_CAL_VALUE);

    bzw

    *druck = p + ((X1 + X2 + 3791) >> 4);
    p = *druck;

    strcpy(Buffer, "Druck : ");
    sprintf(Buffer+strlen(Buffer), "%ld", p);
    scroll_display(Buffer,SCROLL_CAL_VALUE);

    heraus?

    雅思特史特芬
    开发及研究

  3. #23
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    33
    Beiträge
    48
    Ich habe es hin bekommen.

    Mit "sprintf" klappt es. Wieso aber nicht mit itoa?

    sprintf(pressure+strlen(pressure), "%ld", press_result);
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  4. #24
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    lag also nur an deiner Ausgabe?

    雅思特史特芬
    开发及研究

  5. #25
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Janiiix3 Beitrag anzeigen
    Ich habe es hin bekommen.

    Mit "sprintf" klappt es. Wieso aber nicht mit itoa?
    Möglicherweise, weil:

    sprintf(Buffer, "Druck: %ld", p);

    ein long anzeigt, itoa() aber, wie der Name "integer to ascii" andeudet, ein int erwartet?

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  6. #26
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    33
    Beiträge
    48
    @sast

    nicht gut, habe auch gesehen das du beim auslesen der bytes "i2c_rep_start" nutzt. Das habe ich nicht getan. Vermutlich lag dort auch ein schwerwiegender Fehler.

    @Klebwax

    Ein "long" ist doch mehr oder weniger auch ein "Integer" halt nur etwas größer.
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  7. #27
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Ein "long" ist doch mehr oder weniger auch ein "Integer" halt nur etwas größer.
    Das hast du hoffentlich nur spaßig gemeint.

    Oder schaffst du es einen vollen 10 Liter Eimer komplett in eine 1/4 Liter Kaffetasse zu füllen, ohne das dabei etwas verloren geht.
    Wenn du einen long Wert von 40000 hast und in eine int16 Variable schreibst, dann wird das Ergebnis vermutlich ein negativer int Wert sein. Sieh dir mal die Ranges der Datentypen an.

    Und noch was. Da du nie von itoa geschrieben hattest bzw das auch nicht so in der main stand, die du hier reingestellt hattest, hätte ich mich noch dumm und dämlich raten können, wo der Fehler liegt.
    Es ist wichtig, auch wenn es dir vielleicht nichtig erscheint, möglichst alle Eigenkreationen im Code mit zu zeigen.

    雅思特史特芬
    开发及研究

  8. #28
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    33
    Beiträge
    48
    @sast


    es hatte ja bei einigen Sensoren geklappt, daraum habe ich auch nicht an der Umwandlaung gezweifelt.
    Beim nächsten mal, werde ich dies so tun.
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

Seite 3 von 3 ErsteErste 123

Ä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
  •  

Solar Speicher und Akkus Tests