http://www.cade.utah.edu/~nmcdonal/Tutorials/BCDTutorial/BCDConversion.html FIND DAS GUT, aber ich verstehe es noch nicht. Verwende es jedenfalls als Bin4BCD mit Erfolg. Hat diesen Code schon jemand durchgedacht? Außer dem Erfinder meine ich.
Rudi D. schrieb: > http://www.cade.utah.edu/~nmcdonal/Tutorials/BCDTutorial/BCDConversion.html > > FIND DAS GUT, aber ich verstehe es noch nicht. Verwende es jedenfalls > als Bin4BCD mit Erfolg. > > Hat diesen Code schon jemand durchgedacht? Die Idee ist gut. Die hab ich so auch noch nie gesehen. Der springende Punkt sind die 'Columns'. Damit ist offenbar ein Nibble gemeint, in dem dann die BCD Stellen erzeugt werden. Und da wird die originale Binärzahl von rechts nach links reingeschoben. Allerdings mit einer kleinen Modifikation: Das ist die Sache mit dem 'wenn größer 5, addiere 3". Am Anfang konnte ich nicht viel damit anfangen, bis mir in den Sinn kam, dass 1-mal nach links schieben ja nichts anderes als eine Multiplikation mit 2 ist. Wann müssen wir im Dezimalsystem einen Übertrag in die nächste Stelle machen? Na, wenn das Ergebnis der Multiplikation größer als 9 ist. Das ist genau dann der Fall, wenn eine Stelle größer/gleich 5 ist. Dann wird die nachfolgende Multiplikation mit 2 ein Ergebnis liefern, das größer als 9 ist. In der Systematik berücksichtigt der Algo das dadurch, dass zuvor die 3 addiert werden, die zusammen mit der nachfolgenden Multiplikation mit 2 das BCD richtige Ergebnis liefert. Nette Idee. Wirklich nette Idee.
http://www.mikrocontroller.net/articles/AVR_Arithmetik#Addition_von_.2433 da habe ich das Verfahren schon mal erwähnt
1 | binbcd_loop: subi tBCD0,-0x33 ;add 0x33 to digits 1 and 0 |
2 | sbrs tBCD0,3 ;if bit 3 clear |
3 | subi tBCD0,0x03 ; sub 3 |
4 | sbrs tBCD0,7 ;if bit 7 clear |
5 | subi tBCD0,0x30 ; sub $30 |
6 | subi tBCD1,-0x33 ;add 0x33 to digits 3 and 2 |
7 | sbrs tBCD1,3 ;if bit 3 clear |
8 | subi tBCD1,0x03 ; sub 3 |
9 | sbrs tBCD1,7 ;if bit 7 clear |
10 | subi tBCD1,0x30 ; sub $30 |
11 | subi tBCD2,-0x33 ;add 0x33 to digits 5 and 4 |
12 | sbrs tBCD2,3 ;if bit 3 clear |
13 | subi tBCD2,0x03 ; sub 3 |
14 | sbrs tBCD2,7 ;if bit 7 clear |
15 | subi tBCD2,0x30 ; sub $30 |
aus der MATH32 von Andre Birua
Man multipliziert einmal binär und einmal dezimal mit 2. Dann wird der binäre Übertrag zum Dezimalwert addiert. Nach 8 Durchgängen ist dann das binäre Byte in den Dezimalwert geschoben worden. Die dezimale Multiplikation *2 kann man auch durch dezimale Addition mit sich selbst darstellen. Manche MCs (8051) haben dafür einen dezimal Adjust Befehl. Wenn nicht, dann muß man den Übertrag von Bit 3 bzw. 7 selber korrigieren. Die Methode wird heutzutage kaum noch verwendet, da man mit packed-BCD wenig anfangen kann. Man will lieber einzelne Digits (LCD oder 7S-Anzeige) und dann ist die Subtraktionsmethode kleiner und schneller.
Entpacken von packed BCD ist doch keine große Aufgabe, z.B. mit AND $0F und SWAP, macht das so viel aus?
Karl Heinz schrieb: > Nette Idee. Wirklich nette Idee. Vor allem eine alte Idee. Unter der Bezeichnung "Dreierkorrektur" finde ich den Algorithmus in zwei mittlerweile antiquarischen Standardbüchern zum Thema. Einmal "Arithmetische Algorithmen der Mikrorechentechnik" und auch im Vorgänger "Algorithmen der Mikrorechentechnik" von jeweils Jorke, Lampe, Wengel. VEB Verlag Technik Berlin 1983/1989.
Da sieht man, wie schnell etwas in Vergessenheit gerät. Zum Glück gibt's dieses Forum. LG Rudi
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.