Integer Zahl möglichst effizient auf Display ausgeben

OP #3162103
Hallo C-Gemeinde,

ich möchte einen Integer Wert möglichst effizient auf einem LCD 
ausgeben. Zum Thema "Zahl bearbeiten" habe ich auch schon viel gelesen, 
leider weiss ich nicht genau wie effizient die einzelnen Methoden 
(Division (Modulo), itoa etc.) sind.
Es handelt sich dabei z.B. um einen Wert von "25123456" (Temperatur) der 
auf dem Display "25.12" anzeigen soll. Die Display Ausgabe erfolgt ohne 
Bearbeitung der Zahlen mit sprintf wie folgt:

char data[10];
sprintf(data,"%i",value);
LCD_Print(data, ...);

Eine Möglichkeit wäre den Wert mittels itoa in einen String zu wandeln 
und dann das Komma an ensprechender Stelle einzufügen, dass würde dann 
etwa so aussehen:

char data[10];
itoa(value, data, 10);
char string[10];
string[0] = data[0];
string[1] = data[1];
string[2] = '.';
string[3] = data[2];
string[4] = data[3];
string[5] = '\0';
char str[10];
sprintf(str,"%s",string);
LCD_Print(data, ...);


Ich bin mir sicher Ihr kennt da noch elegantere Methoden. Ist es evtl. 
sinnvoller einen cast und Division (mit Modulo) durchzuführen? Mir geht 
es um eine möglichst effiziente Lösung, da die Schaltung unteranderem 
auch per Batterie versorgt wird.

Danke schon mal für eure Inputs!
Chris S. schrieb:
> Mir geht
> es um eine möglichst effiziente Lösung, da die Schaltung unteranderem
> auch per Batterie versorgt wird.

Die Effizienz spielt für den schnarch langsamen Menschen überhaupt keine 
Rolle. Du merkst keinerlei Stromeinsparung.
Eher kann die benötigte Flash-Größe der Routine eine Rolle spielen.
OP
@peda:
Mit Effizienz dachte ich eigendlich an die Anzahl Rechenschritte und 
auch Rechenoperationen (z.B. Division), die der Prozessor benötigt. Je 
aufwändiger die Berechnung desto mehr Leistung benötigt der uP.
Flash Speicher ist genügend vorhanden.

@prx:
Danke funktioniert soweit. Kannte die Funktion ldiv nicht.
Moderator
Wie schnell ändert sich die Temperatur? Sicher nicht sehr schnell.
Deswegen muss die Temperatur auf dem Display auch nicht im
Millisekundentakt aktualisiert werden, sondern es reicht vielleicht ein
Update alle 10 s aus. Die dazu benötigte mittlere elektrische Leistung
dürfte auch bei einem schlecht gewählten Algorithmus je nach Größe und
Typ der Batterie in der Größenordnung der Selbstentladung derselben
liegen.
Gast
Ich würde das in Assembler programmieren. Das geht am schnellsten, spart 
also am meisten Energie.
Alternativ geht auch ein Bimetallthermometer. Das kommt ganz ohne 
Energie aus.
Chris S. schrieb:
> Je
> aufwändiger die Berechnung desto mehr Leistung benötigt der uP.

Wie schon gesagt, alle Berechnungen für den langsamen Menschen müssen so 
selten gemacht werden, da ist kein Leistungsunterschied meßbar, das sind 
vielleicht einige ppm.

Ein Mensch braucht aus Sicht der CPU enorm viel Zeit, um einen Wert 
abzulesen.
Chris S. schrieb:
1
 char data[10];
2
 itoa(value, data, 10);
3
 char string[10];
4
 string[0] = data[0];
5
 string[1] = data[1];
6
 string[2] = '.';
7
 string[3] = data[2];
8
 string[4] = data[3];
9
 string[5] = '\0';
10
 char str[10];
11
 sprintf(str,"%s",string);
12
 LCD_Print(data, ...);

Zum optimieren erstmal überlegen, warum das ganze so umständlich ist:
das ganze String-hin-und-herkopieren, das unnötige sprintf dazu usw, 
machst du nur, damit deine LCD_Print methode einen String als Parameter 
bekommt.
Was macht LCD_Print? Den String zeichenweise ans Display schicken. Das 
kannst du auch selber.
Also: statt LCD_Print direkt zeichenweise ausgeben. Spart den ganzen 
Hickhack.
1
 char data[10];
2
 itoa(value, data, 10);
3
 LCD_PrintChar(data[0]);
4
 LCD_PrintChar(data[1]);
5
 LCD_PrintChar(',');
6
 LCD_PrintChar(data[2]);
7
 LCD_PrintChar(data[3]);

(Bonus-Aufgabe: Temperaturen < 10° richtig anzeigen, "<space>5,67")

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.