Forum: Mikrocontroller und Digitale Elektronik BME680 Berechnung Temperatur Luftfeuchtigkeit Druck Gas Fragen Initialisierung Assembler ASM ATmega8


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Geschätztes Forum,

nach einer Messung (Register ctrl_meas, 0x74, Set mode<1:0> to 0b01)

werden folgende Registerinhalte gelesen:


Register CONFIG: 0x1c (Filter)

Register TEMP_xlsb: 0x30, 0xc0, 0x90, 0x20... nach jeder Messung anders

Register TEMP_msb: 0x79 (bei konstanter Temperatur sabil)

Register TEMP_lsb: 0x30 (bei konstanter Temperatur sabil)


Temperaturwert Umgerechnet auf dezimal: 0x7930 => 31024

Momentane Raumtemperatur: ca.23 Grad

31024 hat nicht sehr viel mit 23 Grad zu tun.

Frage : Muss der Tempeaturwert noch umgerechnet werden?
Im Datenblatt Pkt 3.3.1 steht nichts dazu geschrieben.

Noch ein paar Worte zum ASM-Program für den 8Mhz getakteten ATmega8.

Kurz nach Programmstart wird der TWI/i2C Bus nach Sklaven durchsucht
0x3c (OLED) 0x77 (BME680) sollten gefunden werden.

Zusätzlich wird explizit nach dem BME680 und nach seiner ID (0x61) 
gesucht und ein Software-Reset im BME680 durchgeführt.

Wichige Register ausgelesen und der Inhalt im SRAM abgelegt.

Momentan ist der AVR zu 52% belegt.

Auf die TWI/i2C Bus-Widerstände kann ggf. verzichtet werden, Pull-Up 
Widerstände von SCL und SDA sind aktiviert.

Bernhard

: Bearbeitet durch User
von jemonmarienu (Gast)


Lesenswert?

Ich finde mehrzeilige Titel für einen Fred großen Käse

von Bernhard S. (bernhard)


Lesenswert?

> Ich finde mehrzeilige Titel für einen Fred großen Käse

Wer ist Fred?

Danke für den Hinweis, wir sind ein Land mit freier Meinungsäußerung.

Und warum findest Du es Käse? Zehn Punkte in Deiner Begründung würden 
vollkommen genügen.

Du hast Recht, die nächsten Beiträgen werde ich im Betreff nur
noch " Frage " schreiben, damit jeder gleich weiß, um was es geht^^

: Bearbeitet durch User
von jemonmarienu (Gast)


Lesenswert?

Bernhard S. schrieb:
> Temperaturwert Umgerechnet auf dezimal: 0x7930 => 31024

Wie kommst du auf die 0x7930?
Die unteren 4 Bit von temp_xlsb gehören nicht zum Temperaturwert
(DS 5.3.4.2)

von Bernhard S. (bernhard)


Lesenswert?

> Wie kommst du auf die 0x7930?

Ausgelesene Registerinhalte.

TEMP_msb: 0x79 TEMP_lsb: 0x30 ---> 0x7930

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Bernhard S. schrieb:
> Frage : Muss der Tempeaturwert noch umgerechnet werden?
> Im Datenblatt Pkt 3.3.1 steht nichts dazu geschrieben.

Ja, die Kalibrierkoeffizienten muss du vorher auslesen.
Die vom Hersteller im Treiber zum BME680 angegebene Routine für eine 
Integerrechnung sieht wie folgt aus:
1
static int16_t calc_temperature(uint32_t temp_adc, struct bme680_dev *dev)
2
{
3
  int64_t var1;
4
  int64_t var2;
5
  int64_t var3;
6
  int16_t calc_temp;
7
8
  var1 = ((int32_t) temp_adc >> 3) - ((int32_t) dev->calib.par_t1 << 1);
9
  var2 = (var1 * (int32_t) dev->calib.par_t2) >> 11;
10
  var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
11
  var3 = ((var3) * ((int32_t) dev->calib.par_t3 << 4)) >> 14;
12
  dev->calib.t_fine = (int32_t) (var2 + var3);
13
  calc_temp = (int16_t) (((dev->calib.t_fine * 5) + 128) >> 8);
14
15
  return calc_temp;
16
}
https://github.com/BoschSensortec/BME680_driver/blob/master/bme680.c

von M. K. (sylaina)


Lesenswert?

Wie Wolfgang schon schrieb musst man hier die Kalibrierdaten aus dem 
Sensor auslesen und dann den ADC-Wert entsprechend Umrechen. Ich hab mir 
jetzt mal das Datenblatt überflussweise angeschaut und finde es 
interessant, dass anscheinend genau das im Datenblatt nicht erwähnt 
wird. Wahrscheinlich hat man sich hier darauf verlassen, dass der 
unbedarfte User sich andere Sensoren der BME-Serie anschaut. Mir ist der 
BME680 neu, ich vermute aber mal dass das ein erweiterter BME280 ist und 
dort findest du die Information wie man die Kalibrationsdaten ausliest. 
Für den BME280 hab ich mal eine Libraray geschrieben in der du spicken 
könntest, du findest sie unter http://www.github.com/Sylaina/BME280

Vielleicht hilft dir das weiter.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

M. K. schrieb:
> Für den BME280 hab ich mal eine Libraray geschrieben in der du spicken
> könntest, du findest sie unter http://www.github.com/Sylaina/BME280

Gibt es irgend einen guten Grund, nicht den von Bosch auf der Seite zum 
BME680 unter Software / Driver verlinkten Treiber zu benutzen oder 
zumindest anzugucken?
https://www.bosch-sensortec.com/products/environmental-sensors/gas-sensors/bme680/#software

von M. K. (sylaina)


Lesenswert?

Wolfgang schrieb:
> Gibt es irgend einen guten Grund, nicht den von Bosch auf der Seite zum
> BME680 unter Software / Driver verlinkten Treiber zu benutzen oder
> zumindest anzugucken?

Da musst du den Fragen, der den BME680 benutzen will ;)

von Wolfgang (Gast)


Lesenswert?

M. K. schrieb:
> Da musst du den Fragen, der den BME680 benutzen will ;)

Vielleicht stört es sich daran, dass Bosch Sensortec nicht für jeden µC 
eine in Assembler geschriebene Library dazu liefert ;-)

von Bernhard S. (bernhard)


Lesenswert?

Wolfgang schrieb:
> Die vom Hersteller im Treiber zum BME680 angegebene Routine für eine
> Integerrechnung sieht wie folgt aus:

1000 Dank, super, diese Formeln könnten weiterhelfen.

> Vielleicht stört es sich daran, dass Bosch Sensortec nicht für jeden µC
> eine in Assembler geschriebene Library dazu liefert ;-)

Ein einfaches Berechnungsschema würde vollkommen genügen, enfach 
dargestellt, so daß es auch Ingenieure verstehen können, unabhängig von 
diversen Programmiersprachen und Rechenmaschinen.

Atmel schafft das doch auch z.B: ADC= VIN ⋅ 1024 / VREF

Nun muss ich mich leider erstmal mit Hochsprachen beschäftigen...

Fragen

"int64_t var1" wird damit eine 64Bit Variable definiert?

Wie ist diese Zeile zu deuten?

