PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BCD in Hexa umwandeln



BIG Muzzy
18.06.2006, 19:12
Hi
Wir arbeiten in der Schule im Moment mit Assembler und Amtel Prozessoren.
Mein Leher gab mir die Aufgabe einen 4 stelligen BCD-Hex Wandler zu porgrammieren.


mein erster Ansatz wäre nun dieser gewesen:
583 in Hex:
583 / 16 = 36 Rest 7
36 / 16 = 2 Rest 4
2 / 16 = 0 Resr 2

Hex: 247

Dann is mir eingefallen,dass ich ja nicht dividieren kann,da es eine dez zahl ist,und das Ergbniss nicht stimmen würde.

hatt wer eine Idee wie man diese Aufgabe lösen könnte?


mfg

BIG_Muzzy

Madgyver
18.06.2006, 19:59
Du ziehst von der Zahl 583 die Zahl 16 ab und zählst wie oft das geht. Die Anzahl, "wie oft es geht" ist dein Ergebnis ganzahliger Division und das was übrig bleibt ist... joar das was übrig bleibt, der Rest halt. Das Schwänzen was du für die Hexzahl brauchst.

teslanikola
18.06.2006, 20:43
Dividieren duch 2erPotenzen ist easy: einfach Binär nach rechts schieben ( shiften ), mit mahl 2erPotenzen eifach ein leftshift ;-)
Können neue MEGAS nicht Dividieren? also Multipizieren können sie aber Div?

dennisstrehl
18.06.2006, 21:06
Die Megas können nicht dividieren und werden es wohl auch nie können, für sowas sind DSPs zuständig.
Die AVR32-er können das wahrscheinlich (sind ja DSPs), aber die haben mit den alten AVRs außer dem Namen nicht viel gemein.

Wenn du BCDs in Binärwerte umwandeln willst (im Grunde macht es keinen Unterschied ob binär oder hexadezimal: Die Schreibweise im Prozessor ist immer binär, nur im Programmtext werden die Binärzahlen durch hexadezimalwerte ersetzt um's übersichtlicher zu machen), würde ich mir nacheinander die 4 Bits von jeder Stelle nehmen und ne Art for-Schleife bauen. Diese wird so oft durchlaufen, wie die jwlg. Ziffer groß ist. Bei jedem Durchlauf wird ne 1 für die 1er-Stelle, ne 10 für die 10er-Stelle usw. zuu nem Ergebnisregister addiert.
Das muss halt für jede Stelle ein mal gemacht werden, danach hast du das Ergebnis in angesprochenem Ergebnis-Register liegen.

MfG

BIG Muzzy
18.06.2006, 21:30
Danke für eure Antworten

Also eine einfache schnelle Möglichkeit gibt es da wohl nicht.
Werde eure Vorschläge mal versuchen umzusetzten.

Hatte auch die Idee das über eine Tabelle zu machen,mit 2 stellen is das machbar, aber für 4 sind es einfach zu viele Möglichkeiten.

mfg

BIG_Muzzy

PICture
18.06.2006, 22:36
Hallo BIG Muzzy!

Ich bin leider ein PIC user und kenne die Befehle der Atmel Prozessoren nicht. Am einfachsten geht dividieren durch 16 mit swapen von nibbles.

MfG

Madgyver
18.06.2006, 22:49
Gute idee, bin gar nicht drauf gekommen weil ich es zu fuss gemacht hab. Mit

swap 'registername'

lassen sich die nibbles vertauschen, das entspricht 4 shifts bzw. eine binäre division durch 16.

PicNick
19.06.2006, 09:03
Moment mal, ich glaub ihr überseht, daß er ja eine BCD-Zahl kriegt.
Die schaut dann z.B. so aus
0x00583
um das umzuwandeln, muß er MULTIPLIZIEREN
5 * 100 + 8 * 10 + 3
0x0064 * 5 = 0x01F4
0x000A * 8 = 0x0050
0x0001 * 3 = 0x0003
--------------------------
.................= 0x0247