mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik hex <-> dez


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Leidinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Leidinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Leidinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hä...

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du vielleicht 7 seg anzeigen mit eingebauten BCD decoder ?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein
möchte das ja eben über die software umwandeln

Autor: Klaus Leidinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke
ich glaub das is das was ich brauche

Autor: Daniel (Gast)
Datum:

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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Tobi (Gast)
Datum:

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

Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 .....).

Autor: Daniel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Robert (Gast)
Datum:

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

Autor: Christoph Medwenitsch (medwe)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph Medwenitsch (medwe)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph Medwenitsch (medwe)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Christoph Medwenitsch (medwe)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.