var1 = ((int32_t) temp_adc >> 3) - ((int32_t) dev->calib.par_t1 << 1);

var1 = (temp_adc : 4) - (calib.par_t1 x 2)

temp_adc= Temperatur-Rohdaten (32Bit) ?

calib.par_t1 scheint ein Kalibrierdaten-Bytes zu sein ?



M. K. schrieb:
> Ich hab mir
> jetzt mal das Datenblatt überflussweise angeschaut und finde es
> interessant, dass anscheinend genau das im Datenblatt nicht erwähnt
> wird.

Warum arbeitet Bosch nur so schluderhaft und oberfläch?

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Bernhard S. schrieb:
> "int64_t var1" wird damit eine 64Bit Variable definiert?
Damit wird die Variable "var1" als vorzeichenbehaftete 64Bit 
(Ganzzahl-)Variable definiert.

> Wie ist diese Zeile zu deuten?
> var1 = ((int32_t) temp_adc >> 3) - ((int32_t) dev->calib.par_t1 << 1);
>
> var1 = (temp_adc : 4) - (calib.par_t1 x 2)
> temp_adc= Temperatur-Rohdaten (32Bit) ?
Ja, alles auf 32Bit Ganzzahl aufgebläht

> calib.par_t1 scheint ein Kalibrierdaten-Bytes zu sein ?
neim, vorzeichenlose 16 Bit, steht in
https://github.com/BoschSensortec/BME680_driver/blob/master/bme680_defs.h

von M. K. (sylaina)


Lesenswert?

Bernhard S. schrieb:
> "int64_t var1" wird damit eine 64Bit Variable definiert?

Öhm...durch int64_t !?!

Bernhard S. schrieb:
> var1 = ((int32_t) temp_adc >> 3) - ((int32_t) dev->calib.par_t1 << 1);

Ernsthaft jetzt. Jetzt mal ganz locker: Das sind eigentlich Basics. Das 
sind nur Shift-Operationen und die sind dir im Jahr 2021 nicht geläufig? 
Du schreibst immer noch in Assembler aber kannst so einfachste 
Shift-Operationen nicht?
Hast du dir die Links mal angeschaut?

Bernhard S. schrieb:
> Warum arbeitet Bosch nur so schluderhaft und oberfläch?

Echt jetzt? Dein Ernst? Das ist weder schluderhaft noch oberflächlich. 
Wie Wolfgang es schon oben schrieb und auch verlinkte: Bosch stellt ja 
sogar selbst Treiber zur Verfügung und da steht alles drin, ausführlich 
beschrieben, müsste man halt mal lesen.

von Wolfgang (Gast)


Lesenswert?

Wolfgang schrieb:
>> var1 = (temp_adc : 4) - (calib.par_t1 x 2)
>> temp_adc= Temperatur-Rohdaten (32Bit) ?
> Ja, alles auf 32Bit Ganzzahl aufgebläht

Sorry, falsch.
Richtig muss es heißen (3-mal nach rechts schieben):

var1 = (temp_adc : 8 ) - (calib.par_t1 x 2)

von Steffen H. (avrsteffen)


Lesenswert?

M. K. schrieb:
> Ernsthaft jetzt. Jetzt mal ganz locker: Das sind eigentlich Basics. Das
> sind nur Shift-Operationen und die sind dir im Jahr 2021 nicht geläufig?
> Du schreibst immer noch in Assembler aber kannst so einfachste
> Shift-Operationen nicht?
> Hast du dir die Links mal angeschaut?

Nun werd mal nicht frech!
Wenn man diese Hochsprache nicht gelernt hat, können auch solche Basics 
verunsichern.

Und was hat das mit 2021 zu tun?

Also in ein Datenblatt gehört auch eine Berechnungsgrundlage 
(Mathematische Formel) wenn das Ergebnis daraus resultiert - Punkt. Auch 
2021 ist das nicht anders als 1980! Da kann ich nicht mit Git Hub und 
irgendwelchen Treibern in Hochsprachen kommen.
Das ist zwar hilfreich für einen Programmierer der genau in dieser 
Hochsprache programmiert und führt auch schnell zu einem Ergebnis. Wie 
Arduino.. Ich hoffe nur du musst sowas mal irgendwie zertifizieren. Dann 
hast Spaß..

von Steffen H. (avrsteffen)


Lesenswert?

Wolfgang schrieb:
> calib.par_t1 scheint ein Kalibrierdaten-Bytes zu sein ?

Ja, und zwar Parameter T1

von Bernhard S. (bernhard)


Lesenswert?

Steffen H. schrieb:
> Also in ein Datenblatt gehört auch eine Berechnungsgrundlage
> (Mathematische Formel) wenn das Ergebnis daraus resultiert - Punkt.

Du hast Dich ja beim BME280 schon ganz ordentlich ausgetobt. Respekt!
Beitrag "[ASM] BME280 mit OLed Display mit ATmega808"

Steffen H. schrieb:
>> calib.par_t1 scheint ein Kalibrierdaten-Bytes zu sein ?
> Ja, und zwar Parameter T1

Parameter T1 finde ich im Datenblatt nicht nur S.19:
par_g1 0xED
par_g2 0xEB/0xEC
par_g3 0xEE

Steht "g" nicht für Gas?

Warum sind im Datenblatt nicht alle Register aufgelistet, ich such mir 
den Wolf.

Dieser Therm sieht in C ganz einfach aus:

((int32_t) temp_adc >> 3)

in Assemler für eine 16Bit Zahl:

LSR R17 / :2
ROR R16
LSR R17 / :2
ROR R16
LSR R17 / :2
ROR R16

: Bearbeitet durch User
von Bernhard S. (bernhard)


Lesenswert?

Wie ist dieser Ausdruck zu deuten, par_t1 wird mit 2 multipliziert, ws 
beduetet "dev->" ?

((int32_t) dev->calib.par_t1 << 1)

Thema Bitmanupulation:

https://www.mikrocontroller.net/articles/Bitmanipulation

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Die Kalibrierdaten sind im den Registern 89h.. A1h, E1h F0h, nur die 
sind nicht im Datenblatt erwähnt, was mache ich falsch?

https://github.com/BoschSensortec/BME680_driver/blob/master/bme680.c

89h  to A1h for calibration data 1 to 24
E1h to F0h for calibration data 25 to 40

von Wolfgang (Gast)


Lesenswert?

Bernhard S. schrieb:
> ws beduetet "dev->" ?
>
> ((int32_t) dev->calib.par_t1 << 1)

Im Programm wird für jeden BME680-Sensor eine Datenstruktur vom Typ 
bme680_dev angelegt und diese Instanz heißt hier "dev". Darin gibt es 
eine Struktur namens "calib" vom Typ bme680_calib_data. Und in dieser 
Struktur gibt es par_t1 vom Typ uint16_t (16 Bit unsigned Integrer).
Diese Typen sind alle in bme680_defs.h beschrieben.
Das Ding oben beschreibt den Zugriff auf den Wert, der in par_t1 steht.

Und jetzt nimm dir mal ein C-Buch und mache dich mit ein paar Grundlagen 
vertraut. Etwas C-Kenntnisse sollten heutzutage zumindest als passiver 
Wortschatz existieren.

von M. K. (sylaina)


Lesenswert?

