Rechnen mit Kommazahlen in Assembler

Gast #1881537
Lesenswert?

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
Gast #1881608
Lesenswert?

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
Gast #1881609
Lesenswert?

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. ;-)
#1881613
Lesenswert?

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.
Gast #1881614
Lesenswert?

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.
Gast #1881626
Lesenswert?

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
Gast #1881639
Lesenswert?

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
Gast #1881643
Lesenswert?

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.
Gast #1881664
Lesenswert?

> 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.

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