mikrocontroller.net

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


Autor: Thomas Strauß (Gast)
Datum:
Angehängte Dateien:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Thomas Strauß (Gast)
Datum:
Angehängte Dateien:

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

Autor: Thomas Strauß (Gast)
Datum:
Angehängte Dateien:

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

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

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

Autor: Peter Dannegger (peda)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Hier das Beispiel dazu.

Autor: Thomas Strauß (Gast)
Datum:

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

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.