bin to BCD Umwandlung

#3909304
Lesenswert?

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.
#3909312
Lesenswert?

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
#3909386
Lesenswert?

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.
#3909952
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren