hex <-> dez

Gast #145008
Lesenswert?

ich möchte mit einem 8051 uc eine 12 bit hex zahl die in den registern
steht in eine dezimalzahl umwandeln.
das format der zahl bleibt dabei natürlich hexadezimal (der uc kann ja
nichts anderes) aber in den registern sollten dann die dezimalen
ziffern stehen.

hat jemand einen vorschlag wie man das machen könnte ?
Gast #145010
Lesenswert?

natürlich is da nichts wirklich in hex. habs nur so gesagt weil die
register im debugger in hex dargestellt werden.
aber in welchem format die zahl jetzt dargestellt ist (in hex oder
binär) ist in dem fall egal.

bcd code ist eine gute idee. aber die kann ich eine hex oder binäre
zahl  mit dem 8051 befehlen in bcd umwandeln?
Gast #145011
Lesenswert?

Hallo Daniel,

neue Vermutung: möchtest Du ASCII Zeichen darstellen? Per RS232 oder
LCD?

Falls ja, hab ich hier was:

    A hat die Zahl die gewandelt wird:

    push  ACC          ; Zahl sichern
    swap  A
    anl   A,#0FH
    mov   DPTR,#itoatab
    movc  A,@A+DPTR
    mov   R1,A         ; R1 ist die erste Zahl
    POP   ACC          ; Zahl wieder zurückholen
    anl   A,#0FH
    mov   DPTR,#itoatab
    movc  A,@A+DPTR
    mov   R2,A         ; R2 ist die zweite Zahl

   usw...
itoatab: bd "0123456789ABCDEF"

Wenn nicht, schreib mal was es werden soll...

Ciao,
Klaus
Gast #145014
Lesenswert?

also meines wissens ist ein 4 bit binärcode die zahlen 0000 bis 1111 und
4 bit bcd 0000 bis 1001.

ich möchte 7 segment anzeigen ansteuern und mit dem binärcode geht das
schwer, da wird der bcd benötigt.

sagts was falls ich mich da irre
Gast #145015
Lesenswert?

Daniel,

na das hattest Du schon geschrieben. Am Anfang waren es aber 12 bit,
die Du in Ziffern wandeln wolltest.

BCD heisst ja Binär Codierte Dezimalzahl.
Die oberen 4 bit sind die erste Zahl, die unteren sind die nächste
Zahl.

Solange es nur 0-9 ist, ist es eine dezimalzahl, darüber eine
Hexadezimalzahl. Da brauchst Du gar nichts umzuwandeln.

2. Versuch:
Willst Du die Werte 0-255 (0x00 - 0xFF, die mit 8 Bit möglich sind) als
Dezimalzahl  haben? (oder halt 12 Bit)

So wirklich verstehe ich noch nicht, was Du möchtest...

Ciao,
Klaus
Gast #145016
Lesenswert?

Aha,

na wenn Du 7 Segmentanzeigen ohne Decoder ansteuern möchtest, hab ich
was für den 8051:

www.mikrocontroller-projekte.de (Servosignaltester und Tacho)

Das hat aber ohne IC nichts mit BCD zu tum. Du brauchst Ja den Code
entsprechend der Verdrahtung der 7 Segment Anzeige(n).

Ciao,
Klaus
Gast #145017
Lesenswert?

eigentlich sind es 12 bit, aber ein register ist nur 8 bit lang, so das
die oberen 4 bit extra umgewandelt werden. und bei 4 bit ist das
einfach.
wenn die zahl kleiner ist als 0101 dann ist die dezimalzahl einfach die
zahl.
aber wenn sie größer als 1010 ist, dann ist die erste dezimale ziffer 1
und die zweite ist die 4 bit zahl minus 1010.

ich bräuchte jetzt ein verfahren für 8 bit große binäre zahlen
Gast #145027
Lesenswert?

weiß nicht ob du das willst:

wenn einen BCD Code aus einem register dezimal zb. an einem port haben
willst, (beispiel: bcd 4 und dann soll der 4. pin am port auf high
gehen) dann versuch mal ein anderes register mit gesetztem carry-bit so
oft nach links rotiern zu lassen (RLC .....).
#562466
Lesenswert?

Klaus Leidinger wrote:
> 2. Versuch:
> Willst Du die Werte 0-255 (0x00 - 0xFF, die mit 8 Bit möglich sind) als
> Dezimalzahl  haben? (oder halt 12 Bit)

