mikrocontroller.net

Forum: Projekte & Code Ausgabe Binärzahl 8, 16, 24 und 32Bit auf LCD!


Autor: Andi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Habe ein paar "kleine" Routinen zur Ausgabe von Binärzahlen in den
größen 8, 16, 24 und 32Bit in ASM entwickelt.
Die Routinen beherschen die sogenannte "Print Using"-Funktion, also
das bei Ausgabe z. B. einer 16Bit-Zahl die Anzahl der Stellen von 5 bei
Werten von 0 bis 65535 immer gleich bleibt.
Dabei werden führene Nullen (0) durch Leerzeichen ersetzt.
Durch setzen von Bit 4 im Register BCDFlag läßt sich das auch
abschalten und eine 3 benutzt dann nur eine und 123 benötigt dann 3
Stellen.
Desweiteren kann man in BCDFlag im unteren Nibble die Anzahl der
Kommastellen angeben was ja in ASM ohne Float-Routinen recht schwer
ist.
Möchte man z. B. eine Binärzahl mit 4 Stellen (0-9999) ausgeben wo bei
die unteren 2 Stellen die Kommastellen sind lädt man in BCDFlag einfach
2 und ruft die Routine PrintBCD16 auf.
Man kann auch mit Ausgabe einer 32Bit-Zahl 9 Kommastellen festlegen ist
aber eher Unsinn und ginge dann auch nur bis 4,294967295.
Parameter:
In Register Z übergibt man die Adresse der Binärzahl im SRAM.
In Register BCDFlag (r19) an Bit 4 ob Print Using an (0) oder aus sein
soll (1) und im unteren Nibble die Anzahl der Kommastellen von 0
(keine) bis 2, 4, 7 oder 9 (je nachdem, welche BCD-Funktion aufgerufen
wird).

Ein paar Beispiele:
Ausgabe einer 16Bit Zahl wobei die unteren beiden Ziffern als
"Kommastelle" fungieren:

 ldiwz BCDZahl          ;macro ist in "BCD-Macros.inc" im Anhang.
 ldi   BCDFlag,0x02     ;Print Using an und 2 Kommastellen.
 rcall PrintBCD16       ;Binärzahl ausgeben.
.dseg
BCDZahl .byte 2

Ausgabe einer 24Bit Zahl wobei die unteren 3 Ziffern als
"Kommastelle" fungieren und ohne "Print Using":

 ldiwz BCDZahl          ;macro ist in "BCD-Macros.inc" im Anhang.
 ldi   BCDFlag,0x13     ;Print Using aus und 3 Kommastellen.
 rcall PrintBCD24       ;Binärzahl ausgeben.
.dseg
BCDZahl .byte 3

Die Routinen PrintBCD8, ...16 ...24 sind abhängig von PrintBCD32 da
dort entsprechende Einsprungpunkte sind wegen der Code-Effezience.

Eine Routine wie "PrintCode" muß von euch enthalten sein da ich euch
meine nicht unbedingt aufzwängen will (geht über einen LCD-Buffer mit
Verschiebung der Spalte zum Text rollen).
Diese muß einfach nur auf irgend eine Art und Weise ein Zeichen auf dem
LCD oder in euren LCD-Buffer ausgeben können.
Es ist noch darauf zu achten, das Ihr vor dem Aufruf einer der
BCD-Routinen in eurem LCD oder LCD-Buffer-Routinen noch die
Anfangsposition der BCD-Ausgabe festlegen müßt.
Eure PrintCode-Routine sollte, wenn mit Buffer im SRAM, auch die
Spalten-Nr. erhöhen.

Falls es Register-Konflickte gibt, sind die leicht in dem
.def-Abschnitt änderbar. Nur r18, was bei mir ein unbenutztes
"Vielzweckregister" ist, muß man bei der Routine PrintBCD32 anpassen
wenn erfoderlich.

Gruß
Andi

Autor: Andi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Anhang die neue Version von BCD8-32!
Das mit dem Register r18 zur Prüfung der Kommastelle entfällt jetzt und
es wird mit einem von der Routine bereits genutzten Register BCDTemp =
r20 gemacht.
r20 ist somit ein "Shared Register".
Somit sind nun die Register r17 und r18 frei falls Ihr diese für die
Zeichenausgabe, z. B. lcd_data aus dem TUT (Temp1, Temp2 und Temp3),
verwendet.

Gruß
Andi

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Wie ich sehe, haben sich schon ein paar Leute die Routine geholt und
vielleicht auch ausprobiert.
Würde mich über eine Resonance freuen.
Bin auch am grübeln, wie ich das mit "echter" Binär/BCD-Wandlung
beschleunigen kann ohne viel zu subtrahieren.
Bis jetzt bin ich darauf gekommen, das man sich von unten nach oben mit
einem Versatz von 6 Nibble für Nibble hoch arbeiten muß.
Mal sehen, was da raus kommt.

Gruß
Andi

Autor: smartie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht leider nirgendwo, für welchen Prozessor das ganze sein soll.
Ein Anzeige in Binärzahlen ist aber sehr schwer ablesbar, mir
sind Dezimalzahlen jedenfalls lieber.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze ist für die AVR´s mit SRAM und LCD.
Es wird ja umgewandelt in BCD, Dual- nach Dezimalsystem, und jede
Ziffer sofort ausgegeben. Eine "PrintOut"-Routine zur Zeichenausgabe
muß von euch kommen bzw. könnt das z. B. ändern in lcd_data.
In r16 steht der ASCII für die Ziffer bereit.
Ließ oben noch mal, da ist ein kleines Beispiel.

Gruß
Andi

Autor: Andi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Habe eine neuere Version!
Die neue Version ist nun auch in der Lage, Zahlen mit Vorzeichen
auszugeben.
Bei negativen Zahlen wird vor der Zahl ein "-" ausgegeben und bei
positiven ein Leerzeichen.
Das Komma (",") für die Kommazahlen habe ich durch einen Dezimalpunkt
(".") ersetzt.
Ausserdem kann man ein Anzeigen der "Vornullen", z. B. "00364"
aktivieren.

Hier noch mal das BCDFlag mit seinen Funktionen:
 Bit 6 = 1 = Vornullen-Anzeige ein.
 Bit 5 = 1 = Vorzeichen-Ausgabe (Signed) ein.
 Bit 4 = 1 = Print-Using (Rechtsbündig) aus. Standard (0) = Print-Using
an.
 Bit 3 bis 0 = Anzahl der Kommastellen also die Position des
Dezimalpunktes von rechts.

Bei Ausgabe mit Vorzeichen muß man darauf achten, das die Ausgabe für
das Vorzeichen, "-" oder Leer, ein Zeichen mehr benötigt, ausser bei
24Bit-Zahlen da sich bei denen mit Vorzeichen die Anzahl der möglichen
Ziffern um 1 verringert (-8388608 bis 8388607 statt 0 bis 16777215).
Ansonsten erfolgt der Aufruf wie oben beschrieben.

Gruß
Andi

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.