Forum: Mikrocontroller und Digitale Elektronik BCD in Binär wandeln (Assembler)


von Feldi (Gast)


Lesenswert?

Hey zusammen
ich suche einen Algorythmus mit dem ich eine BCD Zahl in Assembler in 
eine binäre Zahl wandeln kann.
Hat jemand eine Idee?
Über Pseudocode wäre ich sehr dankbar.

Gruß Feldi
von Karl H. (kbuchegg)


Lesenswert?

(Oberes Nibble um 4 Stellen nach rechts geschoben )* 10 + Unteres Nibble
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Feldi schrieb:
> Über Pseudocode wäre ich sehr dankbar.
Bittesehr:
1
summe = einer*10;
2
summe = summe+zehner*10;
3
summe = summe+hunderter*100;

Und jetzt mußt du nur noch zusehen, dass alles in den gewünschten 
Datentyp passt und dein uC eine passende Multiplikation beherrscht...


BTW: du könntest auch mal sagen, welcher uC/Assembler?
von Feldi (Gast)


Lesenswert?

>>BTW: du könntest auch mal sagen, welcher uC/Assembler?

C167 -->Leider kennen sich hier damit nur sehr wenige aus!
Aber die Antworten helfen mir schon mal weiter..ich hoffe es zumindest!!

Gruß Feldi
von Klaus 2. (klaus2m5)


Lesenswert?

lineare Konvertierung von 1 Byte für AVR
1
            mov   b,a               ;bcd to bin
2
            sbrc  b,4
3
            subi  a,6
4
            sbrc  b,5
5
            subi  a,12
6
            sbrc  b,6               
7
            subi  a,24
8
            sbrc  b,7
9
            subi  a,48
von Karl H. (kbuchegg)


Lesenswert?

Feldi schrieb:
>>>BTW: du könntest auch mal sagen, welcher uC/Assembler?
>
> C167 -->Leider kennen sich hier damit nur sehr wenige aus!
> Aber die Antworten helfen mir schon mal weiter..ich hoffe es zumindest!!

Dann wird es dich sicher freuen, dass man mit 10 multiplizieren kann, 
ohne tatsächlich multiplizeren zu müssen

   gegeben a              zb 7

   zahl verdoppeln          14
   nochmal verdoppeln       28
   a noch dazuzählen        35
   und nochmals verdoppeln  70

voila: mal 10 gerechnet nur durch addition und verdoppeln (was einem 
linksschieben gleichkommt)

Warum funktioniert das?
Weil

    10 * x   = 2 * 5*x = 2 * ( 4*x + x )  =  2 * ( 2 * 2*x + x )
von Feldi (Gast)


Lesenswert?

>>Bittesehr:

>>summe = einer*10;
>>summe = summe+zehner*10;
>>summe = summe+hunderter*100;

Könntest du mir noch bitte ein zahlenbeispiel nennen?
ich benötiges für 16 Bit (1Word)

Gruß Feldi
von Karl H. (kbuchegg)


Lesenswert?

Feldi schrieb:
>>>Bittesehr:
>
>>>summe = einer*10;
>>>summe = summe+zehner*10;
>>>summe = summe+hunderter*100;
>
> Könntest du mir noch bitte ein zahlenbeispiel nennen?

Sicher
0x3241   (also Hexadezimalzahl)

Das ist deine BCD Zahl. Jede Ziffer entspricht der korrespondierenden 
Dezimalziffer.

Einer ->  1
Zehner -> 4
Hunderter -> 2
Tausender -> 3


   1 + 4*10 + 2*100 + 3*1000 -> 3241

stimmt auffallend überein

zur tatsächlichen Berechnung wendet man sinnvollerweise ein Hornerschema 
an. D.h. erst mal einen Faktor 10 herausheben

   1 + ( 4 + 2*10 + 3*100 ) * 10

dann noch einmal *10 herausheben


   1 + ( 4 + ( 2 + 3*10 ) * 10 ) * 10

das man dann eben so anwendet, dass man die einzelnen Ziffern von links 
nach rechts sukzessive immer nur mit 10 multipliziert:

   3           3
* 10   ->     30
+  2   ->     32
* 10   ->    320
+  4   ->    324
* 10   ->   3240
+  1   ->   3241


Während also die Hex-Zahl 0x3241 der Dezimalzahl 12865 entspricht, 
entsteht bei der Verwendung als BCD Zahl tatsächlich auch die 
Dezimalzahl 3241
von Peter D. (peda)


Lesenswert?

Feldi schrieb:
> C167 -->Leider kennen sich hier damit nur sehr wenige aus!

Der kann doch MUL und DIV, einfach mal ins Manual schauen.


Peter
von Harald M. (mare_crisium)


Lesenswert?

Lothar Miller schrieb:
> Bittesehr:summe = einer*10;
> summe = summe+zehner*10;
> summe = summe+hunderter*100;

Anders herum wird ein Schuh 'draus :-)

summe = hunderter
summe = 10*summe + zehner
summe = 10*summe + einer

mare_crisium
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.