Forum: Projekte & Code Ausgabe von > 8bit-Binärzahlen als ungepackte BCD-Zahlen


von Thomas Strauß (Gast)


Angehängte Dateien:

Lesenswert?

Bei den meisten 8-bit -Controllern gibt es nur einen 
8-Bit-Divisions-Befehl oder gar keinen...

Hat man einen 10bit - AD-Wert auszugeben, kann man diesen nicht
mehr durch 10 teilen, da der Befehl dafür fehlt; die Methode,
Zehner-Ziffern dadurch zu erhalten, geht nur bis zur Dezimal-
Zahl 255; dafür habe ich eine Routine ausgedacht, die prinzipiell
Zahlen bis > 13bit (ca. 11000dezimal) ausgibt, in meinem Programm
bis 1023dezimal!
(Verwendeter Assembler war der Metalink)

von Peter D. (peda)


Lesenswert?

Ich benutze diese Funktion dazu:

http://www.specs.de/~danni/appl/soft/arithmet/adivr10.inc


Ist Bestandteil meiner universellen Arithmetikbibliothek:

http://www.specs.de/~danni/appl/soft/arithmet/index.htm

Verarbeitet 16Bit Zahlen und darüber (bis 640Bit).


Peter

von Thomas Strauß (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute, ich habe das Programm überarbeitet und jetzt auch
den mul AB -Befehl der 8051-Serie angewendet; es können jetzt
Zahlen bis 10755 dezimal umgewandelt werden, danach passen die
Zwischenergebnisse nicht mehr in ein 8-Bit-Register.

von Thomas Strauß (Gast)


Angehängte Dateien:

Lesenswert?

Noch eine Datei, die dasselbe schafft, verlangt aber vom Prozessor
nur den add-Befehl! Geschrieben für die MCS48-Familie von Intel,
kann sie aber auf andere Prozessoren umgeschrieben werden, die
auch nur ein bis zwei Grundrechenarten beherrschen (Z8601, Z80,
6800 etc.), wenn man funktionsgleiche Befehle verwendet.
Die Datei kann direkt in den Simulator 8048.exe - befindet sich
auf der RUESS-CD "Mikrocontroller" geladen und getestet werden.
Vielleicht kann jemand diese Methode der Umwandlung noch auf
größere Zahlenbereiche ausdehnen, wird dann aber sicherlich 
komplizierter!

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Hallo Thomas,

Deine Routinen sind ja ziemlich lang und wohl auch nicht so einfach zu 
verstehen und nicht erweiterbar.


Ich will deshalb nochmal die 2 gebräuchlichsten Methoden vorstellen, im 
Beispiel für 16 Bit Zahlen und auch einfach erweiterbar.


Als erstes die Subtraktionsmethode. Sie ist sehr schnell und auch leicht 
auf den AVR umzuschreiben.

Um den Test, ob eine Subtraktion möglich ist, einzusparen wird einfach 
solange subtrahiert, bis ein Überlauf erfolgt, d.h. einmal zuviel, für 
das nächste Digit wird dann bis zum Überlauf addiert usw. immer im 
Wechsel.

Die Subtraktion kann auch durch Addition des Zweierkomplements erfolgen:

A - B = A + (-B)

Dabei ist dann die Bedeutung des Carry-Flags invertiert, d.h der 
Überlauf erfolgt wenn CY = 0


Beim AVR macht man es dann genau umgekehrt, da der AVR Konstanten nur 
subtrahieren kann:

A + B = A - (-B)


Peter

von Peter D. (peda)


Lesenswert?

Die 2. Methode ist die Division / 10 mit Rest.
Der Rest ist dabei das Digit.

Entweder man dividiert solange, bis das Ergebnis 0 ist oder soviele 
Stellen der Dezimalwert maximal haben kann (5 bei 16 Bit).

Diese Methode verwende ich auch in der oben vorgestellte 
Arithmetikbibliothek.


Das Beispiel hier unterscheidet sich dadurch, daß die Division ohne den 
Divisionsbefehl erfolgt. Somit ist es auch einfach auf den AVR 
umschreibbar.

Eine Erweiterung auf 24 Bit und mehr ist einfach möglich.


Es dauert zwar länger als die Subtraktionsmethode, hat aber den 
kürzesten Kode.


Peter

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Hier das Beispiel dazu.

von Thomas Strauß (Gast)


Lesenswert?

Hallo Peter

Ich habe mir die Routinen adivr10.inc + bcd1.a51 + bcd3.a51 abge-
schrieben und werde sie zuhause abtesten; ich gebe zu, daß meine
Routinen einen Haken haben, sie verarbeiten nur Zahlen bis 10755
und sind auch nicht gerade kurz; die mathematische Methodik ist
auch nicht gerade neu uns sie sind kaum erweiterbar.

Ideal wäre eine Routine, die beliebig erweiterbar ist, mit wenig
Maschinenzyklen auskommt, wenig Speicher benötigt und an den Pro-
zessor keine hohen Ansprüche stellt (keine 
Multiplikation/Division/Subtraktion).

Ist schon im Voraus klar, auf welcher Maschine das Programm laufen
soll, kann besser optimiert werden.

Die Methode, den Dividend durch 10 zu teilen und den Rest als Re-
sultat zu verwenden, ist vielfach beschrieben und ich kenne momentan 
auch keine andere - aber vielleicht gibt es noch andere
Methoden?

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.