I²C,Wire.read,移位字节和提取值

时间:2013-04-10 11:42:00

标签: c++ eclipse optimization arduino

我想读一下加速度计的值。在加速度计的数据寄存器中,值存储在two's complement

Wire.read函数返回一个字节;这意味着返回正值。我必须组合两个字节并从16位保留14(向右移动>> 2)。这个值是两个补码。我只是读取了我存储在数组中的字节,然后我尝试将它们组合起来(没有函数来计算两个补码的转换)并将它们存储到int(我可能必须将它设置为int16_t)。

正如我所说,这应该是错误的,因为这应该只返回正值,但我也得到负值。我可以说我不在乎,但我担心如果我做错了什么并且使价值变为负值,并且与逻辑问题的正确值不同。

代码是:

我用这段代码读了加速度计和值:

void BMA180Acc::readAccel() {
    int n = 6;
    byte result[6];
    readRegValue(DATA, n, result);

    int x = (( result[0] | result[1]<<8)>>2);
    Serial.println(x);
    if (x&0x2000) {
        x = x|0xc000;
    }
    xAxes = x*(getSensivity()/8192.0);

    int y = (( result[2] | result[3]<<8)>>2);
    if (y&0x2000) {
        y = y|0xc000;
    }
    yAxes = y*(getSensivity()/8192.0);

    int z = (( result[4] | result[5]<<8)>>2);
    if (z&0x2000) {
        z = z|0xc000;
    }
    zAxes = z*(getSensivity()/8192.0);
}

getSensitivity()设置为返回枚举的int(这不是问题)。

函数readRegValue()也是:

void BMA180Acc::readRegValue(int adr,int addcount,byte buffer[]) {
      Wire.beginTransmission(BMA180);
      Wire.write(adr);
      Wire.endTransmission();
      Wire.requestFrom((int)BMA180, addcount);
      int i = 0;
      while (Wire.available())
      {
          buffer[i] = Wire.read();
          i++;
      }
      Wire.endTransmission();
}

结果是:

  553
  580
  636
-1311
 -271
  418
 2029
 2020
  411
 2969
-7633
 1650
 6210
 7878
-1222
-5030
-3733
  282
-5006
-4806

结果位于Serial.print内的readAccel()

0 个答案:

没有答案