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
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
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
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
@Wolfgang Hopperdietzel Lass doch in den Project Options das Frequenz-Feld einfach leer. Außerdem sind da 800kHz angegeben, warum? Gruss, Bernd
hab ich gemacht auserdem hab ich #include <pgmspace.h> in #include <avr\pgmspace.h> geändert moniert nur noch Timer siehe Anlage By Wolfgang
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 ;-)
@Wolfgang Hopperdietzel Das Original ist für ATtiny25, nicht für den 26. Da wären dann einige Anpassungen fällig. Gruss, Bernd
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
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.
Und wenn man statt
1 | if (val >= 0) notzero++; |
nimmt
1 | if (d > '0') notzero++; |
werden auch die führenden Nullen unterdrückt.
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.