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
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
ich verstehe immer noch nicht was du eigentlich willst... BCDs sind nur die 2 Nibbels deines Bytes. Also gibts da nicht so viel umzuwandeln.
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
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
vielleicht wars verwirrend weil ich nicht gesagt hab das die zahl auf den 7 segment anzeigen dezimal angezeigt werden soll ?
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 ?
schau nach wieviel deine anzeige zieht, und schau nach wieviel der uC verträgt... steht alles in den datenblättern zu selber raussuchen
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.
aso, verstehe. und wie programmier ich das? welcher befehl vergleicht, ob die Zahl kleiner als 10 ist?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.