Hallo, ich brauche sowas. habe z.b. in einem Register 14h stehen und 
möchte, dass 20 drinnen steht. wie mache ich das?

mfg medwe
#562479
Lesenswert?

Christoph Medwenitsch wrote:
> Klaus Leidinger wrote:
>> 2. Versuch:
>> Willst Du die Werte 0-255 (0x00 - 0xFF, die mit 8 Bit möglich sind) als
>> Dezimalzahl  haben? (oder halt 12 Bit)
>
> Hallo, ich brauche sowas. habe z.b. in einem Register 14h stehen und
> möchte, dass 20 drinnen steht. wie mache ich das?
>

Eine einfache Möglichkeit ist diese:

Du ziehst in einer Schleife solange 100 ab, bis
das Ergebnis kleiner als 100 ist. Dabei zählst du
mit wie oft du subtrahieren musstest -> Ergibt die
Hunderter Stelle.

Mit dem Zwischenergebnis machst du weiter: Du ziehst
in einer Schliefe solange 10 ab, bis das Ergebnis
kleiner als 10 geworden ist. Wiederrum: Du zählst
mit, wie oft du subtrahieren musstest -> Ergibt die
Zehnerstelle.

Das letzte Zwischenergebnis ist dann schon die Einerstelle.
Da braucht man also nichts spezielles machen.

Wenn dein µC allerdings über eine Hardwaredivision
verfügt, kann man das auch einfacher rechnen:

Zahl / 100      -> Ergibt die Hunderterstelle

Restbildung von Zahl / 100 -> neue Zahl x

x / 10          -> Ergibt die Zehnerstelle

Restbildung von x / 10  -> neue Zahl y

y              -> Ergibt die Einerstelle
#562485
Lesenswert?

Christoph Medwenitsch wrote:
> Das versteh ich irgendwie nicht.
> nehmen wir mal das konkrete beispiel von 14 auf 20 an.
> wenn ich 14 durch 10 dividiere, erlahlte ich 1 und 4 Rest.

Moment:
Wenn du hexadezimal 0x14 durch hexadezimal 0x0A ( = dezimal 10)
dividierst, kommt da keineswegs 1 und 4 raus.
#562495
Lesenswert?

Christoph Medwenitsch wrote:
> aso, verstehe. und wie programmier ich das? welcher befehl vergleicht,
> ob die Zahl kleiner als 10 ist?

Welcher Prozessor, welche Programmiersprache?

Wenns was anderes als ein AVR in Assembler ist, bin ich draussen.
Wenn dir sonst keiner hilft, wirst du wohl zum Aussersten greifen
muessen und dir das 'Instruction Set' zu deinem Prozessor
durchsehen und nach Compare und Branch Befehlen suchen muessen.

#562502
Lesenswert?

Sorry. Bin draussen.

Aber viele (die meisten) µC haben einen Befehl CP (für Compare)
und eine Abart davon CPI (Compare immediate). Der Compare
vergleicht die beiden Operanden (bei Immediate ist die Zahl
mit der verglichen werden soll direkt angegegeben).
Der Vergleich wird dann mit einem Sprungbefehl ausgewertet.
Sprungbefehle gibt es in verschiedenene Vraianten: Branch
(oder Jump) if Carry set, Branch (oder Jump) if Carry not set,
oder aber auch Branch (oder Jump) if negativ.
Der Punkt ist: Der Compare macht nichts anderes als die
eine Zahl von der anderen abzuziehen. Wenn es dabei
einen Unterlauf gab (Carry gesetzt) dann war die erste
Zahl kleiner als die 2-te Zahl.

Schau mal in das Instruction Set deines Prozessors. So viele
Branch (oder Jump) Befehle gibt es da normalerweise nicht.
#562603
Lesenswert?

Daniel wrote:
> eigentlich sind es 12 bit, aber ein register ist nur 8 bit lang, so das
> die oberen 4 bit extra umgewandelt werden. und bei 4 bit ist das
> einfach.

Und was soll das werden ?

Wer soll solche Zahlen ablesen, das ist weder binär noch dezimal.



Du nimmst die 12Bit-Zahl, setzt im obersten Byte die oberen 4 Bit auf 0 
und schon hast Du ne 16Bit Zahl.

Und die wandelst Du dann mit ner 16Bit zu dezimal Routine um.

Z.B. siehe Anhang.


Peter
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren