Hallo ich kaufte mir ein KS0066 kombatibles LCD und schrieb folgende Routine zur ausgabe von float: // Float auf Display ausgeben // anz_nk ... Anzahl der Nachkommastellen void lcd_float_ausgeben(float zahl, uint8_t anz_nk) { char d, i = 1; if(zahl < 0) { zahl = fabs(zahl); // Absolutbetrag bilden lcd_daten('-'); // Minus ausgeben falls negativ } while(zahl >= 10) { // Anzahl der Dezimalstellen vor dem Komma zahl /= 10; i++; } anz_nk += i; // Anzahl der notwendigen Schleifendurchläufe while(anz_nk) { // Achtung Compilerfehler wenn man hier while(nk--) schreibt // funktioniert es nicht anz_nk--; i--; d = zahl; // Ziffer speichern zahl = 10 * (zahl - d); // Ziffer löschen, nächste Dezimalstelle lcd_daten(d + 0x30); // Ziffer auf Display ausgeben if(i == 0) lcd_daten(','); // Komma setzen } } Funktioniert schon recht gut aber hat jemand eine Idee für eine Optimierung, diese Routine benötigt sehr viel Speicher. Wie genau ist eigentlich bei AVR Studio die Gleitkommazahl float implementiert (Bitweise)? vielleicht könnte man da etwas einsparen wenn man Bitshift Operationen durchführen kann. Ciao Werner
>> diese Routine benötigt sehr viel Speicher
Lös das Ganze mit Integerarithmetik und laß float weg ;-)) dann klappts
auch mit dem Speicher.
Das Thema wurde xfach besprochen.
Danke für die Hinweise bin aber drauf gekommen, wenn man im AVR Studio unter dem Projekt-Configurations Option-Libraries mit libm.a verlinkt reduziert sich der notwendige Speicher auf etwa die Hälfte bis 1/3. (Zumindest mit meiner Routine) Hätte es nämlich mit den anderen Methoden probiert (sind aber auch sehr Speicher intensiv) und dann durch Zufall drauf gekommen.
> while(anz_nk) { > // Achtung Compilerfehler wenn man hier while(nk--) schreibt > // funktioniert es nicht Ach?
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.