Forum: Mikrocontroller und Digitale Elektronik hex <-> dez


von Daniel (Gast)


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 ?

von Christof Krüger (Gast)


Lesenswert?

Hexadezimal ist da nix. Das nennt sich binär. Und was du brauchst, ist
eine Umwandlung von Binär => BCD. Also such mal nach BCD, das ist ein
gutes Stichwort.

von Daniel (Gast)


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?

von Klaus Leidinger (Gast)


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

von Daniel (Gast)


Lesenswert?

eigentlich möchte ich nur eine 8 bit große binärzahl in den bcd code
umwandeln.
und das ganze ohne externen IC sondern mit dem  8051 befehlen

von Simon (Gast)


Lesenswert?

ich verstehe immer noch nicht was du eigentlich willst...
BCDs sind nur die 2 Nibbels deines Bytes.
Also gibts da nicht so viel umzuwandeln.

von Daniel (Gast)


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

von Klaus Leidinger (Gast)


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

von Klaus Leidinger (Gast)


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

von Daniel (Gast)


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

von Simon (Gast)


Lesenswert?

Hä...

von Simon (Gast)


Lesenswert?

hast du vielleicht 7 seg anzeigen mit eingebauten BCD decoder ?

von Daniel (Gast)


Lesenswert?

nein
möchte das ja eben über die software umwandeln

von Klaus Leidinger (Gast)


Lesenswert?

Also doch das, was ich in meinem vorletzten Posting geschrieben hatte.

Hier:
http://www.mikrocontroller.net/forum/read-4-14592.html#new

Ist das das, was Du suchst?

Ansonsten geb ich auf...

Ciao,
Klaus

von icke (Gast)


Lesenswert?


von Daniel (Gast)


Lesenswert?

danke
ich glaub das is das was ich brauche

von Daniel (Gast)


Lesenswert?

vielleicht wars verwirrend weil ich  nicht gesagt hab das die zahl auf
den 7 segment anzeigen dezimal angezeigt werden soll ?

von Daniel (Gast)


Lesenswert?

hab da noch eine frage:

kann man die 7 segment anzeigen direkt über die ports vom uc
ansteuern.
die liefern ja nicht so viel strom ?

von Tobi (Gast)


Lesenswert?

schau nach wieviel deine anzeige zieht, und schau nach wieviel der uC
verträgt... steht alles in den datenblättern zu selber raussuchen

von Richard (Gast)


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 .....).

von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

laut dem  datenblatt sollte es eigentlich kein problem sein.
soweit ich das interpretieren kann sollten die ports maximal 25mA
liefern können (siehe anhang)

das problem ist nur das es nicht funktioniert

von Robert (Gast)


Lesenswert?

soweit ich weiß geht das nicht so einfach.
kenn mich aber auch nicht wirklich aus.

von Christoph M. (medwe)


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

von Karl H. (kbuchegg)


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

von Christoph M. (medwe)


Lesenswert?

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. d.h. mein 
Ergebnis ist wieder 14.
habe ich da was falsch verstanden?

von Karl H. (kbuchegg)


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.

von Christoph M. (medwe)


Lesenswert?

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

von Karl H. (kbuchegg)


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.


von Christoph M. (medwe)


Lesenswert?

ich programmiere in assembler auf einen c8051 µC von Silabs. kannst du 
mir helfen?

von Karl H. (kbuchegg)


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.

von Peter D. (peda)


Angehängte Dateien:

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

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.