Steffen H. schrieb:
> Da kann ich nicht mit Git Hub und
> irgendwelchen Treibern in Hochsprachen kommen.

Öhm, doch. Es sind die Treiber des Herstellers. Was ist schlimm daran 
wenn er die Source auf Github veröffentlicht? Wie gesagt, man müsste mal 
halt rein schaun und lesen was da drin steht.

Steffen H. schrieb:
> Also in ein Datenblatt gehört auch eine Berechnungsgrundlage

Oder ein Verweis wo noch Informationen zum Sensor zu finden sind...ups, 
das ist ja im Datenblatt...da sind wir ja schon wieder beim Lesen, 
verflixt noch eins.

von Steffen H. (avrsteffen)


Lesenswert?

M. K. schrieb:
> Öhm, doch. Es sind die Treiber des Herstellers. Was ist schlimm daran
> wenn er die Source auf Github veröffentlicht? Wie gesagt, man müsste mal
> halt rein schaun und lesen was da drin steht.

Wenn dem so ist, dann braucht es ja demnächst keine Datenblätter mehr. 
Und Bücher auch nicht. Gibt ja Wikipedia oder Google, was?

Ich sehe die Bibliotheken und Sources auf Git eher als Programmierhilfe 
oder Zusatz. Never Ever aber als Datenblatt Ersatz!

Schon beim Datasheet des BME280 kam öfters die Disskusion über Bosch, 
Datasheets und Werks-Studenten auf, die scheinbar ihre Bachelor Arbeit 
dort geschrieben haben.

Denn die Berechnungen können vereinfacht werden, wenn man sich darüber 
mal ein wenig Gedanken macht, ob man da wirklich 32bit (Float) oder 
sogar 64bit (Double) zum rechnen braucht..

Aber wenn man keine Formel veröffentlicht, muss man mit den Aufgeblähten 
Code auf Git zurechtkommen.

Tolle Aussichten sind das eben nicht. Und eine schreckliche Phillosophie 
für Bosch - wie ich finde - eben auch.

So, und jetzt zerreißt mich :)

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Steffen H. schrieb:
> Wenn dem so ist, dann braucht es ja demnächst keine Datenblätter mehr.
> Und Bücher auch nicht mehr.

Was meinst du wohl, wieso dir kein Bauteildistributor mehr Datenblätter 
per Post zuschickt, auf die du zwei Wochen warten musst. Die Zeit ist 
einfach vorbei. Auch Programme tippt keiner mehr seitenweise als 
Hex-Code von totem Baum ab oder stanzt sie in Papierstreifen. Heutzutage 
bekommst du die Datenblätter nur noch in Form von Dateien im PDF. In 
einem Nachbar-Thread wird schon gemault, dass die nicht in XML daher 
kommen. Da ist es doch wohl auch zumutbar, im der PDF-Datei auf einen 
Link zu der zugehörigen Software zu klicken oder würde es dir besser 
gefallen, wenn sie in der PDF-Datei eingebettet wäre.

von Steffen H. (avrsteffen)


Lesenswert?

Wolfgang schrieb:
> Da ist es doch wohl auch zumutbar, im der PDF-Datei auf einen Link zu
> der zugehörigen Software zu klicken oder würde es dir besser gefallen,
> wenn sie in der PDF-Datei eingebettet wäre.

Hab ich es wirklich so undeutlich geschrieben?
Es ist echt super wenn es einen link zu fertigen Code / fertige 
Bibliotheken gibt. Als Zusatz/Hilfe - Doch aber nicht zur Dokumentation!
Ich hab noch Mathe mit Formeln aus Thermen mit + - * / gelernt und nicht 
durch eine Hochsprache, eingebettet in einem Code.

von Wolfgang (Gast)


Lesenswert?

Steffen H. schrieb:
> Ich hab noch Mathe mit Formeln aus Thermen mit + - * / gelernt und nicht
> durch eine Hochsprache, eingebettet in einem Code.

Ich weiß jetzt nicht, wie die Kalibierung beim BME680 gemacht wird, aber 
es kann durchaus sein, dass die Kalibrierkoeffizienten genau für diesen 
Code mit seinen Ganzzahlunperfektionen erzeugt werden. Die Koeffizienten 
werden dafür so berechnet, dass der Fehler der mit dem Code erzeugtem 
kalibrierten Daten im Sinne von der Summe der Fehlerquadrate minimal 
wird. Das kriegst du durch klassische Formeln nur schwer abgebildet.

von M. K. (sylaina)


Lesenswert?

Steffen H. schrieb:
> Wenn dem so ist, dann braucht es ja demnächst keine Datenblätter mehr.
> Und Bücher auch nicht. Gibt ja Wikipedia oder Google, was?

Ach das bemängeln wir, dass Bosch die Treiber nicht auf eigenen Servern 
zur Verfügung stellt sondern auf Github wo sie von versierten 
Entwicklern problemlos in ihre Projekte eingebunden werden 
können...verstehe.

Steffen H. schrieb:
> Ich sehe die Bibliotheken und Sources auf Git eher als Programmierhilfe
> oder Zusatz. Never Ever aber als Datenblatt Ersatz!

Niemand hat behauptet, dass sie ein Datenblatt Ersatz sind.

Steffen H. schrieb:
> Denn die Berechnungen können vereinfacht werden, wenn man sich darüber
> mal ein wenig Gedanken macht, ob man da wirklich 32bit (Float) oder
> sogar 64bit (Double) zum rechnen braucht..

Na dann mal los. Vereinfache die Formeln. Ist ja anscheinend ein Klacks 
für dich. Ich tippe aber eher nur auf Geschwätz.

von Wolfgang (Gast)


Lesenswert?

Steffen H. schrieb:
> Denn die Berechnungen können vereinfacht werden, wenn man sich darüber
> mal ein wenig Gedanken macht, ob man da wirklich 32bit (Float) oder
> sogar 64bit (Double) zum rechnen braucht..

Dann guck einfach mal in den Code bevor du meckerst.
Die Gedanken haben sich die Leute bei Bosch Sensortec sogar schon 
gemacht und in die Bibliotheken sowohl eine Ganzzahl als auch eine Float 
Version gepackt. Du muss nur die dir genehme verwenden (Umschaltung über 
BME680_FLOAT_POINT_COMPENSATION)

von M. K. (sylaina)


Lesenswert?

Wolfgang schrieb:
> Dann guck einfach mal in den Code bevor du meckerst.

Ja bist du irre, das wäre doch wieder mit Lesen verbunden. Das geht doch 
nicht :D

von Bernhard S. (bernhard)


Lesenswert?

M. K. schrieb:
> Hast du dir die Links mal angeschaut?

Folgende Links fand ich im Datasheet:

https://www.bosch-sensortec.com/software-tools/software/bsec/

Infos werden zur Kalkulation der Sensorwerte nicht benötigt.



https://github.com/BoschSensortec/BME680_driver

Ein Besipsiel in C/C++, sehr komplex, nicht einfach nachvollziehbar



https://www.bosch-sensortec.com/software-tools/software/bsec/

Infos werden zur Kalkulation der Sensorwerte nicht benötigt.

von Bernhard S. (bernhard)


Lesenswert?

