www.mikrocontroller.net

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


Autor: *GAST* (Gast)
Datum:
Angehängte Dateien:

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

Autor: Flo (Gast)
Datum:

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

Autor: *GAST* (Gast)
Datum:

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

Autor: magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort Zweierkomplement

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

Gruß,
Magnetus

Autor: St. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was spricht dagegen das ganze so wie es ankommt abzuspeichern?

Autor: *GAST* (Gast)
Datum:

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

Autor: g457 (Gast)
Datum:

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

Autor: *GAST* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woher weiß mein Programm, dass FFFFFFFF negativ und 00000001F positiv 
ist?

Autor: g457 (Gast)
Datum:

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

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

Autor: slowslow (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wer gibt eigentlich deinem programm die intelligenz etwas zu wissen?

du oder wer sonst schreibt das programm?

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab dir zum besseren Verständnis mal eben ein kurzes 
Beispielprogramm zusammengehackt:
$ cat main.c 
#include <stdint.h>
#include <stdio.h>


void zeich_mich_lesbar(int32_t i32Data)
{
        printf("raw: 0x%.8x menschenlesbar: %d aufgehübscht %eV\n", i32Data, i32Data, i32Data *10.0 /INT32_MAX);
}


int main()
{
        zeich_mich_lesbar(0x80000000);
        zeich_mich_lesbar(0xFFFFFFFF);
        zeich_mich_lesbar(0x00000000);
        zeich_mich_lesbar(0x00000001);
        zeich_mich_lesbar(0x7FFFFFFF);

        return 0;
}
$ gcc -Wall main.c -o main
$ ./main 
raw: 0x80000000 menschenlesbar: -2147483648 aufgehübscht -1.000000e+01V
raw: 0xffffffff menschenlesbar: -1 aufgehübscht -4.656613e-09V
raw: 0x00000000 menschenlesbar: 0 aufgehübscht 0.000000e+00V
raw: 0x00000001 menschenlesbar: 1 aufgehübscht 4.656613e-09V
raw: 0x7fffffff menschenlesbar: 2147483647 aufgehübscht 1.000000e+01V

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

HTH und HF

Autor: Derda (Gast)
Datum:

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

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.