Hallo,ich sitze hier vor meinem SHT71(Temperatur und
Luftfeuchtigkeitssensor) und komme einfach nicht weiter.
Werte kann ich abholen,Temperatur auch richtig berechnen.
Mein Problem ist die Berechnung der Luftfeuchtigkeit.
Der abgefragte Wert ist 12bit groß.
Nun mein Problem,die umrechnung.
Die Formel lautet:
Feuchtigkeit = -2,0468 + 0,0367 * Wert + 0,0000015955 * Wert²
Den Wert zu quadrieren hab ich hinbekommen,nur das Rechnen mit den
Kommazahlen klappt nicht.Habe schon einige Seiten gelesen aber nicht
verstanden.Könnte mir das jemand verständlich erklären?
Bitte nicht einfach ein fertiges Programm posten,ich möchte verstehen
wie es geht.
Danke im voraus.
andy
Falk Brunner schrieb:> Siehe Festkommaarithmetik
Assembler war gefragt
Falls dir 8 Bit Auflösung reichen würde, köntest du dir eine Tabelle
anlegen.
Ansonsten mal bei Atmel schauen da gibt es (glaub) Appnotes dazu.
Hi
Die FMUL..-Befehle lassen sich auch auf z.B. 16x16 Bit erweitern
(App-Note AVR201)
Dezimale Konstanten <1 lassen sich im Assembler2 mit Q7 bzw. Q15 in FMUL
verträgliche Binärzahlen verwandeln. Anwendung in etwa so:
....
ldi r22, Low(Q15(0.0314))
ldi r23,High(Q15(0.0314))
call fmuls16x16_32
MfG Spess
Festkommaarithmetik in Assembler, heisst das Stichwort.
Recht aufwändig, aber machbar. Ich habe mir so ein Paket
gebastelt, aber zumuten würde ich das niemandem.
Wenn eine Ausgabe ohne Nachkommastelle genügt - Nachkomma-
stellen sind m.E. bei Feuchtigkeitsmessungen ohnehin frag-
würdig -, dann wären das ja gerade mal 100 Werte. Da scheint
der Vorschlag mit einer Tabelle gar nicht mal so falsch.
Würde ich ernsthaft in Erwägung ziehen, statt in Assembler
ein Festkommaarithmetik-Paket einzubinden.
C wurde ja nicht gefragt. ;-)
Es gilt ja z.B:
-2,0468 + 0,0367 * Wert + -0,0000015955 * Wert² =
(65536 * (-2,0468 + 0,0367 * Wert + -0,0000015955 * Wert²)) / 65536
Die Klammer (65536 * ...) muss du noch ausmultiplizieren. Dann bekommst
ganze Zahlen als Näherungswerte. Sinnvoll ist natürlich eine
Zweierpotenz (z.B: halt 65536) als Erweiterung, weil man da die Division
vermeidet. Man wählt am besten einen Wert, wo man bei 32-Bit keinen
Überlauf bekommen kann.
Mit 8-Bit Arithmetik kommst du da natürlich nicht weiter.
Eine Tabelle für 0..100% nimmt gerade mal 200 Byte Flash
in Anspruch (bei 16-bit-Werten). Schnell und effizient
und in Assembler eine lockere Übung. Allemal schneller
und auch kompakter als die Formel in Assembler umzusetzen.
Hallo,
versuch mal folgenden Ansatz:
Stell dir den Wert 0..4095 (um 4 Bits links geschoben) als 0 .. 0,999x
vor.
dadurch werden die Koeffizienten besser handhabbar.
aus 0,0367 wird 150,3232 = 0x96,53 (mit 16 Bit Genauigkeit)
aus 0.0000015955 wird 26.768048128 = 0x1A,C5
Du brauchst für die Quadrierung und für die Multiplikation jeweils eine
16x16 Bit unsigned Multiplikation mit 32 Bit Ergebnis. (Das
Zwischenergebnis ggf. passend Runden).
Gruß Anja
Hallo,
ja, Assembler ist gefragt - es ist aber trotzdem Unsinn, Dinge neu zu
erfinden, die vor 50 Jahren schon gelöst waren. Fliesskomma-Arithmetik
gibt es als Assembler-Source und als Library, vor allem in
Software-Museen, aber da eine Library i.d.R. so gut ist wie eine andere,
nehme ich einfach die benötigten Math-Routinen (möglichst nur genau die
benötigten) aus der Library eines C- oder Pascal-Compilers.
Der Einwand, dass Assembler gewünscht wird und nicht C, ist völlig
unsinnig: die Fliesskommaroutinen einer embedded Library sind in der
Regel Assembler.
Gruss Reinhard
Oder wenn er unbedingt rechnen will:
(1341390+24050*Wert-Wert^2)/65536-45
gibt dann Ergebnisse zwischen 0-1000, also eine Nachkommastelle die man
aber eh wegwerfen kann. Der Fehler ist denk ich mal vernachlässigbar.
> Der Einwand, dass Assembler gewünscht wird und nicht C, ist völlig> unsinnig: die Fliesskommaroutinen einer embedded Library sind in der> Regel Assembler.
Das wissen wir hier alle.
War gar nicht der Punkt.