Gibt es jemanden, der für den ATmega8 eine kleines Programm entwickeln 
könnte, um die Temperatur Rohdaten auszulesen und nach diesem Verfahren 
die Temperatur zu berechnen:

https://www.bosch-sensortec.com/software-tools/software/bsec/

Mir schwebt ein BME680 Kalkulator / Rechner vor den Augen, bestimmte 
Werte von Registerinhalten eingeben und Temperaturergebnis erhalten.

Natrlich mit nachvollziehbaren Rechenweg.

von Wolfgang (Gast)


Lesenswert?

Bernhard S. schrieb:
> https://github.com/BoschSensortec/BME680_driver
>
> Ein Besipsiel in C/C++, sehr komplex, nicht einfach nachvollziehbar

Genau dort liegt die Bibliothek mit den Kalibrierfunktionen für den 
BME680 und nennt sich bme680.c (mit zugehörigen Headerfiles).
Die Kalibrierroutine für die Temperatur in der Integer Version heißt - 
welche Überraschung - calc_temperature() und liefert einen int16_t-Wert 
zurück.

von Bernhard S. (bernhard)


Lesenswert?

Übrigens, das berechnen der physikalischen Größen ist kein Hexenwerk, 
noch nicht mal Mathematik, sonder einfaches Rechnen Grundschule 4 oder 
5. Klasse.

von Wolfgang (Gast)


Lesenswert?

Bernhard S. schrieb:
> Übrigens, das berechnen der physikalischen Größen ist kein Hexenwerk, ...

Das ändert aber nichts daran, dass du die internen 
Kalibrierkoeffizienten geordnet auslesen und mit der richtigen 
Skalierung in die Rechnung einbringen musst, falls du nicht alles selber 
machen willst (inklusive der Kalibriermessungen).

von c-hater (Gast)


Lesenswert?

Bernhard S. schrieb:

> Gibt es jemanden, der für den ATmega8 eine kleines Programm entwickeln
> könnte, um die Temperatur Rohdaten auszulesen und nach diesem Verfahren
> die Temperatur zu berechnen:
>
> https://www.bosch-sensortec.com/software-tools/software/bsec/

Naja, kommt darauf an, was du unter "klein" verstehst. Angesichts 
dessen, was Bosch hier als Codesize für einen AVR8 angibt, wirst du den 
Funktionsumfang des Treibers ganz erheblich ausdünnen müssen, um die 
Sache überhaupt in einem Mega8 unterzubringen. Das ist natürlich sehr 
gut möglich, wenn dich von dem ganzen Kram, den das Teil liefern kann, 
eh' nur die Temperatur interessiert.

Allerdings: Wenn das so ist, warum dann zum Teufel ein BME680? Das 
ergibt doch keinerlei Sinn.

Andererseits: Warum muss es den unbedingt ein Mega8 sein? In einen 
Mega1284P/644P/644 paßt der gesamte Schotter zum BME680 völlig 
problemlos und du hast immer noch weit mehr Speicher über, als der Mega8 
überhaupt insgesamt hat.

> Mir schwebt ein BME680 Kalkulator / Rechner vor den Augen, bestimmte
> Werte von Registerinhalten eingeben und Temperaturergebnis erhalten.

Das geht nicht. Damit die Rechnung irgendeinen Sinn ergibt, brauchst du 
die Kalibrierungsdaten, zumindest fünf Bytes davon. Und die sind für 
jedes einzelne Exemplar anders, genau deswegen werden sie für jeden 
einzelnen Chip relativ aufwendig ermittelt und in den Chip 
reingeschrieben.

> Natrlich mit nachvollziehbaren Rechenweg.

Der Rechenweg der Temperaturberechnung ist doch trivial. Da ist absolut 
nichts drinne, was über die vier Grundrechenarten hinausgeht. Lass' in 
dem C-Code das Typecasting-Geraffel weg, ersetze die Verschiebungen 
durch Multiplikationen bzw. Divisionen mit bzw. durch Potenzen von 2, 
vereinfache das nach den mathematischen Gesetzen, die du in der 
Grundschule gelernt hast, und du erhältst einen Text, der schon ziemlich 
mathematisch und ziemlich trivial aussieht:

var1 = temp_adc / 8 - dev->calib.par_t1 * 2
var2 = (var1 * dev->calib.par_t2) / 2048
var3 = (var1 * var1) / 16384
var3 = (var3 * dev->calib.par_t3) / 1024
var3 = var3 + var2
calc_temp = (var3 * 5 + 128) / 256;

Es bleiben als einzige "Fremdkörper" die Verweise auf den Messwert und 
die drei Kalibrierungswerte. Das ist halt der Kram, den du aus dem Chip 
lesen musst. Da die Kalibrierungswerte sich nicht zur Laufzeit ändern, 
liest man die halt nur einmal.

Was bleibt, um das in Asm optimal umzusetzen, ist die weitere Zerteilung 
in elementare Operationen und die Analyse der für die einzelnen Schritte 
benötigten Bitbreiten.

von Wolfgang (Gast)


Lesenswert?

c-hater schrieb:
> Lass' in dem C-Code das Typecasting-Geraffel weg, ersetze die
> Verschiebungen durch Multiplikationen bzw. Divisionen mit bzw.
> durch Potenzen von 2

Ausgerechnet eine Schiebeoperation ist doch in Assembler eine der 
einfachsten Übungen. Keiner - außer dir vielleicht - wird auf die Idee 
kommen, die Schieberei aufzugeben und statt dessen eine komplette 
Multiplikation bzw. Division anzuschmeißen.

von Bernhard S. (bernhard)


Lesenswert?

c-hater schrieb:
> Es bleiben als einzige "Fremdkörper" die Verweise auf den Messwert und
> die drei Kalibrierungswerte.

Und genau das ist das Problem, in  welchen Registern sind diese 
Kalibrierwerte versteckt, vermultich in denen, welche nicht im 
Datenblatt erwähnt werden.

89h  to A1h for calibration data 1 to 24
E1h to F0h for calibration data 25 to 40

> Der Rechenweg der Temperaturberechnung ist doch trivial.
> var1 = temp_adc / 8 - dev->calib.par_t1 * 2
> var2 = (var1 * dev->calib.par_t2) / 2048
> var3 = (var1 * var1) / 16384
> var3 = (var3 * dev->calib.par_t3) / 1024
> var3 = var3 + var2
> calc_temp = (var3 * 5 + 128) / 256;

das mag sein, aber in welchem Register befindet sich par_t1, par_t2, 
par_t3

>Das geht nicht. Damit die Rechnung irgendeinen Sinn ergibt, brauchst du
>die Kalibrierungsdaten, zumindest fünf Bytes davon.

In dieser "Formel" finde ich nur 3 >grübel<


>> Mir schwebt ein BME680 Kalkulator / Rechner vor den Augen, bestimmte
>> Werte von Registerinhalten eingeben und Temperaturergebnis erhalten.
>
> Das geht nicht. Damit die Rechnung irgendeinen Sinn ergibt, brauchst du
> die Kalibrierungsdaten, zumindest fünf Bytes davon.

Die Kalibrierungsdaten lassen sich wunderschön, sowie die Rohdaten aus 
dem Sensor auslesen. Diese schwungvoll in den Excel Calculator 
einpflegen...fertsch

