www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 3 hex bytes zu 1 dezimalwert umrechnen


Autor: Björn W. (bjoern2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ich schon wieder! Ein Problem jagt das nächste...

Ich bekomme von meinem 24bit AD Wandler 3bytes zurück, die ich in die 
gemessene Spannung umrechnen möchte (z.B. 7b, 6c, 9d). Am liebsten nach 
folgendem Schema:

     D:  13 ·       1 =       13
     9:   9 ·      16 =      144
     C:  12 ·     256 =     3072
     6:   6 ·    4096 =    24576
     B:  11 ·   65536 =   720896
     7:   7 · 1048576 =  7340032
                        ————————
                         8088733

Nur verstehe ich ncoh nicht, wie ich die 3 einzelnen bytes zerlegen kann 
und dann damit weiterrechen soll...

Hat jemand einen Vorschlag?

MfG
Björn

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Björn W. (bjoern2007)

>Ich bekomme von meinem 24bit AD Wandler 3bytes zurück, die ich in die
>gemessene Spannung umrechnen möchte (z.B. 7b, 6c, 9d). Am liebsten nach

>Nur verstehe ich ncoh nicht, wie ich die 3 einzelnen bytes zerlegen kann

Warum zerlegen? Du musst sie eher zusammenführen.

unsigned long big;

big = value1 <<16L | value2 <<8L | value3;

>und dann damit weiterrechen soll...

Festkommaartihmetik

MfG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Björn W. wrote:

> Nur verstehe ich ncoh nicht, wie ich die 3 einzelnen bytes zerlegen kann
> und dann damit weiterrechen soll...

Garnicht.

Die Bytes sind ja schon binär und damit im richtigen Format jeder CPU.

Unter C mußt Du sie nur auf 32 Bit erweitern, da C keinen 24Bit-Typ 
kennt.
unsigned long val = byte0 | (byte1 <<8) | ((unsigned long)byte2 << 16);


Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht besser mit Klammern, bei C kann das bisweilen schief gehen.

big = (value1 <<16L) | (value2 <<8L) | value3;

Das L ist so ein Trick den man wissen muss, damit werden die 
Schiebeoperationen in 32 Bit long durchgeführt. Ohne würden sie implizit 
in 16 Bit INT durchgeführt und zumindest des höchstwertige Byte würde im 
Nirvana landen. Böser Fehler.

MfG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:

> Das L ist so ein Trick den man wissen muss, damit werden die
> Schiebeoperationen in 32 Bit long durchgeführt.


Hab ich eigentlich auch so gelernt, daß der Ergebnistyp immer der größte 
aus beiden Operanden ist.

Aber einmal bin ich damit furchtbar auf die Fresse gefallen. Eine 
WINAVR-Version hat sich nur am Typ des linken Operanden orientiert und 
das L des rechten Operanden ignoriert. Seitdem caste ich jetzt immer den 
linken Operanden.

Muß mal probieren, ob der aktuelle WINAVR es wieder richtig macht.


Peter

Autor: Björn W. (bjoern2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das scheint schon mal zu klappen.

Aber aus z.B. 0x78, 0x37, 0xF9 wird 14329.

Wenn ich 14329 wieder in Hex manuell umwandle, erhalte ich 0x37F9. Das 
würde bedeuten, daß die 0x78 verloren gehen...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Björn W. (bjoern2007)

>Wenn ich 14329 wieder in Hex manuell umwandle, erhalte ich 0x37F9. Das
>würde bedeuten, daß die 0x78 verloren gehen...

Wie Peter feststellte scheinen einge Compiler da etwas nachlässig zu 
sein. Versuch mal das was Peter schrieb.

MfG
Falk

Autor: Björn W. (bjoern2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jau, das funktioniert. Jetzt werden alle bytes verwendet.

Danke euch allen...

Autor: Björn W. (bjoern2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie kann ich das jetzt in meine Spannung umrechnen? ich müsste es 
nur ncoh mit 196 multiplizieren und hätte dann einen Wert in nV.

Nur, wie geht das?

big = big * 196;

irgendwie mag der uC das nicht...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Björn W. (bjoern2007)

>big = big * 196;
>irgendwie mag der uC das nicht...

müsste gehen, einen Überlauf macht das bei UNSIGNED long eigentlich 
nicht.
GGf. schau mal im Handbuch vom Compiler nach.

MFG
Falk

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.