Forum: Projekte & Code Formatierte Zahlenausgabe in C


von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Oftmals muß man Zahlenwerte ausgeben.
Mit printf wird jedoch viel Code erzeugt, der auch viel Rechenzeit 
benötigt.
Mit itoa/ltoa kann man nicht die Ausgabeformatierung festlegen, in der 
Regel wünscht man aber eine rechtsbündige Darstellung.
Auch möchte man oft ein Komma in einen ganzzahligen Wert einfügen ohne 
erst die float-Lib einzubinden.


Anbei eine sehr sparsame und universelle Lösung.
Per Definition läßt sich festlegen, ob 32bit oder 16bit Zahlen 
ausgegeben werden sollen.
Als Parameter werden der Wert, die minimale Anzahl Stellen, die Stellen 
hinter dem Dezimalzeichen und der Ausgabepuffer im SRAM übergeben.
Dieses Beispiel habe ich auf dem AVR Attiny25 getestet.

Die Ausgabe der Zahl erfolgt auf ein 2*16 LCD per Timerinterrupt.
Die Ausgabe im Interrupt ist besonders effektiv, da das Main nicht durch 
die LCD-Wartezeiten belastet wird.


Peter

von Frank L. (franklink)


Lesenswert?

Hi Peter,
super Teil, genau das brauchte ich noch für meine Menü- und Dialog 
Bibliothek. Vielleicht bekomme ich das Teil noch bis zum Ende meines 
Urlaubs fertig und kann es hier einstellen bzw. vorstellen.

Gruss
Frank

von Wolfgang H. (hastekene)


Lesenswert?

Hallo Peter,
ich möcht ja nicht unverschämt erscheinen nur fehlt in deinem 
Dateianhang die Datei delay.h kannst du mir die vielleicht noch zukommen 
lassen oder das was mann braucht um die main laufen zu lassen.

bin neu bei der Programmierung in C und GCC

By Wolfgang

von Peter D. (peda)


Lesenswert?

Wolfgang Hopperdietzel wrote:
> ich möcht ja nicht unverschämt erscheinen nur fehlt in deinem
> Dateianhang die Datei delay.h
1
#include <util\delay.h>


Peter

von Wolfgang H. (hastekene)


Angehängte Dateien:

Lesenswert?

Hab ich probiert Erfolg siehe Anlage

By
Wolfgang

von B e r n d W. (smiley46)


Lesenswert?

@Wolfgang Hopperdietzel

Lass doch in den Project Options das Frequenz-Feld einfach leer. 
Außerdem sind da 800kHz angegeben, warum?

Gruss, Bernd

von Wolfgang H. (hastekene)


Angehängte Dateien:

Lesenswert?

hab ich gemacht

auserdem hab ich #include <pgmspace.h> in #include <avr\pgmspace.h>
geändert
moniert nur noch Timer siehe Anlage

By
Wolfgang

von Johann L. (gjlayde) Benutzerseite


Angehängte Dateien:

Lesenswert?

Da sind einige Abhängigkeiten drin und du ziehst dir über die Header 
Zeig, daß du für die Ausgabe nicht brauchst.

Eine entstaubte Version anbei, aber ungetestet ;-)

von Johann L. (gjlayde) Benutzerseite


Angehängte Dateien:

Lesenswert?

...und der Header dazu

von B e r n d W. (smiley46)


Lesenswert?

@Wolfgang Hopperdietzel

Das Original ist für ATtiny25, nicht für den 26. Da wären dann einige 
Anpassungen fällig.

Gruss, Bernd

von Peter D. (peda)


Lesenswert?

Johann L. wrote:
> Eine entstaubte Version anbei, aber ungetestet ;-)

Ja, da sind 2 unschöne Sache drin:

Das Unterdrücken des abschließenden 0-Bytes muß sein, wenn man direkt in 
den Display-RAM schreibt.

Und:
1
 // insert spaces until min length
2
    while (--digits)
3
        *outp++ = ' ';
Wenn dann die Zahl größer ist, als die Anzahl Digits, füllst Du damit 
fast 256 Byte SRAM mit ' '.
Daher habe ich es mit Absicht so geschrieben:
1
  while( --digits >= 0 )
2
    *outp++ = ' ';
Man kann damit auch linksbündig ausgeben, wenn digits = 1 ist.


Peter

von Sven P. (Gast)


Lesenswert?

Wolfgang Hopperdietzel wrote:
> hab ich gemacht
>
> auserdem hab ich #include <pgmspace.h> in #include <avr\pgmspace.h>
> geändert
Mach lieber Schrägstriche anstatt der Rückstriche... kommt bei 
Linux-Tools besser.

von Josef D. (jogedua)


Lesenswert?

Und wenn man statt
1
 if (val >= 0) notzero++;
nimmt
1
 if (d > '0') notzero++;
werden auch die führenden Nullen unterdrückt.

von Markus _. (markush)


Lesenswert?

Paar Jahre her was? :-)

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
Noch kein Account? Hier anmelden.