Forum: Mikrocontroller und Digitale Elektronik 32 Bit Hex in Dez umwandeln


von *GAST* (Gast)


Angehängte Dateien:

Lesenswert?

Dieses Thema gab es hier zwar schon einige Male, wie ich der Suche 
entnommen habe, aber eine Lösung für mein Problem habe ich nicht 
gefunden. Mein Messgerät sendt mir über eine Schnittstelle eine Spannung 
aufgeteilt in 4 Byte. Der Spannungsbereich ist von -10 V bis +10 V. Im 
Anhang eine Tabelle mit Beispielwerten.

Die Bytes liegen mir in insgesamt 4 Integer-Variablen vor.

Was muss ich jetzt tun, um in C eine Spannung als Dezimalzahl zu sehen?

von Flo (Gast)


Lesenswert?

In C erstmal garnichts.

Solche Konvertierungen von binär nach dezimal ist nur dann überhaupt 
wichtig, wenn die Werte ausgegeben werden sollen, also z.B. auf ein 
Display.

Dann kann man z.B. über Modulo die jeweiligen Ziffern an den Stellen 
rausfinden, die interessant sind.
(Ich bezweifle, dass du in nV ausgeben willst, geschweige denn das dein 
ADC überhaupt so genau funktioniert)

von *GAST* (Gast)


Lesenswert?

Naja, die Messwerte kommen nun einmal so an. Und ich möchte die 
Messwerte nicht nur auf dem Monitor anzeigen, sondern auch in eine 
Messdatei schreiben.

Mir ist auch nicht ganz klar, warum 0xffffffff ca. -4 nV sind, und 
0x00000001 ca +4 nV... Sonst könnte man ja von 0 bis 10V mit Dreisatz 
arbeiten...

von magnetus (Gast)


Lesenswert?

Stichwort Zweierkomplement

http://de.wikipedia.org/wiki/Zweierkomplement

Gruß,
Magnetus

von St. (Gast)


Lesenswert?

Was spricht dagegen das ganze so wie es ankommt abzuspeichern?

von *GAST* (Gast)


Lesenswert?

Ich muss die Daten in Diagrammform z.B. mit Excel anzeigen. Da nützen 
mir 8 Spalten mit Hex-Werten garnichts....

Ich habe das jetzt mal ausprobiert, funktioniert aber nicht:

dezimal = -10
printf("Dezimal: %d \t Hex: %x \n", dezimal, dezimal);

0xFFFFFFF6 kommt raus, 0x80000000 sollte es sein....

von g457 (Gast)


Lesenswert?

> Die Bytes liegen mir in insgesamt 4 Integer-Variablen vor.

Unter Beachtung der Enianness in einen 32 bit signed int packen (z.b. 
int32_t) und klücklich sein - dann kannst Du auch mit deinem Dreisatz 
weiterrechnen :-)

Wenn Du es menschenlesbar darstellen oder (menschenlesbar oder 
maschinenlesbar) in eine Datei speichern willst, dafür gibts fertige 
Funktionen wie itoa(), ltoa(), [s[n]]printf() - jeweils ggf. vor oder 
nach Umrechnung..

HTH

von *GAST* (Gast)


Lesenswert?

Woher weiß mein Programm, dass FFFFFFFF negativ und 00000001F positiv 
ist?

von g457 (Gast)


Lesenswert?

> Woher weiß mein Programm, dass FFFFFFFF negativ und 00000001F positiv
> ist?

Weil der Datentyp (in den Du es geschickterweise verpackst) ★SIGNED★ 
ist.

von slowslow (Gast)


Lesenswert?

wer gibt eigentlich deinem programm die intelligenz etwas zu wissen?

du oder wer sonst schreibt das programm?

von g457 (Gast)


Lesenswert?

ich hab dir zum besseren Verständnis mal eben ein kurzes 
Beispielprogramm zusammengehackt:
1
$ cat main.c 
2
#include <stdint.h>
3
#include <stdio.h>
4
5
6
void zeich_mich_lesbar(int32_t i32Data)
7
{
8
        printf("raw: 0x%.8x menschenlesbar: %d aufgehübscht %eV\n", i32Data, i32Data, i32Data *10.0 /INT32_MAX);
9
}
10
11
12
int main()
13
{
14
        zeich_mich_lesbar(0x80000000);
15
        zeich_mich_lesbar(0xFFFFFFFF);
16
        zeich_mich_lesbar(0x00000000);
17
        zeich_mich_lesbar(0x00000001);
18
        zeich_mich_lesbar(0x7FFFFFFF);
19
20
        return 0;
21
}
22
$ gcc -Wall main.c -o main
23
$ ./main 
24
raw: 0x80000000 menschenlesbar: -2147483648 aufgehübscht -1.000000e+01V
25
raw: 0xffffffff menschenlesbar: -1 aufgehübscht -4.656613e-09V
26
raw: 0x00000000 menschenlesbar: 0 aufgehübscht 0.000000e+00V
27
raw: 0x00000001 menschenlesbar: 1 aufgehübscht 4.656613e-09V
28
raw: 0x7fffffff menschenlesbar: 2147483647 aufgehübscht 1.000000e+01V

(Wie immer) alles eines Sache der Interpretation ;-)

HTH und HF

von Derda (Gast)


Lesenswert?

>Woher weiß mein Programm, dass FFFFFFFF negativ und 00000001F positiv
>ist?

Sorry, wie willst du ein C-Programm schreiben, wenn du nicht mal die 
elementarsten Grundlagen verstanden hast?

http://www.ulthryvasse.de/

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.