화학 실험실에서 사용하고있는 연구 프로젝트에서 우리는 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]를 게시 할 수 있습니다. 대신 값을 하드 코딩하십시오. –
신난다. 나는 그것을 나눌 것이고, 내가 가치를 얻을 수 없는지 알 것이다. 그 선은 매우 복잡했고 나에게 1 톤을 혼란스럽게했다. 나는 그것을 나눠서 작동 코드를 얻지 못했는지, 아니면 적어도 더 나은 간결한 예제가 있는지 살펴볼 것이다. – 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