> Warum muss es den unbedingt ein Mega8 sein?

Ein Tiny85 darf es natürlich auch sein, es gibt hier Experten, z.B. 
Steffen, die würden das auch schaffen^^

Derzeit ist der ATmega8 nur zu 51% belegt, inc. OLED128x64-Treiber 
SSD1306, ADC, Uhr und anderen Routinen die kein Mensch braucht, 
allerdings in Assembler mit viel Optimierungspotential.... da passt noch 
viel rein.

PS: Hab vorhin Bosch per e-mail kontaktiert, bekam auch sofort eine 
Antwort, ich bin jetzt noch extrem maximal begeistert.

https://community.bosch-sensortec.com/t5/forums/searchpage/tab/message?filter=location&q=BME680&location=category:bst_community&collapse_discussion=true

Bin aber in der Community nicht richtig fündig geworden, oder ich habe 
etwas übersehen.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Wolfgang schrieb:

> Ausgerechnet eine Schiebeoperation ist doch in Assembler eine der
> einfachsten Übungen.

Natürlich. Er wollte es doch aber "mathematisch" haben.

> Keiner - außer dir vielleicht - wird auf die Idee
> kommen, die Schieberei aufzugeben und statt dessen eine komplette
> Multiplikation bzw. Division anzuschmeißen.

Ha, das wiederum ist falsch. Wenn du dir die Aufdröselung anschaust, 
wirst du erkennen, dass da schon einiges an Optimierungspotential allein 
durch die streng mathematische Vereinfachung erkennbar wurde...

Nein, Mathematik ist nicht sinnlos, auch (und gerade) nicht, wenn man in 
Assembler programmiert...

Nur die C-only C&P-ler (finsteres, abartig minderwertiges Volk) haben 
sowas nicht drauf...

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

> Und genau das ist das Problem, in  welchen Registern
> sind diese Kalibrierwerte versteckt
Vielleicht verstehe ich das nicht so ganz, aber siehe Anhang.

> In dieser "Formel" finde ich nur 3 >grübel<
Da stehen doch 2*2+1 Bytes, oder?

von c-hater (Gast)


Lesenswert?

Bernhard S. schrieb:

> das mag sein, aber in welchem Register befindet sich par_t1, par_t2,
> par_t3

Das steht in dem C-Quelltext. Erstaunlicherweise genau in der Funktion, 
wo man es vermuten könnte: get_calib_data()...

>>Das geht nicht. Damit die Rechnung irgendeinen Sinn ergibt, brauchst du
>>die Kalibrierungsdaten, zumindest fünf Bytes davon.
>
> In dieser "Formel" finde ich nur 3 >grübel<

Drei Werte, zwei davon sind 16Bit breit, einer 8. Macht zusammen wieviel 
Bytes, du Nase?

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

S. Landolt schrieb:
>> Und genau das ist das Problem, in  welchen Registern
>> sind diese Kalibrierwerte versteckt
> Vielleicht verstehe ich das nicht so ganz, aber siehe Anhang.

Super!!!! Die Lösung . 1000 Dank.



Wo finde ich diese Version, ich kann sie nicht finden?

BST-BME680-DS001-03 Revision_13_072019

par_t1 E9h EA
par_t2 8Ah 8bh
par_t3 8ch
temp_adc 24h 23h 22h

ich arbeite mit einer veralteten Version "BST-BME680-DS001-00" (2017)

c-hater schrieb:
>> In dieser "Formel" finde ich nur 3 >grübel<
> Drei Werte, zwei davon sind 16Bit breit, einer 8. Macht zusammen wieviel
> Bytes, du Nase?

Hey Du Dampfnase, in Mathematik war ich immer gut, nur nicht im 
Kopfrechen, sorry.

Diesen Beitrag finde ich auch sehr interesant:
Beitrag "BME680 etwas ATMega-freundlicher auslesen"

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> Wo finde ich diese Version, ich kann sie nicht finden?
Schlag' nach bei - nein, nicht Shakespeare, sondern - Reichelt.

von Wolfgang (Gast)


Lesenswert?

Bernhard S. schrieb:
> Und genau das ist das Problem, in  welchen Registern sind diese
> Kalibrierwerte versteckt, vermultich in denen, welche nicht im
> Datenblatt erwähnt werden.

In get_calib_data() werden die ganzen Calibrierwerte erstmal durch 
bme680_get_regs() in coeff_array[] reingelesen (ab Zeile 728 in 
bme680.c) und anschließen in dev->calib (Typ bme680_calib_data) 
einsortiert (z.B. ab Zeile 735 für die Temperatur). Die Konstanten, die 
die Register, die Länge der Bereiche und die Position im coeff_array[] 
angeben, stehen in bme680_defs.h
Guck dir doch endlich mal den Code an.

von Bernhard S. (bernhard)


Lesenswert?

S. Landolt schrieb:
>> Wo finde ich diese Version, ich kann sie nicht finden?
> Schlag' nach bei - nein, nicht Shakespeare, sondern - Reichelt.

grins

Danke, bei reichelt fand ich die korrekte Version.

Wolfgang schrieb:
> Guck dir doch endlich mal den Code an.

Ich denke, das wird momentan nicht erforderlich sein, trotzdem Danke für 
den Hinweis.

Diese Register müssten theoretisch verwendet werden:

E9h EA 8Ah 8bh 8ch 24h 23h 22h

PS: ich könnte mich jetzt noch Ohrfeigen, viele Stunden vergeutet und 
Eure wertvolle Lebenszeit beansprucht, nur weil ich nicht das aktuelle 
Datenblatt verwendet hatte :-(

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> ich könnte mich jetzt noch Ohrfeigen
Darf ich auch mal?

Aber Spaß beiseite, ob das bei Reichelt
> das aktuelle Datenblatt
ist, weiß ich nicht, es war schlicht das Erste, das ich in die Finger 
bekam.

von c-hater (Gast)


Lesenswert?

Bernhard S. schrieb:

> Diesen Beitrag finde ich auch sehr interesant:
> Beitrag "BME680 etwas ATMega-freundlicher auslesen"

Du glaubst, wir erkennen kein Sockenpuppen, nur weil du sie tanzen läßt?

Mein Gott, sogar meine KI hat sofort 99,8% Wahrscheinlichkeit geliefert. 
Und die ist immer noch weit blöder, als ich sie gern hätte...

von Bernhard S. (bernhard)


Lesenswert?

S. Landolt schrieb:
>> ich könnte mich jetzt noch Ohrfeigen
> Darf ich auch mal?

ja, kostet aber extra^^

S. Landolt schrieb:
> Aber Spaß beiseite, ob das bei Reichelt
>> das aktuelle Datenblatt
> ist, weiß ich nicht, es war schlicht das Erste, das ich in die Finger
> bekam.

Vermutlich hatte ich mein veraltetes von:
https://www.adafruit.com/

: Bearbeitet durch User
von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Version-2

Ausgabe der Registerinhalte für die Temperaturberechnung

E9h EA 8Ah 8bh 8ch 24h 23h 22h

Nun mögen die Berechnugsspiele beginnen :)

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Bernhard S. schrieb:

> Nun mögen die Berechnugsspiele beginnen :)

Fair wäre, wenn du deine eigene Lösung vorgelegt hättest. Dann könnte 
man die so richtig genüsslich zerfleischen...

