2

Arduino マイクロ コントローラーをプログラミングしていて、後で使用するために加速度計センサー データを受け入れるためのコードを見つけました。次のコード以外はすべて理解できます。何が起こっているのかについてある程度の直感を持ちたいのですが、検索して読んでも、何が起こっているのか頭を悩ませて本当に理解することはできません.

私は C++ のクラスを受講しましたが、ビットごとの操作やビット シフトなど、あなたがそれを呼びたいものはほとんどありませんでした。私が理解していると思うことを説明してみましょう。必要なところを修正してください。

そう:

  1. xに値を格納していると思いますが、実際にはかなり確かです。
  2. スロット番号 1 の配列「buff」のデータは、整数のデータ型に設定されているようです。
  3. スロット 1 の値は左に 8 桁ビット シフトされています (これはスロット 0 をバフすることを指していますか?)

この新しい値はバッファ スロット 0 のデータと比較され、いずれかのビットが true の場合、x に格納されているデータのビットも true になるため、0 と 1 = 1、0 と 0 = 0 と 1 と 0 =最後に保存された値の 1。

コードは、x、y、z の 3 つの軸すべてに対してこれを行いますが、理由がわかりません...助けが必要です。先に進む前に、完全に理解したいと思います。

//each axis reading comes in 10 bit resolution, ie 2 bytes.  
// Least Significant Byte first!!
//thus we are converting both bytes in to one int
x = (((int)buff[1]) << 8) | buff[0];   
y = (((int)buff[3]) << 8) | buff[2];
z = (((int)buff[5]) << 8) | buff[4];
4

4 に答える 4

4

このコードは、生の加速度計データ (6 バイトの配列内) を 3 つの 10 ビット整数値に変換するために使用されています。コメントにあるように、データは LSB ファーストです。あれは:

buff[0] // least significant 8 bits of x data
buff[1] // most significant 2 bits of x data 
buff[2] // least significant 8 bits of y data
buff[3] // most significant 2 bits of y data 
buff[4] // least significant 8 bits of z data
buff[5] // most significant 2 bits of z data 

ビット単位の演算子 2 を使用して、2 つの部分を 1 つの変数にまとめます。型キャストは不要であり、(int)(IMHO) 紛らわしいです。この単純化された式:

x = (buff[1] << 8) | buff[0];

にデータを取り込み、buff[1]左に 8 ビット シフトしてからbuff[0]、そのように作成されたスペースに からの 8 ビットを配置します。例として、10 ビットaにラベルを付けてみましょう。j

buff[0] = cdefghij
buff[1] = 000000ab

それで:

buff[1] << 8 = ab00000000

と:

buff[1] << 8 | buff[0] = abcdefghij
于 2013-08-20T20:23:18.567 に答える
1

スロット 1 の値は左に 8 桁ビット シフトされています (これはスロット 0 をバフすることを指していますか?)

いや。ビット演算子はポインター演算ではありません。この 2 つを混同しないでください。左に桁をシフトするNことは、(大まかに) 2 を 4 乗することと同じですN(ただし、C のいくつかのコーナー ケースを除きますが、それらについてはまだ説明しません)。

この新しい値はバッファ スロット 0 のデータと比較され、いずれかのビットが true の場合、x に格納されているデータのビットも true になります。

No.|は論理 OR 演算子 (つまり||) ではなく、ビットごとの OR 演算子です。コードが行うのは、2 バイトを 1 つの 2 バイト整数に結合するbuff[0]ことbuff[1]だけです。ここbuff[1]で、 は数値の MSB を示します。

于 2013-08-20T20:20:27.520 に答える
0

デバイスの結果は 6 バイトで、バイトを 3 つの整数 (最大で 10 ビットしか使用できない値を持つ) に再配置する必要があります。

したがって、最初の 2 バイトは次のようになります。

00: xxxx xxxx <- binary value
01: ???? ??xx

??? xxx 部分は 10 ビットを構成するため、部分は結果の一部ではありません。ハードウェアは、??? 部分はすべてゼロビットです。

これを 1 つの整数変数に入れるには、下位 8 ビットすべてと上位 2 ビットが必要で、下位 8 ビットと干渉しないように左に 8 桁シフトされます。論理 OR (| - 垂直バー) は、これら 2 つの部分を次のような 1 つの整数に結合します。

x: ???? ??xx xxxx xxxx <- binary value of a single 16 bit integer

この場合、残りのビット (16 を超える) はゼロになるため、実際には「int」が (ビット単位で) どれだけ大きいかは問題ではありません。

于 2013-08-20T20:24:15.457 に答える