hwOS Header Doku falsch?

OSTC's running hwOS sport or tech
Post Reply
Spacefish
Posts: 32
Joined: Wednesday 30. August 2017, 12:57

hwOS Header Doku falsch?

Post by Spacefish »

Hallo,

ich hab gestern angefangen eine kleine C# Library zu schreiben welche mit dem OSTC sprechen kann, dabei ist mir beim Parsen der langen Dive Header aufgefallen, Byte 17/18 (Max. Depth in mbar) mit der zugehörigen Note 1 die Note nicht ganz hinkommt.

In Note 1 steht:
[quote="Note 1"]
Depth in meters = Depth in mbar*g0/1000 (g0=9,80665m/s2)
[/quote]

Jedoch muss man g0 = 10 und nicht 9,80665m/s2 verwenden um den selben Wert wie im OSTC Logbuch zu erhalten.. Das macht auch Sinn, wenn man in den Firmware Source schaut:

In ghostwriter.asm wird auf Zeile 519 ff. folgendes getan:
[quote]
[pre]
btfss FLAG_apnoe_mode ; Store apnoe max or normal max (Which is only max from the last descent)
bra end_dive1 ; Store normal depth

movff apnoe_max_pressure+0,lo
movff apnoe_max_pressure+1,hi
call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar]
movff lo,apnoe_max_pressure+0
movff hi,apnoe_max_pressure+1

movf apnoe_max_pressure+0,W ; Max. depth
rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
movf apnoe_max_pressure+1,W
rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
bra end_dive2 ; skip normal max. depth

end_dive1:
movff max_pressure+0,lo
movff max_pressure+1,hi
call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar]
movff lo,max_pressure+0
movff hi,max_pressure+1

movff max_pressure+0,WREG ; Max. depth
rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
movff max_pressure+1,WREG
rcall ghostwrite_byte_header ; WREG -> Header in ext. flash

[/pre]
[/quote]

adjust_depth_with_salinity (tft_outputs.asm:4374) rechnet aber bereits 0,98 als Faktor mit ein:
[quote]
[pre]
;=============================================================================

global adjust_depth_with_salinity
global adjust_depth_with_salinity_log
adjust_depth_with_salinity: ; computes salinity setting into lo:hi [mbar]
btfsc simulatormode_active ; Do not apply salinity in simulator mode
return
movff opt_salinity,WREG ; 0-5% opt_salinity is moved to WREG
adjust_depth_with_salinity_log: ; computes salinity setting (FROM WREG!) into lo:hi [mbar]
addlw d'100' ; 1.00kg/l add 100 to WREG
movwf up ; W is moved to a register (up)

movlw d'105' ; 105% ? 105 is written into W
cpfslt up ; Salinity higher limit, COMPARE up register with W
return ; Out of limit, do not adjust lo:hi
movlw d'99' ; 99% ?
cpfsgt up ; Salinity lower limit
return ; Out of limit, do not adjust lo:hi

movff lo,xA+0 ; lo is moved to xA+0 (Copies current pressure in mBar to register xA)
movff hi,xA+1 ; hi is moved to xA+1

movlw d'102' ; 0,98bar/10m 102 is written into W
movwf xB+0 ; move W into register xB
clrf xB+1 ; clear regsiter xB+1
call mult16x16 ; xA*xB=xC (lo:hi * 100) currentpressure mBar is multiplied by 102
movff up,xB+0 ; Salinity
clrf xB+1
call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder current pressure * 102 is divided by salinity% + 100
movff xC+0,lo
movff xC+1,hi ; restore lo and hi with updated value
return

;=============================================================================
[/pre]
[/quote]

Die Note 1, im hwos_interface.odt ist also etwas verwirrend!

Ich fände es an sich gut, wenn "Max. Depth in mbar" nicht in schon verechneten Milibar angegeben wäre sondern da der tatsächlich Messwert enthalten wäre.. Die Erdbeschleunigung + die Salinity würde man dann on demand beim darstellen dazurechnen, das wäre verständlicher..

Wenn man es übertreiben möchte, könnte man auch noch eine unterschiedliche Erdbeschleunigung je nach geographischer Breite und die Temperatur der einzelnen Wasserschichten der Wassersäule über dem Taucher näherungsweise aus den Temperaturprofildaten mit in Betracht ziehen, da ja Wasser je nach Temperatur unterschiedliche Dichte hat.

