- Labornetzteil AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 28

Thema: BMP180 --> Druck oder I2C Problem ?

  1. #11
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Anzeige

    LiFePo4 Akku selber bauen - Video
    bmp180_calc_t cal;
    char id = 0;

    if(bmp180_online(&id))
    {
    bmp180_get_cal_param(&cal);
    ...
    }

    // &cal liefert die Adresse vom Struct cal

    Man lernt am Besten, wenn man seine Fehler selber macht.

    雅思特史特芬
    开发及研究

  2. #12
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    32
    Beiträge
    48
    Muss erstmal mein ganzes Programm ausbauen.
    Schade das du daraus keine fertige Library gemacht hast. Wenn ich es hin bekommen habe, melde ich mich zurück.

    - - - Aktualisiert - - -

    Ich bekomme es leider noch nicht so wirklich mit der Struktur auf die Kette, wollte aus deinen Routinen jetzt eine Library erstellen und die Variablen in der Header Datei für "extern" bekannt geben.

    Was mache ich verkehrt ?

    #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 bmp180_calc_t cal;

    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);
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von Janiiix3 Beitrag anzeigen
    ich habe ja noch eine RTC mit an dem I²C Bus dass funktioniert klasse.
    Es gibt verschiedene maximale Geschwindigkeiten für den I2C.
    Zudem ist auch das Detail-Timing etwas unterschiedlich.

    Aufschluss geben die Datenblätter!
    Der RTC kann z.B. für eine höhere Bus-Geschwindigkeit ausgelegt sein, als deine Sensoren.

    Ursprünglich wurde der I2C mit 100kBit/s spezifiziert. Dann kamen 400kBit/s, 3,4 MBit/s, 1 MBit/s und als Letztes 5 MBit/s dazu. Wobei dies alles "bis zu" Werte sind, langsamer geht immer!
    Protokolle gibt es auch noch unterschiedliche.

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

  4. #14
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Sobald du die .h einbindest, hast du doch bereits das struct. Das ist die komplette .h nur ohne #ifdef. Da solltest du kein extern mehr benötigen für das struct. Und der Rest war in der .c was du auch nur noch zusammenkopieren musst. Dann includest du noch die .h und die I2C und twi Geschichten und ab geht er. Ich wollte jetzt hier eigentlich kein c Tutorial draus machen.
    In deiner main.c brauchst du natürlich auch das bmp180.h als include.

    雅思特史特芬
    开发及研究

  5. #15
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    32
    Beiträge
    48
    achso besten dank
    Angehängte Dateien Angehängte Dateien
    Geändert von Janiiix3 (19.05.2015 um 16:40 Uhr)
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  6. #16
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Schon mal nicht verkehrt. Jetzt siehst du dir mal die i2cmaster.h an und überlegst, wozu da wohl die erste, zweite und letzte Zeile drin sind und wie du das eindeutig für dich anpassen kannst. Und dann kannst du die bmp180.h auch in die main includieren ohne das es gemeckertes gibt..

    雅思特史特芬
    开发及研究

  7. #17
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    32
    Beiträge
    48
    So,

    Also die Temperatur bekomme ich jetzt schon mal ordentlich.

    Variablen "global"

    bmp180_calc_t cal;
    int temp_tmp;
    long temp, press;

    int temp_temp;
    long press_tmp;


    Temperatur lese ich nun so aus (Funktioniert auch... 187 im moment)
    bmp180_get_temp(cal,&temp);

    Der Druck wird mir falsch angezeigt (Modul funktioniert) Wert liegt bei -30915

    bmp180_get_druck(cal,&press,0,&temp,&temp_temp,&pr ess_tmp);

    Binde ich die Musterwerte in die Routine ein, so komme ich auch nicht auf das Ergebniss laut Datenblatt (699).

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

    UP = 23843;
    B5 = 2399;

    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 + 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;
    *druck= p + ((X1 + X2 + 3791) >> 4);
    return ret;
    Auswerten tue ich "&press".
    Geändert von Janiiix3 (20.05.2015 um 06:40 Uhr)
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  8. #18
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    char bmp180_get_druck(bmp180_calc_t cal, long *druck, unsigned char oss, long *temperatur, int *temp, long *press)

    temp und press sind die Rohdaten aus dem Auslesen der Sensoren.

    druck und temperatur sollten dann die berechneten Werte liefern.

    Kannst du mal deine main zeigen? Was hat den short für eine Größe? Ist das ein 16bit Integer? Die Temperatur von get_temp und get_druck sollte auf jeden Fall in beiden Fällen gleich sein. Was sind UP und B5 für Datentypen?

    Schreibe mal genauer, was wann bei welchem Versuch rauskommt. Wann hast du mit Beispieldaten gerechnet und was kam dabei raus und wann hast du echt gemessen und was kam da bei druck und temperatur raus?

    雅思特史特芬
    开发及研究

  9. #19
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    32
    Beiträge
    48
    Über der main...

    bmp180_calc_t cal;
    int temp_tmp;
    long temp, press;

    int temp_temp;
    long press_tmp;


    Meine Main (zum Teil...)

    int main(void)
    {
    /* set DataDirectionRegister(s) as Output */
    DDRD |= ((1<<PD1) | (1<<PD4) | (1<<PD5) | (1<<PD6) | (1<<PD7));
    DDRC |= (1<<PC0);
    DDRB |= ((1<<PB3) | (1<<PB4));

    /* set PullUp´s */
    PORTC |= ((1<<PC2) | (1<<PC3) | (1<<PC4) | (1<<PC5) | (1<<PC6));
    PORTB |= (1<<PB2);
    PORTD |= ((1<<PD5));

    /* init the Graphic Chip */
    ht1632c_init(0xAF);

    /* init the I2C unit */
    i2c_init();

    /* init the pressure sensor */
    // BMP180_init();

    bmp180_get_cal_param(&cal);
    Also hier erstmal die Rohdaten :

    Druck :
    -22634
    // Darf der Rohwert MINUS sein?

    Temp :
    29232

    Umgerechnete Werte :

    Temp :
    224
    Druck :
    -30418

    Die Datentypen sind genau die, die du auch gepostet hast. Ich habe lediglich bei den Musterwerten "gecastet"... Auch ohne "cast" kommt das gleiche raus.
    Kann es sein, dass die Kalibrationswerte falsch verrechnet werden?
    Geändert von Janiiix3 (20.05.2015 um 08:17 Uhr)
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  10. #20
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    ich sehe immer noch keinen Aufruf der Funktionen. Welche Variable liefert welchen Wert? Komplette Deklaration der Variablen.
    Wenn du immer nur Stückchen hinwirfst wirds schwer den Fehler einzugrenzen. Ich kanns nicht verifizieren, da ich aktuell nur bmp180_start_temp(&temp); und bmp180_start_druck(&press, oss); verwende.

    雅思特史特芬
    开发及研究

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. Antworten: 15
    Letzter Beitrag: 10.02.2012, 06:54
  2. I2C oder UART?
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 29.07.2011, 20:05
  3. Problem mit I2C Sensor DRMOD-I2C-RVI
    Von muerzi im Forum Sensoren / Sensorik
    Antworten: 23
    Letzter Beitrag: 22.02.2010, 18: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, 15: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, 19:21

Stichworte

Berechtigungen

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

Labornetzteil AliExpress