von Bernhard S. (bernhard)


Lesenswert?

c-hater schrieb:
>> Nun mögen die Berechnugsspiele beginnen :)
>
> Fair wäre, wenn du deine eigene Lösung vorgelegt hättest.

Um etwas Geduld wird gebeten, Excel ist schon gestartet.

>Dann könnte man die so richtig genüsslich zerfleischen...

Gern, ich bitte darum, ich helfe Euch noch dabei, solange es fair und 
konstruktiv ist.

Wenn dann mit der Berechnung noch ein Zuse(Z1) zurecht käme, das wäre 
schön.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Bernhard S. schrieb:

> Um etwas Geduld wird gebeten, Excel ist schon gestartet.

Excel? WTF? Ich dachte, das Target wäre AVR8 und die Sprache Asm? Ich 
sehe nicht, wozu Excel da beitragen könnte...

von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

Bernhard S. schrieb:
> S. Landolt schrieb:
>>> Wo finde ich diese Version, ich kann sie nicht finden?
>> Schlag' nach bei - nein, nicht Shakespeare, sondern - Reichelt.
> ...
> Danke, bei reichelt fand ich die korrekte Version.

Die Version von Reichelt ist auch deutlich angestaubt.

Die aktuelle Version gibt's beim - HERSTELLER
https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme680-ds001.pdf

von Bernhard S. (bernhard)


Lesenswert?

Wolfgang schrieb:
> Die Version von Reichelt ist auch deutlich angestaubt.
>
> Die aktuelle Version gibt's beim - HERSTELLER

bst-bme680-ds001-06  Super ! Danke für den Tipp :-)

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

BME680 Rechner / Calculator momentan nur für Temperatur. Einfach die 
erforderlichen Registerinhalte auslesen und in die Excel-Tabelle 
eintragen.

Es wäre schön, würde mich überaus glücklich machen, wenn jemand einen 
Fehler in der Berechnung fände.

Bitte verlangt jetzt kein Kalibrierschein vom digitalen LED-Thermometer, 
meine Teetasse stellte ich versehentlich neben den empfindlichen 
Temperatursensor TSIC206.

Beitrag "TSIC206 TSIC306 Temperatursensor / Thermometer LCD Assembler ATmega8"

c-hater schrieb:
>> Mir schwebt ein BME680 Kalkulator / Rechner vor den Augen, bestimmte
>> Werte von Registerinhalten eingeben und Temperaturergebnis erhalten.
>
> Das geht nicht. Damit die Rechnung irgendeinen Sinn ergibt, brauchst du
> die Kalibrierungsdaten, zumindest fünf Bytes davon. Und die sind für
> jedes einzelne Exemplar anders, genau deswegen werden sie für jeden
> einzelnen Chip relativ aufwendig ermittelt und in den Chip
> reingeschrieben.

wurde alles mit berücksichtigt

c-hater schrieb:
>> Um etwas Geduld wird gebeten, Excel ist schon gestartet.
>
> Excel? WTF? Ich dachte, das Target wäre AVR8 und die Sprache Asm? Ich
> sehe nicht, wozu Excel da beitragen könnte...

Ich dagegen schon, im Datenblatt ist leider keine Beispielrechnung 
dabei,
eine kleine Exeltabelle gibt doch etwas Sicherheit, ob die Bitfummelei 
in ASM gelungen ist, Du Nase :-)

Die Umsetzung in Assembler ist nicht tragisch, nur etwas zeitaufwändig.
Kommt noch, auch hier bitte ich um etwas Geduld, mit Verlaub.

: Bearbeitet durch User
von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Seltsam, im Bereich 0 bis 20°C ist ist der ADC nahezu linear zur 
Temperatur, ich hätte ine total verzerrte Kurve erwartet.

von Wolfgang (Gast)


Lesenswert?

Bernhard S. schrieb:
> Seltsam, im Bereich 0 bis 20°C ist ist der ADC nahezu linear zur
> Temperatur

Die nichtlinearen Korrekturen mit var2 sind so klein, dass du sie beim 
Plot der Gesamtfunktion nicht siehst. Die Abweichungen von der Geraden 
werden besser erfassbar, wenn man nur den Korrekturterm var2/5120.0 
gegen die Temperatur darstellst.

Bernhard S. schrieb:
p.s.
> BME680_Calculator_V1.xls
Um dein Excel-WS zu probieren, braucht man noch die 
./%08ANALYSE/ATPVBAEN.XLA
Alternativ kann man einfacher eine eingebaute Funktion (HEX2DEC, 
HEXINDEZ) benutzen.

von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

Wenn man den C-Code für die Float-Berechnung der Temperatur auf die 
Mathematik reduziert, bleibt davon
1
var1   = ((temp_adc / 16384.0) - (par_t1 / 1024.0)) * par_t2
2
var2   = (((temp_adc / 131072.0) - (par_t1 / 8192.0)) * ((temp_adc / 131072.0) - (par_t1 / 8192.0))) * (par_t3 * 16.0)
Mit einer Hilfsvariablen xtemp lässt sich der nichtlineare Anteil 
vereinfacht darstellen:
1
xtemp = ((temp_adc / 131072.0) - (par_t1 / 8192.0))
2
var2   = (xtemp * xtemp) * (par_t3 * 16.0)
Die Umrechnung einschließlich nichtlinearer Korrektur wie im DS:
1
t_fine = var1 + var2
2
temp_comp = t_fine / 5120.0;

von M. K. (sylaina)


Lesenswert?

Bernhard S. schrieb:
> Ein Besipsiel in C/C++, sehr komplex, nicht einfach nachvollziehbar

Eigentlich nicht da da nur Grundlagen C verwendet wird. Und das sollte 
heute, 2021, auch jemand können, der High-Level-ASM beherrscht. Sogar 
unser C-Hater kann C wie er schon oft hier im Forum bewies.

von S. Landolt (Gast)


Lesenswert?

> Nun mögen die Berechnugsspiele beginnen :)
Was für Spiele? Ist doch alles klar.

Allenfalls eine Frage hätte ich noch: woher, bitte, kommt der Wert 
'793b80' in Ihrem 'BME680_Calculator.jpg'?

von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

Bernhard S. schrieb:
> Seltsam, im Bereich 0 bis 20°C ist ist der ADC nahezu linear zur
> Temperatur, ich hätte ine total verzerrte Kurve erwartet.

So schlimm ist das nicht. Zwischen 0 und 20°C sind das 0.21K durch die 
Krümmung deiner Sensorkennlinie (s. Anhang mit Temperaturkoorektur durch 
var2-Anteil).

> Allenfalls eine Frage hätte ich noch: woher, bitte, kommt der Wert
> '793b80' in Ihrem 'BME680_Calculator.jpg'?

Der ist zusammengebaut aus den Registerinhalten des Wandlungsergebnises 
der Temperaturmessung.

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

S. Landolt schrieb:
> Allenfalls eine Frage hätte ich noch: woher, bitte, kommt der Wert
> '793b80' in Ihrem 'BME680_Calculator.jpg'?

Wolfgang schrieb:
> Der ist zusammengebaut aus den Registerinhalten des Wandlungsergebnises
> der Temperaturmessung.

