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
Entschuldigung die korrekte Formel lautet: Feuchtigkeit = -2,0468 + 0,0367 * Wert + -0,0000015955 * Wert² gruss andy
> Kommazahlen in Assembler Welcher Assembler? Im X86-Assembler mit 32 Bit Wortbreite ist das signifikant einfacher als beim AVR 8-Bit-uC...
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.
Danke,da hab ich schon nachgeschaut,kriegs aber nicht hin. gruss andy
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.