PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 16bit Daten teilen und zusammensetzen [erledigt]



robo junior
11.04.2007, 23:18
Hallo

Ich möchte 16bit Daten per I2C übertragen. Dafür zerlege ich eine 16bit Variable so:


wert_h = (int8_t)(wert<<8)
wert_l = (int8_t)(wert)

stimmt das soweit?

dann schicke ich zuerst wert_h und dann wert_l per I2C.
Wie muss ich denn jetzt die beiden Werte am anderen Controller wieder zusammensetzen? Hab momentan noch meine Probleme mit den ganzen Bitsachen in C. Wär nett wenn ihr mir da weiterhelfen könntet.

izaseba
11.04.2007, 23:57
stimmt das soweit?


Leider nein,
im wert_h steht bei Dir immer 0 und zwar schiebst Du wert 8 Stellen nach links, dabei rutschen von rechts 8 Nullen rein und mit dem Cast schneidest Du die oberen 8 Stellen ab.
Was bleibt über ? Null...



wert_h = (int8_t)(wert>>8);

wäre richtig gewesen.

zusammensetzen ist auch einfach


int16_t wert= (wert_h<<8)|wert_l;


Was hälst Du von einer Union:


typedef union {
int16_t wert;
int8_t wert_bytes[2];
} eine_zahl;


zugriff:

eine_zahl test;
test.wert=1234;

i2c_send (test.wert_bytes[0]); // sendet die unteren 8 Bytes
i2c_send (test.wert_bytes[1]); //sendet die oberen 8 Bytes


Auf der andern Seite machst Du das genauso, die erste Zahl in bytes[0] und die zweite in bytes[1] packen, mit test.wert kannst Du auf Deine 16 Bit Zahl zugreifen.

Gruß Sebastian

robo junior
12.04.2007, 00:05
super, vielen Dank funktioniert jetzt.
Habs allerdings ohne union gemacht sondern einfach mit zwei Variablen, da ich das bei mir eh alles in einer eigenen I2C Funktion verpackt habe, die nur den 16bit Wert bekommt und diesen dann teilt und verschickt.

izaseba
12.04.2007, 17:20
Habs allerdings ohne union gemacht sondern einfach mit zwei Variablen
Ja 16 Bit sind einfach zerlegt, da zeigt die Union vielleicht nicht ganz so ihre Stärken, aber wenn Du mal 32 Bit zerlegen mußt, behalte sie im Hinterkopf :wink:

Gruß Sebastian