Ein kleines Tool "2021-02-19_V2.zip" zeigte mir den Inhalt der 
erforderlichen Register an, so wie es Wolfgang beschrieb.

Wolfgang schrieb:
> Mit einer Hilfsvariablen xtemp lässt sich der nichtlineare Anteil
> vereinfacht darstellen:

Interessant! Wer mit einer vertretbaren Genauigkeit arbeiten möchte, 
solange kein Menschenleben in Gefahr ist, könnte mit einer vereinfachten 
Formel arbeiten.

Wolfgang schrieb:
> Alternativ kann man einfacher eine eingebaute Funktion (HEX2DEC,
> HEXINDEZ) benutzen.

Momentan verende ich "Hex2Dec()", hatte aber im Add-In-Manager einiges 
akiviert, vermutlich gab's dort mal Probleme.

von Wolfgang (Gast)


Lesenswert?

Bernhard S. schrieb:
> Interessant! Wer mit einer vertretbaren Genauigkeit arbeiten möchte,
> solange kein Menschenleben in Gefahr ist, könnte mit einer vereinfachten
> Formel arbeiten.

Wie groß die Fehler dadurch werden, hängt hauptsächlich vom genutzen 
Messbereich ab.

von S. Landolt (Gast)


Lesenswert?

Das war für uns ja nicht ersichtlich, gestern um 21:33 stand im 
mittleren Byte noch '10'.
  Und auch jetzt bin ich der Meinung, dass es 0x803B7 heißen sollte, der 
Wert hat doch nur 20 bit, oder verstehe ich das Datenblatt '5.3.4.2 Temp 
data' falsch?

von Bernhard S. (bernhard)


Lesenswert?

S. Landolt schrieb:
> Wert hat doch nur 20 bit, oder

Du hast Recht. Es sind nur 20 Bit. Zu sehen sind die Rohdaten, also die 
unveränderten Rohdsten.
In der Berechnung erfolgt dann die Wandlung von 24 auf 20 Bit.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Das heißt, das 'BME680_Calculator.jpg' von 00:02 ist falsch und 
überholt?

von Bernhard S. (bernhard)


Lesenswert?

Oh. Warum?

von S. Landolt (Gast)


Lesenswert?

Weil dort mit 24 bit gerechnet wird. Und am Ende aus mir unerfindlichem 
Grund durch 100 geteilt wird, um ein halbwegs sinnvolles Ergebnis 
vorzuweisen.

von S. Landolt (Gast)


Lesenswert?

PS:
Die Float-Berechnung laut Datenblatt muss das korrekte Endergebnis in 
Grad bringen, nur bei Integer sind es offenbar Centigrad.

von S. Landolt (Gast)


Lesenswert?

Vorschlag: geben Sie uns die Registerinhalte an den Adressen
1
0x22:
2
0x23:
3
0x24:
4
0xE9:
5
0xEA:
6
0x8A:
7
0x8B:
8
0x8C:
sowie die Temperatur an, am besten mit einem guten alten 
Glasröhrchenthermometer gemessen.

von Wolfgang (Gast)


Lesenswert?

S. Landolt schrieb:
> PS:
> Die Float-Berechnung laut Datenblatt muss das korrekte Endergebnis in
> Grad bringen, nur bei Integer sind es offenbar Centigrad.

Das würde voraus setzen, dass das Datenblatt korrekt ist.

Guck dir mal das Beispiel bei Adafruit an.
Die verwenden in der Library die gleiche Rechnung und beim Auswerten in 
Adafruit_BME680.cpp taucht für die Temperatur genau der Faktor 100 in 
Zeile 389 auf. In der Doku zu float readTemperature () steht: "Returns 
Temperature in degrees Centigrade ".

Zufall oder Tippfehler?

https://github.com/adafruit/Adafruit_BME680/tree/master/examples/bme680test
https://github.com/adafruit/Adafruit_BME680/blob/master/Adafruit_BME680.cpp
https://adafruit.github.io/Adafruit_BME680/html/class_adafruit___b_m_e680.html

von S. Landolt (Gast)


Lesenswert?

Nun, bei einer Float-Rechnung erwarte ich als Ergebnis eben das, eine 
Gleitpunktzahl; hier also, wie es im Datenblatt steht, Grad mit 
Nachkommastellen.
  Bei einer Integer-Rechnung bekäme man nur ganze Grad, folglich ist es 
sinnvoll, Centigrad als Ergebnis zu erhalten; auch wenn das, zugegeben, 
so nicht im Datenblatt steht.
  Und mir fällt nunmal auf, dass bei Float am Ende durch 5120 dividiert 
wird, bei Integer durch 51.2 = 5/256.

von S. Landolt (Gast)


Lesenswert?

PS:
Die erste Frage sollte sein: was wird bei Adafruit hineingesteckt, 20 
oder 24 Bit? Sie können dies ganz sicher wesentlich schneller 
beantworten als ich.

von Wolfgang (Gast)


Lesenswert?

S. Landolt schrieb:
> Nun, bei einer Float-Rechnung erwarte ich als Ergebnis eben das, eine
> Gleitpunktzahl; hier also, wie es im Datenblatt steht, Grad mit
> Nachkommastellen.

Da kannst du erwarten, was du möchtest und musst evtl. deine eigene 
Library schreiben. Der Hersteller hat es nun mal so gemacht, um z.B. 
zwischen Int und Float Version keine Bruch zu haben und so ist es nun 
mal.

S. Landolt schrieb:
> Die erste Frage sollte sein: was wird bei Adafruit hineingesteckt, 20
> oder 24 Bit?

Adafruit hat als BME680 Library die von Bosch Sensortec. Und mit der 
Rechnung passen die Werte von Bernhard. Der Sensor liefert, je nach 
IIR-Filter Einstellung maximal 20 Bit. (DS Kap. 3.3.1Temperature 
measurement). Die zusätlichen 4 Bit aus dem einen Register gehören nicht 
zum Temperatursensor.
https://github.com/adafruit/Adafruit_BME680/blob/master/bme680.c

von Wolfgang (Gast)


Lesenswert?

Wolfgang schrieb:
> Die zusätlichen 4 Bit aus dem einen Register gehören nicht
> zum Temperatursensor.

p.s. Die 20 Bits werden in bme680.c Zeile 1228 zusammengebaut.
https://github.com/adafruit/Adafruit_BME680/blob/master/bme680.c#L1228

von S. Landolt (Gast)


Lesenswert?

> passen die Werte von Bernhard
Da ist mir z.B. unklar, was MSB und was LSB ist. Und eine Raumtemperatur 
von 24 °C erscheint mir etwas hoch. Tatsache ist, er steckt 24 Bit rein, 
und dividiert am Ende durch 100 (was ich so nirgends im Datenblatt 
finde), um auf seine Temperatur zu kommen.

Was mich betrifft, so hätte ich gerne mit den Rohdaten die 
Integer-Berechnung aus dem Datenblatt durchgeführt. Ganz simpel und vor 
allem unabhängig von 'Adafruit' und schlicht "... for a friendlier user 
experience" ignorierend (bei solchen Sätzen bekomme ich ein ungutes 
Gefühl, traut Bosch seinem eigenen Datenblatt nicht ganz oder halten sie 
die Anwender für wenig fähig?).

von S. Landolt (Gast)


Lesenswert?

PS:
Sie selbst, Wolfgang, haben ja offenbar mit den Datenblattformeln auch 
nicht das geringste Problem. Und grundlegende Programmierkenntnisse 
sollte Bosch seinen Anwendern doch zutrauen.

von Bernhard S. (bernhard)


Lesenswert?

S. Landolt schrieb:
> Vorschlag: geben Sie uns die Registerinhalte

gern, bei ca.23 Grad Sensortemperatur:

Register / Value
 0x22: 0x80 ' ADC
 0x23: 0x3b
 0x24: 0x79

 0xE9: 0x65 ' par_t1
 0xEA: 0xc7

 0x8A: 0x6a ' par_t2
 0x8B: 0x68

 0x8C: 0x03 ' par_t3

S. Landolt schrieb:
> Das heißt, das 'BME680_Calculator.jpg' von 00:02 ist falsch und
> überholt?

> Weil dort mit 24 bit gerechnet wird. Und am Ende aus mir unerfindlichem
> Grund durch 100 geteilt wird, um ein halbwegs sinnvolles Ergebnis
> vorzuweisen.

In der "BME680_Calculator_V1.xls" wird ein 24Bit-Wert eingespeist, das 
Ergenis war auch nach meiner Meinung plausibel, könnte aber trotzdem 
nicht korrekt sein.

von S. Landolt (Gast)


Lesenswert?

Stimmt die Reihenfolge bei par_t1?
Der Ausdruck für var1 wird negativ bei der Integer-Berechnung (wenn ich 
meinem Taschenrechner trauen darf).

von S. Landolt (Gast)


Lesenswert?

Also in Ihrem Calculator setzen Sie für par_t1 26055, das ist 0x65C7 und 
nicht 0xC765.

von S. Landolt (Gast)


Lesenswert?

Ich kann's nicht ändern (bzw. besser): mit Ihren Werten, wobei für 
par_t1 der plausible, so wie er auch im Calculator steht, genommen wird, 
erhalte ich bei der Integer-Berechnung des Datenblattes 0xD7D = 3453. 
Keine Ahnung, was das ist, sieht nicht einmal nach c°C aus.

von Wolfgang (Gast)


Lesenswert?

S. Landolt schrieb:
> Da ist mir z.B. unklar, was MSB und was LSB ist. Und eine Raumtemperatur
> von 24 °C erscheint mir etwas hoch. Tatsache ist, er steckt 24 Bit rein,
> und dividiert am Ende durch 100 (was ich so nirgends im Datenblatt
> finde), um auf seine Temperatur zu kommen.

Wenn man Bernhards Roh-Werte um die 4 Bit schiebt (-> 0x793b8) und die 
Division durch 100 am Ende weg lässt, landet man bei 25.40°C
Das ist dummerweise arg dicht dran. Die Abweichung sollte aber bei 
halbwegs sorgfältigem Vergleich mit einem Referenzthermometer noch 
auffallen.

Die Integerrechnung kommt mit dem Wert 0x793b8 auf 2540, so dass du 
anscheinend Recht hast. Das würde doch gegen Tippfehler im DS sprechen.
Leider habe ich selber keinen BME680 hier.

Bernhard, hast du die Möglichkeit eine genügend genauer 
Vergleichsmessung zu machen?

von S. Landolt (Gast)


Lesenswert?

> Die Integerrechnung kommt mit dem Wert 0x793b8 auf 2540
Ja, aber als Letztes schrieb er, der ADC-Wert sei 0x803b7(9).

von c-hater (Gast)


Lesenswert?

S. Landolt schrieb:

> Tatsache ist, er steckt 24 Bit rein

Im C-Quelltext werden von den 24 Bit aus den Registern schon in der 
Ausleseroutine 4 Bits weggeworfen. Das ist die Zeile, die Wolfgang 
verlinkt hatte.

In der Wandlerroutine werden dann gleich als erstes nochmal 3 Bits 
weggeworfen. Effektiv hat also der tatsächlich verarbeitete 
Temperaturwert nur noch 17 Bits.

von Bernhard S. (bernhard)


Lesenswert?

Wolfgang schrieb:
> Bernhard, hast du die Möglichkeit eine genügend genauer
> Vergleichsmessung zu machen?

Ja, ein kalibriertes Thermometer steht mir zur Verfügung, am kommenden 
Freitag könnte ich den Versuch wiederholen und entsprechende 
Registerdaten liefern.

Raum-, Außen-, Backofen, Kühlschrank- und Gefrierschrank-Temperatur.

von c-hater (Gast)


Lesenswert?

Bernhard S. schrieb:

> Ja, ein kalibriertes Thermometer steht mir zur Verfügung

Welche Genauigkeit kann das liefern?

von S. Landolt (Gast)


Lesenswert?

> und entsprechende Registerdaten liefern
Vielleicht auch die heute zuletzt angegebenen nochmals sorgfältig 
überprüfen.

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

c-hater schrieb:
> Welche Genauigkeit kann das liefern?

Ich denke  mit +/- 0.5K  können wir rechnen.

S. Landolt schrieb:
> Vielleicht auch die heute zuletzt angegebenen nochmals sorgfältig
> überprüfen.

Ja. Das werde ich tun.

von M. K. (sylaina)


Lesenswert?

Bernhard S. schrieb:
> Ich denke  mit +/- 0.5K  können wir rechnen.

"denke" ?!? Öhm, das solltest du eigentlich wissen und nicht vermuten.

Wolfgang schrieb:
> Leider habe ich selber keinen BME680 hier.

Hast du einen BME/BMP280. Der BME680 ist nur ein BME280 mit zusätzlichem 
Luftgütesensor. ;)

von c-hater (Gast)


Lesenswert?

Bernhard S. schrieb:

> Ich denke  mit +/- 0.5K  können wir rechnen.

Dir ist schon klar, dass damit nur eine sehr grobe Kontrolle möglich 
wäre, oder?

Der BME und die Berechnung haben den Anspruch, deutlich genauere Werte 
zu liefern, nämlich ca. auf zwei dezimale Nachkommastellen genaue. Für 
nur 0.5K Genauigkeit könnte man die Wandlerroutine bezüglich 
Rechenaufwand (und Codegröße) ganz erheblich eindampfen.

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Im BMP280 ist der Rechenweg mit einem Beispiel erklärt, vermutlich sind 
die Rechenwege BMP280 / BME680 ähnlich, ich konnte es aber noch nicht 
prüfen.



c-hater schrieb:
>> Ich denke  mit +/- 0.5K  können wir rechnen.
>
> Dir ist schon klar, dass damit nur eine sehr grobe Kontrolle möglich
> wäre, oder?


Laut Datenblatt des TH-3 sogar nur:

Temperature (Dry Bulb) -20 °C to 60 °C:         ±0.8 °C

Ich schau mal auf den Kalibruerschein.

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Übrigens, die Berechnungsformel für die Temperatur ist beim BMP280 und 
BME680 ziemlich ähnlich, var2 ist etwas anders.

Nur im Datenblatt des BMP280 ist eine vernünftige Beispielrechnung mit 
dabei.

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Ein Excel Rechner Druck und Temperatur für einen BME280.

ADC muss 18Bit sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.