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
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
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
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.
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
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
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.