Forum: Mikrocontroller und Digitale Elektronik Dezimal in Hex


von andre (Gast)


Lesenswert?

Hallo,

Ich möchte gerne den wert einer Variable in HEX wandeln.

u8 stunde_dez; // 0-59

u8stunde_hex;

Mit sprintf wäre ja eine Möglichkeit aber das nimmt mir ja zu viel 
Programm Speicher.

Gibst denn noch eine andere Möglichkeit den Wert in HEX zu wandeln
mfg

von Mark B. (markbrandis)


Lesenswert?

Der Wert ist schon hexadezimal. Oder binär, je nachdem wie man es 
betrachtet.

Was genau willst Du machen? Den Wert irgendwo anzeigen?

von Ingo L. (corrtexx)


Lesenswert?

Dem Controller ist das egal welches Zahlenformat du hast, er kennt nur 
binär. Alles andere macht der Compiler.

: Bearbeitet durch User
von Hugo (Gast)


Lesenswert?

andre schrieb:
> u8 stunde_dez; // 0-59
>
> u8stunde_hex;

Wenn du schreibst:

stunde_dez = 59;
stunde_hex = 0x3B;

dann enthalten die beiden Variablen exakt den gleichen Inhalt.

von andre (Gast)


Lesenswert?

ich möchte eine RTC Uhr die Stunde stellen, da ist das Format nur in 
hex.

ich zähle die variable Stunde_dez 0-23  bis ich meine Uhrzeit hab. bei 
der minute auch so.
zB. in hex ist 0x17  in dezimal 23.

wie Wandel ich nun meine Zahl in hex um

von Peter D. (peda)


Lesenswert?

andre schrieb:
> Ich möchte gerne den wert einer Variable in HEX wandeln.

In welchem Format eine CPU einen Wert intern speichert, kannst Du nicht 
beeinflussen.
Du kannst nur bestimmen, wie eine Variable als Text ausgegeben werden 
soll.

von Amateur (Gast)


Lesenswert?

Bis Du Dir sicher, dass die Uhr Hex-Zahlen verdaut und nicht BCD's?

von Hugo (Gast)


Lesenswert?

andre schrieb:
> wie Wandel ich nun meine Zahl in hex um

Wer sucht, der wird finden :-)
http://stackoverflow.com/questions/16928517/converting-a-decimal-to-a-hexadecimal-number

Nur ein Beispiel...

von Ingo L. (corrtexx)


Lesenswert?

andre schrieb:
> wie Wandel ich nun meine Zahl in hex um
Garnicht weil nicht nötig, die übertragen Daten sind sowieso binär.

Hugo schrieb:
> Nur ein Beispiel...
Hier wird aber aus der Variable ein String gemacht...

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

andre schrieb:
> ich möchte eine RTC Uhr die Stunde stellen, da ist das Format nur in
> hex.

Vorsicht! Die meisten RTCs wollen nicht Hex, sondern BCD. Und das ist 
was ganz anderes!

> ich zähle die variable Stunde_dez 0-23  bis ich meine Uhrzeit hab. bei
> der minute auch so.
> zB. in hex ist 0x17  in dezimal 23.

Beispiel:

23 Uhr:

   DEZ   23
   HEX 0x17
   BCD 0x23

Nenne mal den RTC-Typ. Dann wetten wir, ob Hex oder BCD. Ich tippe stark 
darauf, dass die RTC 0x23 und nicht(!) 0x17 für die Stunde 23 haben 
will.

> wie Wandel ich nun meine Zahl in hex um

Falsche Frage. Jede Zahl im Rechner ist binär abgelegt, Du kannst sie in 
dezimal oder Hex auslesen oder beschreiben. Da wird nix Konvertiert.

Was Du willst: Dez -> BCD. Da muss man tatsächlich etwas konvertieren.

Dafür reichen 2 Makros:
1
#define INT_TO_BCD(x)           (((x) / 10) << 4) + ((x) % 10)
2
#define BCD_TO_INT(x)           (10 * ((x) >> 4) + ((x) & 0x0F))

von andre (Gast)


Lesenswert?

Amateur schrieb:
> Bis Du Dir sicher, dass die Uhr Hex-Zahlen verdaut und nicht
> BCD's?

Ja richtig
ist für die internevuhr des F4

von Mark B. (markbrandis)


Lesenswert?

andre schrieb:
> ich möchte eine RTC Uhr die Stunde stellen, da ist das Format nur in
> hex.
>
> ich zähle die variable Stunde_dez 0-23  bis ich meine Uhrzeit hab. bei
> der minute auch so.
> zB. in hex ist 0x17  in dezimal 23.
>
> wie Wandel ich nun meine Zahl in hex um

Gar nicht. Weil eine Umwandlung an der Stelle nicht nötig ist.

andre schrieb:
> Ja richtig
> ist für die internevuhr des F4

Was auch immer ein F4 sein mag.

Beschreibe Dein Problem mal vernünftig. Was ist gegeben, was soll 
gemacht werden?

: Bearbeitet durch User
von Ingo L. (corrtexx)


Lesenswert?

Mark B. schrieb:
> Was auch immer ein F4 sein mag.
Vermutlich ein Cortex der Serie STM32F4. Man fragt sich allerdings wie 
er den im Zaum halten will...

von andre (Gast)


Lesenswert?

ich möchte gerne die RTC vom stm33f4 stellen.
Dazu habe ich 2Taster up down 0-23 für die Stunde erstmal.

wenn ich die Uhr jetztvauf 23 stelle erhalte ich als Ausgabe 15uhr.


das geht

RTC_TimeStructure.RTC_Hours   = 0x05;
  RTC_TimeStructure.RTC_Minutes = 0x20;
  RTC_TimeStructure.RTC_Seconds = 0x00;

und  so gehts nicht.
RTC_TimeStructure.RTC_Hours   = 23;
  RTC_TimeStructure.RTC_Minutes = 0x20;
  RTC_TimeStructure.RTC_Seconds = 0x00;

von Karl M. (Gast)


Lesenswert?

Es wurde ja schon n-mal geschrieben.

Es wird sich um eine Zahlendarstellung als BCD-Zahl handeln !

Und 23dez = 17hex als BCD-Zahl ist das dann 1 7.
Man betrachtet jeweils nur die 4bit Nippel der Zahl im  Zahlenbereich 
von 0 bis 9.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

andre schrieb:
> wenn ich die Uhr jetztvauf 23 stelle erhalte ich als Ausgabe 15uhr.

Sicher 15? Nicht 17?

Und was ist, wenn Du

  RTC_TimeStructure.RTC_Hours   = 0x23;

schreibst?

andre schrieb:
> das geht
> RTC_TimeStructure.RTC_Hours   = 0x05;

Und da komm dann 23 Uhr raus?

>   RTC_TimeStructure.RTC_Minutes = 0x20;

Und was sagen die Minuten?

Wie gesagt, benutze das oben erwähnte Makro INT_TO_BCD, also

int hours = 23;

RTC_TimeStructure.RTC_Hours   = INT_TO_BCD(hours);

Dasselbe gilt für die Minuten und Sekunden.
Dann klappt das schon.

: Bearbeitet durch Moderator
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.