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