Forum: Mikrocontroller und Digitale Elektronik Rechnen mit Kommazahlen in Assembler


von andy (Gast)


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

von andy (Gast)


Lesenswert?

Entschuldigung die korrekte  Formel lautet:


Feuchtigkeit = -2,0468 + 0,0367 * Wert + -0,0000015955 * Wert²

gruss
andy

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>  Kommazahlen in Assembler
Welcher Assembler?
Im X86-Assembler mit 32 Bit Wortbreite ist das signifikant einfacher als 
beim AVR 8-Bit-uC...

von andy (Gast)


Lesenswert?

Hallo,ich hab hier einen mega8 also 8bit.

gruss
andy

von Falk B. (falk)


Lesenswert?


von DerGast (Gast)


Lesenswert?

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.

von andy (Gast)


Lesenswert?

Danke,da hab ich schon nachgeschaut,kriegs aber nicht hin.

gruss

andy

von spess53 (Gast)


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

von AssemblerFreak (Gast)


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

von Detlev T. (detlevt)


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.

von AssemblerFreak (Gast)


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.

von Anja (Gast)


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

von Reinhard Kern (Gast)


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

von ganzzahlen (Gast)


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.

von AssemblerFreak (Gast)


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.

von andy (Gast)


Lesenswert?

Hallo,vielen Dank für die zahlreichen antworten.
Werd jetzt mal versuchen das umzusetzen und zu verstehen.

gruss

andy

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.