Jeder OSTC hat doch eh einen in der ein oder anderen Form einen 3D Beschleunigungssensor verbaut?! Evtl. könnte man auch diese Daten verwenden :) um die aktuelle Erdbeschleunigung zu messen, die Dinger sind ja recht genau! Wenn die Summe > 2 sec in einem bestimmten Band stabil bleibt, kann man ja gut davon ausgehen, dass das die aktuelle Erdbeschleunigung ist. (Falschirmspringen und Parabelflug mit Tauchausrüstung mal ausgeschlossen)

Bike-shedding: adjust_depth_with_salinity ist vielleicht auch in tft_outputs.asm nicht wirklich gut aufgehoben, wenn sie später aus dem ghostwriter.asm aufgerufen wird..
Ralph
Posts: 708
Joined: Saturday 24. June 2017, 11:31

Re: hwOS Header Doku falsch?

Post by Ralph »

Hallo,

ich bin im Ghostwriter-Code gerade nicht zitier-fest und weiß daher nicht auswendig welche der Variablen dort ins Logbuch geschrieben wird, aber der Rechengang im OSTC ist wie folgt:

Absolutdruck vom Sensor - gespeicherter Oberflächendruck = relativer Druck

relativer Druck * Faktor BAR_TO_METER [10.0150] = (interne) Tiefe

Die interne Tiefe wird dann mittels des Salinity-Faktors zur angezeigten Tiefe verrechnet, ebenso einige berechnete Tiefen die gegen die aktuelle Tiefe gehalten ggf. Warnungen zur Anzeige bringen. Insofern ist die Umrechnungsroutine in tft_outputs.asm einigermaßen gut aufgehoben.

Die Sache mit der variierenden Schwerkraft würde ich weglassen, einfach weil der Druckmesswert so viel Genauigkeit gar nicht hergibt. Die Messwerte "rauschen" mit ca. +/- 3 mbar entsprechend +/- 3 cm Tiefe. Da die Anzeige nur bis Dezimeter geht, sieht man es nicht. Und selbst die Dezimeter sind da wo der OSTCs ist, sprich die Hand des Tauchers. Nicht da wo der Hauptteil des Tauchers ist... Es soll ja Taucher geben, bei denen die Tiefen von Kopf und Füßen mehr als 1 Meter weit auseinander liegen... ;-)

Der Temperatur-Sensor ist prinzipbedingt träge, beim Ab- und Auftauchen wird er daher nicht die genaue Tiefe der Sprungschichten ermitteln können. Es sei denn, man taucht mit max. 0,1 Meter/Minute oder so auf und ab.


Viele Grüße,
Ralph
Spacefish
Posts: 32
Joined: Wednesday 30. August 2017, 12:57

Re: hwOS Header Doku falsch?

Post by Spacefish »

Im Logbuch steht effektiv der 16 bit Wert der wie folgt berechnet wird:

relative_pressure_in_mbar * 102 / (salinity_percent+100)


und das ist das was im Logbuch aus ausgegeben wird als Meter Tiefe, es wird lediglich durch 100 geteilt / ein Komma zwei Stellen nach links geschoben.

Der gespeicherte Wert ist also der Tiefenwert in cm heißt aber "Max. depth in mbar".

Im hwos_Interface.odt ist zudem der Hinweis in Note 1 enthalten, dass man den Wert mit der Erdbeschleunigung multiplizieren und durch 1000 teilen soll, was aber falsch ist.

Macht man das würde man einen Wert in mBar erhalten, welcher zwar den salinity faktor enthält nicht aber die Erdbeschleunigung b.z.w. der Wert für einen Planeten mit der Erbeschleunigung 10m/s² statt 9,8m/s²

An sich ist im Code alles richtig, nur die Doku ist falsch. Einmal das dass Feld "Max. Depth in mbar" statt "Max. Depth in cm" heißt und dass die "Note 1" nicht wirklich Sinn macht.
Ralph
Posts: 708
Joined: Saturday 24. June 2017, 11:31

Re: hwOS Header Doku falsch?

Post by Ralph »

Diesen Teil der Doku pflegt Matthias - kommt Zeit kommt Tat, denn im Augenblick wird mit Hochdruck an den neuen Sendern gearbeitet. Aber Danke auf jeden Fall für den Hinweis!!
heinrichsweikamp
Posts: 4370
Joined: Sunday 13. May 2007, 18:07

Re: hwOS Header Doku falsch?

Post by heinrichsweikamp »

Hi,

Danke für den Hinweis, werde ich gleich noch ändern. Ursprünglich wurde das so eingepflegt um die Anzeige im internen Logbuch zu vereinfachen.

Gruß,
Matthias
Post Reply