BME680 Berechnung Temperatur Luftfeuchtigkeit Druck Gas Fragen Initialisierung Assembler ASM ATmega8

OP #6591998
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
Angehängte Dateien:
OP #6592024
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^^
Gast #6592079
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
#6592147
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.
Gast #6592158
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
OP #6592356
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?
Gast #6592376
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
#6592379
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.
#6592518
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ß..
OP #6592548
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
Gast #6592670
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.
#6592913
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.
#6592973
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 :)
Gast #6592994
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.
#6593061
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.
Gast #6593219
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.
#6593441
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.
Gast #6593450
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)
OP #6593797
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.
OP #6593805
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.
Gast #6593809
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.
Gast #6593914
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).
Gast #6594142
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.
Gast #6594241
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.
OP #6594265
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.
Gast #6594279
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...
Gast #6594285
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?
Angehängte Dateien:
Gast #6594286
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?
OP #6594316
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"
Angehängte Dateien:
Gast #6594326
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.
OP #6594332
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 :-(
Gast #6594340
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.
OP #6594447
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.
Gast #6594506
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
Angehängte Dateien:
OP #6594515
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.
Angehängte Dateien:
Gast #6594569
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.
Gast #6594605
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;
Angehängte Dateien:
Gast #6594728
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'?
Gast #6594799
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.
Angehängte Dateien:
OP #6594826
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.
Angehängte Dateien:
Gast #6594929
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?
Gast #6595042
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.
Gast #6595104
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
Gast #6595123
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.
Gast #6595151
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
Gast #6595167
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?).
OP #6595178
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.
Gast #6595212
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.
Gast #6595221
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?
Gast #6595236
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.
Gast #6595758
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.
OP #6596282
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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren