mikrocontroller.net

Forum: Projekte & Code Formatierte Zahlenausgabe in C


Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfgang Hopperdietzel (hastekene)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang Hopperdietzel wrote:
> ich möcht ja nicht unverschämt erscheinen nur fehlt in deinem
> Dateianhang die Datei delay.h

#include <util\delay.h>


Peter

Autor: Wolfgang Hopperdietzel (hastekene)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich probiert Erfolg siehe Anlage

By
Wolfgang

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Wolfgang Hopperdietzel

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

Gruss, Bernd

Autor: Wolfgang Hopperdietzel (hastekene)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Johann L. (gjlayde) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
...und der Header dazu

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Wolfgang Hopperdietzel

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

Gruss, Bernd

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:

 // insert spaces until min length
    while (--digits)
        *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:

  while( --digits >= 0 )
    *outp++ = ' ';

Man kann damit auch linksbündig ausgeben, wenn digits = 1 ist.


Peter

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Josef D. (jogedua)
Datum:

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

Autor: Markus _neu (markush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paar Jahre her was? :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.