Wie kann ich eine Festkommazahl (Beispiel 8 Bit: 0110 1000 == 0.8125)
als ASCII-String ("0.8125") ausgeben? Gibt es im AVR-GCC dazu eine
Funktion?
Hallo, je nach Controller hätte ich wenig Hemmungen vorher in ein float zu wandeln mfg
DerDan schrieb: > Hallo, > > je nach Controller hätte ich wenig Hemmungen vorher in ein float zu > wandeln > > mfg Das ist für mich keine Lösung, da die Float-Library für meinen ATTiny2313 einfach zu groß ist.
Markus schrieb: > (Beispiel 8 Bit: 0110 1000 == 0.8125) Bei diesem Beispiel (Kommastelle ist zwischen D7 und D6) kannst Du 104 (=b110 1000) * 10000 / 128 = 8125 rechnen, Ergebnis mit itoa in einen String wandeln und "0." vor diesen String hängen. Ob es da etwas eleganteres gibt weiß ich nicht :-( Gruß Dietrich
Dietrich L. schrieb: > Markus schrieb: >> (Beispiel 8 Bit: 0110 1000 == 0.8125) > > Bei diesem Beispiel (Kommastelle ist zwischen D7 und D6) kannst Du > 104 (=b110 1000) * 10000 / 128 = 8125 rechnen, > Ergebnis mit itoa in einen String wandeln und "0." vor diesen String > hängen. > > Ob es da etwas eleganteres gibt weiß ich nicht :-( > > Gruß Dietrich Vielen Dank.
Hi, Die 10000 ist leider nicht richtig! 1/128 ist 0,0078125, demnach wäre 1 => 10000000 ....kannst Du 104 (=b110 1000) * 10000000 / 128 = 8125000 rechnen..... Oder vertue ich mich da?
Das Originalbeispiel von Dietrich ist richtig: 104 * 10000 / 128 = 8125 Ich habe die 3stellige Ausgabe gewählt und Divisor und Dividend gekürzt, dann passt das Zwischenergebnis, wenn FP = 0111 1111, in eine 16-Bit Variable. Beispiel: 104 * 125 / 16 = 812,5
Markus schrieb: > Das ist für mich keine Lösung, da die Float-Library für meinen > ATTiny2313 einfach zu groß ist. Dann mach es doch selbst und zu Fuß: 1. pack deine 8 Bit Zahl in eine 16 Bit Zahl. Nennen wir sie hier mal ZETT. 2. starte deinen Ergebnis-String mit "0." 3. multipliziere die Zahl mit 10 4. nimm den High-Teil der Zahl als Ziffer ( Ziffer = '0' + (ZETT>>8; ) und füge sie an deinen Ergebnis-String an 5. entferne den High-Anteil ( ZETT = ZETT & 255; ) 6. wiederhole 3..5 so oft du willst W.S.
(Beispiel 8 Bit: 0110 1000 == 0.8125) aus dem 1. Beitrag
"0."
0x68 * 10 = 0x410
'0' + High(0x410) -> "0.4"
(0x410) & 0xFF = 0x10
0x10 * 10 = 0xA0
'0' + High(0xA0) -> "0.40"
(0xA0) & 0xFF = 0xA0
0xA0 * 10 = 0x640
'0' + High(0x640) -> "0.406"
(0x640) & 0xFF = 0x40
0x40 * 10 = 0x400
'0' + High(0x400) -> "0.4064"
(0x400) & 0xFF = 0x00
Wo liegt mein Fehler?
Vielleicht daß die FixP-Zahl nicht bis fast 1 (0.8) sondern bis fast 2 (1.7) geht und deshalb auch das Ergebnis der Rechnung mit Annahme "fast 1" nur die Hälfte ist. In Klammern jeweils das FixPoint-Format.
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.