Forum: Mikrocontroller und Digitale Elektronik Umrechnung DEZ in HEX


von Stefan KM (Gast)


Lesenswert?

Hallo.

Ich möchte ein PWM erzeugen mit einem ATMega64 mit Timer 3.

Initialisierung habe ich durchgeführt --> PWM funktioniert. Regelt 
Stromausgang mit 0-20mA.

Jetzt möchte ich eine gemessene Temperatur als Strom ausgeben.
Messbereich: -40 - +80 °C  also 120K. Das macht 0,16mA/K.

Ich berechne mir intern den Zählwert um den Counter für das PWM zu 
laden. Mein Problem ist nun, das ich eine Dezimalzahl berechnet habe 
z.B. 100, muss diese aber in ein Register schreiben, welches ich nur mit 
Hexadizimalzahlen beschreiben kann.

Wie kann ich dez in hex umrechnen?

Kann mit jemand helfen?

Danke

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

HEX und DEZ sind nur verschiedene Darstellungen!

Oder hast du die "Zahl" als String vorliegen?
Ansosnten noch Programmiersprache etc...

wenn du die einzelnen Zahlen als Characters (z.B. von der Seriellen 
Schnittstelle) hast kannst du das so umrechnen:

(c_hunderter-48)*100+(c_zehner-48)*10+(c_einer)

von Michael Wilhelm (Gast)


Lesenswert?

Windows Taschenrechner vorhanden?

MW

von Stefan KM (Gast)


Lesenswert?

@Michael Wilhelm
Ich möchte das der Controller die Umrechnung selber vornimmt

@Läubi:
Und kann ich die Zahl 100 einfach in das Register schreiben?

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Hier gibts eine math-Library für AVR,
http://users.i.com.ua/~birua/math32.zip
u.a. auch Bcd zu Bin für 16 und 24 Bit:
;*********************************************************************** 
****
;* BCD3bin == BCD to 24-Bit Binary Conversion
;* fBCD0:fBCD1:fBCD2:fBCD3  >>>  tbin0:tbin1:tbin2
;*       dec      hex
;*   r16r17r18r19      >>>      r20r21r22
;*********************************************************************** 
****

von Uwe .. (uwegw)


Lesenswert?

Der Controller liefert als Ergebnis der Umrechnung keine Dezimalzahl, 
sondern eine Binärzahl (die man natürlich auch in eine Dezimalzahl 
umrechnen könnte). Und die kann dann direkt an das Timer-Register 
übergeben werden.

Oder meist du den Fall, dass du eine KONSTANTE Zahl von hand berechnet 
hast, udn diese verwenden willst? Dann kannst du bei den allermeisten 
Compilern einfach schreiben
timerregister=zahl;
und die Umwandlung wird automatisch vorgenommen.

von Stefan KM (Gast)


Lesenswert?

@Uwe

Ist das in C auch so?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Also irgenwo muß doch die Zahl gespeichert sein.
Wenn sie schon im Speicher/Regsiter/wasweisich liegt, oder ergebnis 
einer Berechnung ist, kannst du die einfach ins steuerregister 
schreiben.

von Johannes M. (johnny-m)


Lesenswert?

Wenn Du eine Zuweisung machst wie
1
REGISTER = 100;
oder in Assembler
1
ldi r16, 100
dann steht in REGISTER bzw. r16 "01100100". Genausogut hättest Du auch
1
REGISTER = 0x64;
bzw.
1
ldi r16, 0x64
schreiben können, das Ergebnis ist dasselbe.

von Stefan KM (Gast)


Lesenswert?

Ich verstehe vielen Dank

von Karl H. (kbuchegg)


Lesenswert?

Stefan KM wrote:
> @Uwe
>
> Ist das in C auch so?


Ja.
Wie schon gesagt: Hex, Dezimal, Binär sind alles nur verschiedene
Schreibweisen für ein und dasselbe Ding: Ein Zahl

Ob du

  Register  = 113;
  Register  = 2 * 50 + 13;
  Register  = 0x71;
  Register  = 0b01110001;
  Register  = 'q';

schreibst, ist völlig egal. Es sind nur verschiedene Schreibweisen
für immer dasselbe:
Das Register wird mit dem Bitmuster  0111 0001  geladen.

von Oliver (Gast)


Lesenswert?

Der Controller kennt gar keine Hex- oder Dezimalzahlen. Der kennt nur 
binäre Bits und Bytes. Mit Hexzahlen kann der genausowenig anfangen, wie 
mit Dezimalzahlen.

Weil aber die binäre Darstellung (z.B. 00001010 für dez 10) für den 
Meschen furchtbar schlecht lesbar ist, schreibt der lieber 10 (dezimal) 
oder 0x0A (hexadezimal). Der Compiler (und auch der Assembler) kennt 
beides, wandelt es ins Binärsystem um, und schreibt daraufhin 00001010 
ins Register.

Und auch in einer uint8_t-Variablen mit dem Wert dez 10 steht im 
Speicher 00001010, und nicht "10" oder "A". Insofern kannts du beruhigt 
deinen berechneten Wert einfach so ins Register schreiben - das kommt da 
schon richtig an.

Oliver

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.