mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rechnen mit Kommazahlen in Assembler


Autor: andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung die korrekte  Formel lautet:


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

gruss
andy

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,ich hab hier einen mega8 also 8bit.

gruss
andy

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: DerGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: andy (Gast)
Datum:

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

gruss

andy

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AssemblerFreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AssemblerFreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ganzzahlen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AssemblerFreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: andy (Gast)
Datum:

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

gruss

andy

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.