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.
Druckbare Version
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.
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 ?
Zitat:
#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);
Hallo,
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)
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.
achso ;) besten dank
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..
So,
Also die Temperatur bekomme ich jetzt schon mal ordentlich.
Variablen "global"
Zitat:
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)
Zitat:
bmp180_get_temp(cal,&temp);
Der Druck wird mir falsch angezeigt (Modul funktioniert) Wert liegt bei -30915
Zitat:
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).
Auswerten tue ich "&press".Zitat:
/* 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 + 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_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?
Über der main...
Zitat:
bmp180_calc_t cal;
int temp_tmp;
long temp, press;
int temp_temp;
long press_tmp;
Meine Main (zum Teil...)
Also hier erstmal die Rohdaten :Zitat:
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);
Druck :
// Darf der Rohwert MINUS sein?Zitat:
-22634
Temp :
Zitat:
29232
Umgerechnete Werte :
Temp :
Druck :Zitat:
224
Zitat:
-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?
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.