Forum: Mikrocontroller und Digitale Elektronik Binär in ASCII


von guest123 (Gast)


Lesenswert?

Hallo!

Ich hab hier einen Assermbler-Code und dazu die Aufgabenstellung:

Das UP übernimmt im Akku eine gepachte BCD-Zahl(2-stellig) und wandle 
daraus 2 ASCII-Zeichen. Niederwertige ASCII-Stelle in DPL --> höhere DPH

Was ist eine "gepachte BCD-Zahl". Also eine BCD-Zahl ist eine Zahl in 
Binär von 0-9 in Dezimal. Ein Nibble, aber für was braucht man das bei 
meinem Bsp genau?

Code:
---------
push acc
mov r1,#0x30
anl a,#0x0f
add a,r1
mov dpl,a
pop acc
swap a
anl a,#0x0f
add a,r1
mov dph,a
---------

Also wie komme ich erstmal von einer Binärzahl auf das ASCII-Zeichen?
Die Binärzahl in eine BDC-Zahl umwandeln und dann mit 30hex addieren hab 
ich gelesen.

Warum muss ich dann in meinem Programm 2mal UND verknüpfen mittels ANL?
Warum das ganze 2mal? Da eine BCD-Zahl nur 4bit hat? Aber ich hab 16Bit, 
irgendwie verstehe ich das überhaupt nicht ganz, ein bisschen verwirrt 
bin ich schon.

Kann mir bitte einer erklären wie das genau funktioniert.

Danke im voraus!

mfg guest

von spess53 (Gast)


Lesenswert?

Hi

>Was ist eine "gepachte BCD-Zahl".

Das obere Nibble(Bit 7..4) und das untere Nibble (Bit 3...0) enthalten 
jeweils eine Zahl.

MfG Spess

von Sascha W. (sascha-w)


Lesenswert?

guest123 schrieb:
> Hallo!
> Code:
> ---------
> push acc
akku auf Stack - brauchen wir noch ...
> mov r1,#0x30
offset BIN -> ASCII
> anl a,#0x0f
low-nibble maskieren
> add a,r1
in ASCII wandeln
> mov dpl,a
ins Zielregister kopieren
> pop acc
akku wiederherstellen auf Ausgangswert
> swap a
low-nibble und high-nibble tauschen
> anl a,#0x0f
wieder maskieren
> add a,r1
zu ASCII
> mov dph,a
kopieren


Sascha

von guest123 (Gast)


Lesenswert?

Danke! Den Code verstehe ich eh was der gemacht, sorry hab ich vergessen 
zu schreiben, aber warum braucht man hier eine BCD-Zahl warum 
UNDverknüpfen mit 1111binär?

Warum das ganze zweimal?

von Werner (Gast)


Lesenswert?

guest123 schrieb:
> Den Code verstehe ich eh was der gemacht, sorry hab ich vergessen
> zu schreiben, aber warum braucht man hier eine BCD-Zahl warum
> UNDverknüpfen mit 1111binär?

Kannst du deine Frage noch mal in einen geordneten Satz kleiden?

von Sascha W. (sascha-w)


Lesenswert?

guest123 schrieb:
> Danke! Den Code verstehe ich eh was der gemacht, sorry hab ich vergessen
> zu schreiben,
aha?

> aber warum braucht man hier eine BCD-Zahl warum
> UNDverknüpfen mit 1111binär?
>
> Warum das ganze zweimal?
dann kannst du offenbar den Code und meine Erklärung doch nicht 
verstehen

Bit:  76543210
BCD:  ZZZZEEEE    ;Z=Zehner, E=Einer
&&    00001111
==    0000EEEE
;;
BCD:  ZZZZEEEE
swap  EEEEZZZZ
&&    00001111
==    0000ZZZZ

Sascha

von guest123 (Gast)


Lesenswert?

Aso ok ich glaub ich habs fast verstanden.

das ANL dient dazu das das H-Nibble gelöscht wird, also das man nur 
30hex zum L-Nibble addiert. Und mit hilfe vom Swap das gleiche nochmal.
Soweit so gut.

Aber nun stellt sich die Frage warum man hier die BCD-Zahl ins Spiel 
bringen muss?

Warum muss man ausgerechnet mit 4 Bits, also einem Nibble bzw. BCD-Zahl 
30hex dazu addieren?

von Peter D. (peda)


Lesenswert?

guest123 schrieb:
> Code:
> ---------
> push acc
> mov r1,#0x30
> anl a,#0x0f
> add a,r1
> mov dpl,a
> pop acc
> swap a
> anl a,#0x0f
> add a,r1
> mov dph,a
> ---------

Man kann das auch anders lösen:
1
  mov  b, #16
2
  div  ab          ; A = quotient, B = remainder
3
  add  a, #'0'     ; to ASCII
4
  mov  dph, a
5
  mov  a, b
6
  add  a, #'0'     ; to ASCII
7
  mov  dpl, a


Peter

von Sascha W. (sascha-w)


Lesenswert?

guest123 schrieb:
> Aso ok ich glaub ich habs fast verstanden.
>
> das ANL dient dazu das das H-Nibble gelöscht wird, also das man nur
> 30hex zum L-Nibble addiert. Und mit hilfe vom Swap das gleiche nochmal.
> Soweit so gut.
schön

> Aber nun stellt sich die Frage warum man hier die BCD-Zahl ins Spiel
> bringen muss?
warum hier mit einer BCD-Zahl gearbeitet wird? Weil die Ausgabe das so 
vorgibt?!

> Warum muss man ausgerechnet mit 4 Bits, also einem Nibble bzw. BCD-Zahl
> 30hex dazu addieren?
Ich verstehe nicht auf was du hinauswillst!
BCD-Zahl = Binär Codierte Dezimal-Zahl, das heist eben das 2 Zahlen von 
0..9 in einem Byte verpackt sind. Und um aus dem Wert 0..9, das 
ASCII-Zeichen '0'..'9' zu erhalten muss man eben 30hex addieren, weil 
30hex der ASCII-Code für eine '0' ist.

Sascha

von Karl H. (kbuchegg)


Lesenswert?

guest123 schrieb:

> Aber nun stellt sich die Frage warum man hier die BCD-Zahl ins Spiel
> bringen muss?
>
> Warum muss man ausgerechnet mit 4 Bits, also einem Nibble bzw. BCD-Zahl
> 30hex dazu addieren?


Weil die Hex-Zahl 0x34 eben nicht die Dezimalzahl 34 ist, sondern der 
Zahl 52 entspricht. Du willst aber eine einfache Möglichkeit, wie einer 
angezeigten Zahl von 34 eine interne Repräsentierung entspricht. Eben 
0x34.  Und das nennt man dann eben BCD

von guest123 (Gast)


Lesenswert?

Ich danke euch!

Das heißt also, es ist einfach so, mann muss eine BCD-Zahl(4bit) mit 
30hex addieren das man dann den ASCII code bekommt?

Das ist wie ein Kochrezept, man braucht Mehl, Zucker, Backpulver etc. 
das man einen Kuchen backen kann?

Kann man so vergleichen?

von spess53 (Gast)


Lesenswert?

Hi

>Das heißt also, es ist einfach so, mann muss eine BCD-Zahl(4bit) mit
>30hex addieren das man dann den ASCII code bekommt?

Nur wenn es Zahlen von 0..9, also Dezimalzahlen sind. 0x30 ist übrigens 
der ASCII-Code für 0 (Null).

MfG Spess

von Dietrich L. (dietrichl)


Lesenswert?

spess53 schrieb:
> 0x30 ist übrigens der ASCII-Code für 0 (Null).
...und das geht glücklicherweise linear weiter bis 0x39 für '9', darum 
geht die (einfache) Addition.

Gruß Dietrich

von DirkB (Gast)


Lesenswert?

guest123 schrieb:
> Was ist eine "gepachte BCD-Zahl".

Das soll sicherlich eine gepackte BCD-Zahl sein (zwei Ziffern in einem 
Byte)

von guest123 (Gast)


Lesenswert?

Danke!

spess53 schrieb:
> Nur wenn es Zahlen von 0..9, also Dezimalzahlen sind

Warum kann man nicht 10 mit 30hex addieren, also warum funktioniert das 
nicht?

von spess53 (Gast)


Lesenswert?

Hi

>Warum kann man nicht 10 mit 30hex addieren, also warum funktioniert das
>nicht?

Weil der Hexcode für 10 0xA ist. Und das ASCII-Zeichen für 'A' ist 0x41 
und nicht 0x3A. Für 10...15 müssen noch mal 7 addiert werden.

MfG Spess

von Sascha W. (sascha-w)


Lesenswert?

guest123 schrieb:
> Warum kann man nicht 10 mit 30hex addieren, also warum funktioniert das
> nicht?
warum soll das nicht funktionieren? Kommt halt ein ':' raus!

Sascha

von Jobst M. (jobstens-de)


Lesenswert?

guest123 schrieb:
> Warum kann man nicht 10 mit 30hex addieren, also warum funktioniert das
> nicht?

Kann man schon. Du kannst mit 4 Bit 16 Zustände darstellen - von 0 bis 
15.
Bei BCD sind aber nur 0-9 gültig.
Wenn ich Dich richtig verstanden habe, möchtest Du nun in einer Stelle 
die Zahl 10 darstellen.
Versuch doch einfach mal, 10 mit nur einer Ziffer darzustellen.

Wenn Du das doch möchtest, dann ist es auch kein BCD mehr und eine 
andere Berechnung ist nötig:
1
// Wandelt A zu dezimal. Einer in DPL, Zehner in DPH
2
// Funktioniert nur von 00 - 99 - Hunderter werden abgeschnitten
3
4
dec2asc:  MOV  B, #0x64  // 100
5
    DIV  AB    // Akku durch 100 Teilen
6
          // Hier könnte man 100er abgreifen
7
8
    MOV  A, B    // Der Rest
9
    MOV  B, #10    // wird nun durch 10
10
    DIV  AB    // geteilt
11
    ADD  A, #0x30  // davon den ganzen Teiler zu ASCII
12
    MOV  DPH, A    // und speichern
13
14
    MOV  A, B    // Der Rest sind einer
15
    ADD  A, #0x30  // auch diese in ASCII
16
    MOV  DPL, A    // und speichern
17
18
    RET


Gruß

Jobst

von Timm T. (Gast)


Lesenswert?

guest123 schrieb:
> Das heißt also, es ist einfach so, mann muss eine BCD-Zahl(4bit) mit
> 30hex addieren das man dann den ASCII code bekommt?

Grundlagen, wirst Du immer wieder brauchen: 
http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange

von GroberKlotz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
vor Jahren habe ich mir das mal mit dem "patchen" und der BCD -> 
ASCII-Wandlungvor als PIC-Neuling vor Augen geführt. Daher ist das 
beiliegende Assembler-File für den PIC 16F628 ein wenig langwierig oder 
umständlich geraten, sollte aber die Zusammenhänge der "patched 
Binärzzahl", und auch die Umwandlung in ASCII verständlich in MPLAB 
Schritt für Schritt nachvollziehbar darstellen.
Wer es nachspielen will, dem kann ja die beiliegeden Watchtab evtl. 
nützlich sien.

Gruss GroberKlotz

von pompete (Gast)


Lesenswert?

guest123 schrieb:
> Ich hab hier einen Assermbler-Code und dazu die Aufgabenstellung:

....so,da kein posting mehr von dir kommt,denke ich mal das deine 
hausaufgabe zufriedenstellend durch die user des forums gelöst wurde ;-)

guest123 schrieb:

> Warum kann man nicht 10 mit 30hex addieren, also warum funktioniert das
> nicht?

....tja ein wenig eigeninitiative in form von "mitdenken" hätte diese 
frage wohl überflüssig gemacht, aber das hier ist ein gutes forum, hier 
wird dir das denken abgenommen da die user mehr zeit haben als du....

von Peter D. (peda)


Lesenswert?

GroberKlotz schrieb:
> vor Jahren habe ich mir das mal mit dem "patchen" und der BCD ->
> ASCII-Wandlungvor als PIC-Neuling vor Augen geführt.

Mit Patchen hat das nichts zu tun, es heißt packed BCD.

http://en.wikipedia.org/wiki/Binary-coded_decimal

"Uncompressed (or zoned) BCD consumes a byte for each represented 
numeral, whereas compressed (or packed) BCD typically carries two 
numerals in a single byte by taking advantage of the fact that four bits 
will represent the full numeral range."


Der obige Code ist 8051 Assembler, daher kann er mit PIC Code überhaupt 
nichts anfangen.


Peter

von Karl H. (kbuchegg)


Lesenswert?

guest123 schrieb:

> Aber nun stellt sich die Frage warum man hier die BCD-Zahl ins Spiel
> bringen muss?

Weil es manchmal viel einfacher ist, bei der Zahlenmanipulation zu 
berücksichtigen, dass die nächste Zahl nach 0x09 eben die 0x10 ist. Im 
Gegenzug spart man sich dafür eine 'aufwändige' Zerlegung einer Zahl bei 
der Ausgabe um sie in eine lesbare Dezimalzahl zu bekommen.
zb Uhr. Die Sekunden (Minuten etc) werden immer nur um 1 erhöht. Dieses 
Erhöhen in BCD ist trivial.

von guest123 (Gast)


Lesenswert?

Ich danke euch - habs nun verstanden!

von Jobst M. (jobstens-de)


Lesenswert?

Cool! Feedback! :-)

Gruß

Jobst

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.