Forum: Mikrocontroller und Digitale Elektronik Problem bei Umrechnung von MSL/LSB in 12 bit Messwert


von Martin S. (keniff)


Lesenswert?

hey zusammen!

steh jetzt schon seit stunden vor dem genannten problem!

hab an einem ATmega32 ein lasersensor, der messdaten in 2 byte 
verschickt.

das problem dabei ist der komische aufbau der beiden bytes (MSB/LSB):

byte1: 1 - D13 - D12 - D11 - D10 - D9 - D8 - D7
byte2: 0 - D6  - D5  - D4  - D3  - D2 - D1 - D0

wobei D13 und D12 immer den wert 0 haben.
das ergebnis sollte dann so aussehen:

0-0-D13-D12-D11-D10-D9-D8-D7-D6-D5-D4-D3-D2-D1-D0

würd dann auf nen interger wert von 0-4096 kommen

hab mir schon alle möglichen threads angesehn, was bit operatoren und 
byte verrechnung betrifft, nur hats nicht wirklich weitergeholfen.

kennt sich da einer besser mit aus und würde mir die thematik mal näher 
bringen, oder kann mir sagen, wie ich den hebel ansetzen muss?! ,-)

vielen lieben dank! gruß keniff

von Johannes M. (johnny-m)


Lesenswert?

Wo ist das Problem? byte1 um 7 Stellen nach links schieben (in einer 
16-Bit-Variable) und byte2 dazuODERn. Wie das in der von Dir 
verwendeten, geheimnisvollen Programmiersprache aussieht, kann ich Dir 
leider nicht sagen...

von Hoch das Glas (Gast)


Lesenswert?

Etwas mager... Das Byte 1 um 1 byte nach recht verlaengern, dann 1 
position nach rechts schieben, dann byte2 hinzuzaehlen (ODERn)

von Gast (Gast)


Lesenswert?

Hallo,

in C : word = byte2 | (byte1<<7)

von Johannes M. (johnny-m)


Lesenswert?

1
  byte1: 0   0   0   0   0   0   0   0  1  D13 D12 D11 D10 D9  D8  D7
2
  um 7 Stellen nach links:
3
  byte1: 0   1  D13 D12 D11 D10 D9  D8  D7  0   0   0   0   0   0   0  
4
  Die 1 vorne weg:
5
  byte1: 0   0  D13 D12 D11 D10 D9  D8  D7  0   0   0   0   0   0   0
6
| byte2: 0   0   0   0   0   0   0   0   0 D6  D5  D4  D3  D2  D1  D0
7
---------------------------------------------------------------------
8
=>       0   0  D13 D12 D11 D10 D9  D8  D7 D6  D5  D4  D3  D2  D1  D0

von Gast (Gast)


Lesenswert?

also gut,

in C : word = (byte2 | (byte1<<7) & 0x3fff;

von Martin S. (keniff)


Lesenswert?

wow ihr götter! 4 antworten in 10 minuten! not bad ,-)
ja, vergess es immer zu erwähnen
progge mit winvar in c.

@johannes: super danke du sack! dein diagramm is so verständlich, dass 
mir jetz die frage peinlich ist ;-)
nee, im ernst, echt danke an alle für so schnelle und präzise antworten!

werds gleich ma testen...

gruß keniff

von Jean P. (fubu1000)


Lesenswert?

Hi,

unsigned int erg = (((unsigned int) (byte1 & 0x1F)) << 7) + byte2;

Sollte gehen.

Gruß

von Johannes M. (johnny-m)


Lesenswert?

Martin S. wrote:
> @johannes: super danke du sack!
Das nehm ich persönlich...

von Martin S. (keniff)


Lesenswert?

ja, komplimente sollte man persönlich nehmen ;-)
nomma thx an alle, lief auf anhieb!
gruß ken

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.