Hallo. Ich suche einen Weg die Funktion dtostrf platzsparender unterzubringen. Die Funktion dtostrf ist dafür da, einen Float-Wert in einen Ascii-Wert umzurechnen, damit er bspw. auf einem LCD wiedergegeben werden kann. Da ich Einsteiger in Sachen MC bin wollte ich mal fragen, ob es möglich ist diese Funktion mit wenigen Befehlen selbst zu schreiben... der Platzbedarf im Speicher des MCs ist nämlich enorm. Anwendung: Ich messen ein Spannung am ADC und möchte diesen im mV Bereich auf einem LCD ausgeben. Da das Programm recht groß ist komme ich langsam an die Grenzen des Speichers... Vielen Dank für eure Antworten, Alex
Gast
#576680
Das kommt ein wenig darauf an, welchen µC im Einsatz ist und wie dein float-Typ aufgebaut ist. Vielleicht hast Du ja noch ein paar weitere Informationen.
Natürlich. Ich benutze einen AtMega8538
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
Alexander L. wrote:
> Ich suche einen Weg die Funktion dtostrf platzsparender unterzubringen.
Diese Funktion benötigt die float Library und diese ist so
speicherintensiv (AVR-GCC: etwa 2kB).
Wenn der Speicher knapp wird, mußt Du nen größeren nehmen oder in int
(long) rechnen.
Z.B. um 2 Nachkommastellen anzuzeigen, zu Anfang mit 100 multiplizieren
und dann für die Ausgabe x/100 bzw. x%100 (positive Zahlen).
Peter
Peter Dannegger wrote: >Z.B. um 2 Nachkommastellen anzuzeigen, zu Anfang mit 100 multiplizieren >und dann für die Ausgabe x/100 bzw. x%100 (positive Zahlen). Hallo Peter! Erst mal Danke für Deine Hilfe! Wie meinst Du das genau? Entsteht durch x/100 nicht wieder ein Float-Wert? Vielleicht verstehe ich nicht, was Du meinst.
1 | |
2 | |
3 | |
4 | |
5 | |
Gruß, Alex
In dem Du eine Int-Anzeige machst, aber in den erzeugten String an der passenden Stelle einen Dezimalpunkt einfügst.
aaah - jetzt verstehe ich es. float Spannung int Ganzzahlteil Spannung=100,23mV Ganzzahlteil=Spannung Ausgabe Ganzzahlteil + "." Spannung=Spannung-Ganzzahlteil Spannung=Spannung*100 Ausgabe Spannung Vielen Dank! Ihr habt mir echt weitergeholfen!
Jetzt hast du ja wieder float drin. Das ganze ist eher so gemeint, dass du statt float nen ganzzahligen Typen verwendest, nur dass du zum Beispiel "3,45V" zum Beispiel als "3450mV" "abspeicherst". Da ist kein Komma drin, ergo auch kein float nötig. In deiner anzeigen Routine musst du jetzt nur regeln, dass nach der dritten Stelle von Hinten ein Komma eingefügt wird. Schon wird aus dem als mV abgelegten Wert, wieder ein Kommawert mit der Einheit Volt. PS: Um das nochmal klar zu machen: Nicht dtostrf braucht viel Speicher, sondern die Float-lib. Die holst du dir sofort ein, wenn du eine float-Variable deklarierst, die nicht im Vorhinein (während des Kompilierens) bestimmt werden kann und zur Laufzeit ausgerechnet werden muss.
Nein, eher so: int Spannung; int Vorkomma; int Nachkomma; Spannung = 10023; Vorkomma = Spannung / 100; Nachkomma = Spannung % 100; Ausgabe Vorkomma + "." Ausgabe Nachkomma (mit führenden Nullen!)
Simon Küppers wrote: > Jetzt hast du ja wieder float drin. > > Das ganze ist eher so gemeint, dass du statt float nen ganzzahligen > Typen verwendest, nur dass du zum Beispiel "3,45V" zum Beispiel als > "3450mV" "abspeicherst". Da ist kein Komma drin, ergo auch kein float > nötig. In deiner anzeigen Routine musst du jetzt nur regeln, dass nach > der dritten Stelle von Hinten ein Komma eingefügt wird. Schon wird aus > dem als mV abgelegten Wert, wieder ein Kommawert mit der Einheit Volt. > > PS: Um das nochmal klar zu machen: Nicht dtostrf braucht viel Speicher, > sondern die Float-lib. Die holst du dir sofort ein, wenn du eine > float-Variable deklarierst, die nicht im Vorhinein (während des > Kompilierens) bestimmt werden kann und zur Laufzeit ausgerechnet werden > muss. Da habe ich was anderes festgestellt. Wenn ich die dtostrf-Funktion drinnen habe sind nach dem Compilieren 98,5% belegt - wenn ich diese rausnehme und durch mein oben genanntes Beispiel ersetzte bin ich bei 85,5%.
Die Prozentangaben sagen nichts*, hier zählen absolute Werte. Hast Du Dir mal die von mir gepostete reine Int-Version angesehen? *) bei einem Mega8 sind 95% was anderes als bei einem Mega128 ...
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.