mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 3 byte zu 24 bit


Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,


ich lese mit einem MSP430F2232 über SPI einen analogen Spannungswert 
ein, der mit einem 24 bit AD-Wandler gemessen wurde.
Der AD-Wandler schickt nach Anfrage des Wertes 3 Bytes (Most 
significant-, Mid - und Least significant Byte). Zusammen also meine 24 
bit.
Mein Problem ist, ich weiß nicht (bin Anfänger), wie ich aus den 3 Bytes 
nun den Spannungsbetrag mache.

Im Moment versuche ich es mit folgendem Code (ich nutze IAR Kickstart):
 "ADS_RXTX(command);                       //send command
  value1=ADS_RXTX(0x00);                   //send clock
  value2=ADS_RXTX(0x00);                   //send clock
  value3=ADS_RXTX(0x00);                   //send clock

 big=value2 | (value3<<8) | ((unsigned long)value4<<16);"

"ADS_RXTX()" sendet die Anfrage an den AD-Wandler und gibt den Wert vom 
AD-Wandler zurück. "0x00" soll dann keine Nachricht schicken, sondern 
nur eine clock erzeugen, damit der AD-Wandler seine Werte schicken kann. 
Die 3 Bytes lege ich dann also in den Variablen value1, value2 und 
value3 (alle als "unsigned char" deklariert). Z.B. kommen dann folgende 
Werte in den Variablen vor:
value1: 0x18
value2: 0xFE
value3: 0x71

Daraus hätte ich gerne in der Variable big (deklariert als "unsigned 
long") den dezimalen Wert. Hier also 18FE71hex=1638001dec.

Hat jemand eine idee, wies funktioniert?


Vielen Dank,
Björn

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
long big;
unsigned char value1,value2,value3;
...
...
ADS_RXTX(command);                       //send command
value1=ADS_RXTX(0x00);                   //send clock
value2=ADS_RXTX(0x00);                   //send clock
value3=ADS_RXTX(0x00);                   //send clock

big = (value1<<16) | (value2<<8) | value3;
Geht zumindest bei mir.
evtl. auch noch etwas zur Sicherheit Casten
big = (unsigned long)(value1<<16) | (unsigned int)(value2<<8) | value3;

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timmo H. wrote:
> evtl. auch noch etwas zur Sicherheit Casten
>
> big = (unsigned long)(value1<<16) | (unsigned int)(value2<<8) | value3;
> 
Der erste cast ist bei einer 8- oder 16-Bit-Plattform i.d.R. immer 
erforderlich (bei allen Plattformen, in denen int nur 16 Bit lang 
ist), da das Schieben um 16 Stellen sonst ins Nirvana geht. Der zweite 
cast ist sinnvoll (ein einfaches unsigned dürfte aber reichen), da bei 
Schiebeoperationen bei signed-Werten die Vorzeichenbehandlung nicht 
festgelegt ist.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>big = (unsigned long)(value1<<16) | (unsigned int)(value2<<8) | value3;

Ich würde das so machen

big = ((unsigned long)value1<<16) | ((unsigned int)value2<<8) | value3;

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger wrote:
>>big = (unsigned long)(value1<<16) | (unsigned int)(value2<<8) | value3;
>
> Ich würde das so machen
>
> big = ((unsigned long)value1<<16) | ((unsigned int)value2<<8) | value3;
Da hast Du völlig Recht! Ich hatte die falsche Klammerung oben glatt 
übersehen. Die Werte müssen natürlich vor dem Schieben konvertiert 
werden!

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde das ganz ohne Schiebereien machen mit einer Union:
Einziger Nachteil: nicht ohne Prüfung auf andere Systeme (Endianess) 
übertragbar.

Vorteil: sehr schnell und kompakt
z.B. Beitrag "Re: 3 bytes in einen Datentyp"

Was lernen wir daraus: zuerst suchen, dann fragen.

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.