achsobesten dank
achsobesten dank
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 )
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"
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).
Auswerten tue ich "&press"./* 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;
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 )
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...
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 :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?-22634
Temp :
29232
Umgerechnete Werte :
Temp :
Druck :224
-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 )
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.
雅思特史特芬
开发及研究
Ich rufe aktuell die Temperatur und den Druck so ab :
Folgende Variablen liefern mir folgende Werte :bmp180_get_druck(cal,&press,0,&temp,&temp_temp,&pr ess_tmp);
Mehr rufe ich aktuell nicht auf.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)
***UPDATE***
Die Kalibrationswerte scheinen zu stimmen.
- - - Aktualisiert - - -
Es scheint irgendwas mit den Zeigern zu sein.
Führe ich die Routine so aus :
Deklariere ich jedoch keine Variablechar 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)
und werte den Druck so aus :long temp_1;
Kommt irgendein anderer Wert raus...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;
}
Scheint als würde mit den Zeigern irgendwas nicht richtig laufen?
Geändert von Janiiix3 (20.05.2015 um 10:18 Uhr)
__________________________________________________ _________________
/*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
( <-- Das ist Glubschie, er ist nett )
Lesezeichen