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)
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
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.
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!
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.