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
(Oberes Nibble um 4 Stellen nach rechts geschoben )* 10 + Unteres Nibble
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?
>>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
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 |
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 )
>>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
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
Feldi schrieb: > C167 -->Leider kennen sich hier damit nur sehr wenige aus! Der kann doch MUL und DIV, einfach mal ins Manual schauen. Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.