PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Aufgabenstellung für eine Prüfung



Atax62
15.01.2007, 13:56
HI, erstaml sorry für Doppelposting, aber im Programmierbereich schaut kaum wer durch. Ich brauch das Dringend für eine Prüfung in der Schule.
original:https://www.roboternetz.de/phpBB2/viewtopic.php?t=26789

Könnt ihr mir bitte helfen, ich hab da ein seeeeehr großes Problem.

Hab ende diese Woche eine Prüfung in uC programmieren.

Ich bin nun auf zahlreiche Aufgabenstellungen gestoßen, bei denen verschiedene Zahlen-Formate konvertiert werden sollen.
zb bin=>dez, okt=>hex usw,...

bein grösstes Problem ist nun, ich habe keine Ahnung wie man eine 4 stellige BCD zahl in eine Hex umwandeln kann.

Das Programm soll laut Prof. in wenigen Zeilen programmiert sein.

Die BCD Zahlen kann ich aus den Registern hohlen: zb. für die ziffer 2345: r1=23 r2=45
Wir verwenden folgenden Prozessor: 80C51X

Könnt ihr mir bitte Helfen.
kennt vielleicht Jemand eine Seite wo solche Konvertierungen erklärt werden?

Vielen Dank für die Hilfe

mfg

atax62

kalledom
15.01.2007, 14:07
Hallo,
Erklärungen zu Zahlensystemen findest Du hier (http://www.domnick-elektronik.de/elekzasy.htm).

Atax62
15.01.2007, 14:50
hallo,
Zahlensysteme kenne ich eh nur die Umwandlung in Assembler macht mir Probleme

kalledom
15.01.2007, 15:06
Dann verstehe ich Dein Problem nicht so ganz.
Der µC speichert Bits ab, entweder als Byte (8 Bit) oder Word (16 Bit), teilweise auch als Double-Word (32 Bit).
Intern mußt Du auf nichts aufpassen, weder beim Addieren, noch sonst wo.
Wenn Du 2 Speicher-Variablen addierst, in denen 10 und 20 steht, ist nach dem Additions-Befehl das Ergebnis 30. Daß dieses Ergebnis in der µC-Hardware als Bits abgelegt ist, interessiert niemanden wirklich.

Zum Tragen kommt dieses 'Format' erst, wenn ein Wert raus oder rein soll, und zwar so, daß wir es als Dezimal-Zahl wieder verstehen.
In Assembler mußt Du also eine dezimale Eingabe tatsächlich Stelle für Stelle mit 10 multiplizieren und addieren, damit es intern ein Binär-Wert wird.
Umgekehrt muß für eine Ausgabe jedes Byte, Word oder was auch immer durch 10.000, 1.000, 100 und 10 dividiert werden, damit wir es wieder erkennen können.
Beispiele in Assembler findest Du hier (http://www.domnick-elektronik.de/picasm.htm)

Atax62
15.01.2007, 16:56
Vielen Dank für deine Antwort

Ich muss den bcd Wert also 2345 dez in den registern r1=23h, r2=45h in einen Hex wert umwandeln 2345=>929 r1=09h r2=29h
wie komm ich nun von 2345dez auf 929hex

Danke für eure Hilfe

kalledom
15.01.2007, 17:45
Es gibt Controller mit Befehlen für BCD-Arithmetik; ob Deiner das kann, weis ich nicht.
Mein PIC kennt keine BCD-Arithmetik und ich verwende deshalb die Routine "Such0_9" (Ziffer suchen) bei den Assembler-Beispielen.
2 Unterschiede:
1. bei mir ist es nur ein Byte (0...255), Du mußt es auf 2 Byte erweitern.
2. ich suche nach ASCII-Zahlen und muß diese entsprechend in BCD 0...9 umwandeln, bei Dir sind es bereits BCD-Werte, die Du nibble-weise von links nach rechts abarbeiten mußt:
2 * 10 ... + 3
23 * 10 ... + 4
234 * 10 ... + 5
Das ganze steht dann als 16 Bit-Wert 0929h in 2 Registern mit je 8 Bit.
Wenn Dein Controller einen MULtiplikations-Befehl hat, super.
Andernfalls: Eine Multiplikation mit 10 kannst Du einfach realisieren, indem Du den Wert 1 mal nach links schiebst (* 2) und dann kopierst. Die Kopie schiebst Du noch 2 mal nach links (... * 4 ... * 8 ). Dann addierst Du dieses Ergebnis zu dem mit 2 multiplizierten Wert. Das Ergebnis ist dann * 2 + * 8 = * 10 :-)

wkrug
15.01.2007, 17:52
Nun

Ich würd jede Stelle einzeln dekrementieren und dabei den jeweiligen Stellenwert addieren.

2345
Du bearbeitest die Tausender Stelle
Pseudo Code....

Anfang Tausend:
ist die Erste stelle 0 ? Ja -> Zu anfang 100
Nein->Ergebnis ist Ergebnis + 1000
Tausenderstelle -1
gehe nach Anfang Tausend

Anfang 100
ist die Hunderterstelle 0 ? Ja -> Zu Anfang 10
Nein -> Ergebnis ist Ergebnis + 100
Hunderterstelle - 1
gehe nach Anfang 100

Anfang 10..........usw.

Die Tausender Routine wird 2x Durchlaufen, die 100er 3x, die 10er 4x und die 1er kannst Du direkt dazuaddieren.
Am Ende hast Du im Ergebnisregister deine 929Hex.
Dieses Register muß natürlich aus 2 Byte bestehen.
Das Ganze sollte sich in Assembler relativ geschmeidig Proggen lassen.
Es mag schnellere Methoden geben, aber diese ist relativ leicht zu durchschauen.
Du kannst natürlich auch mit den 1er Stellen anfangen.
Wenn deine BCD Zahl in Nibbles (halben Bytes) vorliegt, musst Du die Nibbles natürlich einzeln bearbeiten, also vorher trennen.

kalledom
15.01.2007, 18:01
@wkrug
Deine Methode wende ich bei Division eines Byte durch 10 an, da halten sich die Schleifen noch in Grenzen: maximal 2 mal durch 100 und 9 mal durch 10; durch 1 ist ja geschenkt.
In dem Fall mit dem Beispiel '2345' hier geht es auch noch .... na ja ....
Bei '9999' sind es allerdings 4 * 9 = 36 Schleifen und wenn die BCD-Zahl z.B. '065535' wäre, müßtest Du auch noch mit 10.000 einige Runden drehen.
Aber, es geht auch so.