私が使用している化学実験室で行っている研究プロジェクトとADS8320チップ(データシートはhereです。私はProcessing.orgからthis codeを使用してデータを取得することができたもののラズベリーパイ3.上のSPIピン:私が取ったときに、私は65535の値を取得する必要があるデータシートに読んだから処理中のSPIデータでのビットシフトの使用
import processing.io.*;
SPI adc;
void setup() {
//printArray(SPI.list());
adc = new SPI(SPI.list()[0]);
adc.settings(500000, SPI.MSBFIRST, SPI.MODE0);
}
void draw() {
// read in values over SPI from an analog-to-digital
// converter
// dummy write, actual values don't matter
byte[] out = { 0, 0 };
byte[] in = adc.transfer(out);
// some input bit shifting according to the datasheet
int val = ((in[0] & 0x1f) << 5) | ((in[1] & 0xf8) >> 3);
// val is between 0 and 1023
println(val);
}
私は最高の電圧をとるときに127の値を得ています。良いプログラマーがほぼ一ヶ月前にそれを選んだわけではありませんが、問題はビットシフトラインにあると思います:
int val = ((in[0] & 0x1f) << 5) | ((in[1] & 0xf8) >> 3);
これが問題になる場合は、どうすれば16ビットADSチップで動作するように設定できますか?このビットシフトが実際に何のためにあるのかを説明することもできます。私が見つけたすべての情報源が私をもっと混乱させたからです。これに関する助けがあれば助けになるでしょう!また、私が重要な情報を紛失している場合は、私に知らせてください。
[あなたのプログラムをデバッグする](http://happycoding.io/tutorials/processing/debugging)と[mcve]にあなたの問題を絞り込むと、もっとうまくいくでしょう。 'in [0]'と 'in [1]'の値は何ですか?彼らはあなたが期待しているものですか?複雑な行を複数のステップに分割します。どちらのステップが期待どおりに動作していませんか?あなたが立ち往生した場合、追加のデータを読み込むことなく、そのカップルラインの[mcve]を投稿することができます。代わりに値をハードコーディングしてください。 –
恐ろしい私はそれを分割し、私が価値を得ることができないかどうかを見ます。ラインは非常に複雑で、私はトンを混乱させた。私はそれを分割して、動作するコードを得ることができないか、少なくともあなたのためのより簡潔な例を持っているかどうかを見ていきます。 – Samsanit
データシートの24ページによると、最初の6ビットと最後の2ビットを破棄し、2ではなく3バイトを読み込む必要があるかもしれません。結果として、あなたのビットシフト式は '' 'のように変わります。int val =(in [0]&0x03)<< 14)| ([1] << 6)| ([2]&0x3f); '' 'Wikipediaはビットシフト操作を含む[Cのビット演算](https://en.wikipedia.org/wiki/Bitwise_operations_in_C#Shift_operators)について話します。 – v1bri