構造体を関数に(参照により)渡し、その関数に構造体のいくつかの値を設定しようとしています。
構造体は次のとおりです。
struct Sensor
{
BYTE accel_data[6];
BYTE gyro_data[6];
int ax;
int ay;
int az;
int gx;
int gy;
int gz;
};
main() の宣言は次のとおりです。
struct Sensor s;
関数へのパスは次のとおりです。
readAccel(&s);
readAccel 関数:
void readAccel(struct Sensor* s)
{
int ax, ay, az;
// Read data from Accelerometer Chip
i2c_multiRead(ACCEL_READ_ADDR, ACCEL_DATA_ADDR, s->accel_data, 6);
ax = make16(s->accel_data[1],s->accel_data[0]);
ay = make16(s->accel_data[3],s->accel_data[2]);
az = make16(s->accel_data[5],s->accel_data[4]);
fprintf(COM_A,"x: %d\ty: %d\tz: %d\r\n", ax, ay, az);
s->ax = ax;
s->ay = ay;
s->az = az;
fprintf(COM_A,"x: %d\ty: %d\tz: %d\r\n", s->ax, s->ay, s->az);
}
何らかの理由で、readAccel() の下部にある 3 つの割り当て行が機能していません。最初の print ステートメントは、正しい加速度計の値を示します。2 番目の print ステートメントは x の正しい値を示しますが、y はジャンク値であり、z は常に 0 です。
これは、pic マイクロチップ上で実行される、わずかに非標準の c (ccs c コンパイラ) です。コンパイラにはいくつかの癖があります (int は 16 ビット、すべての変数は関数の先頭で宣言する必要があるなど) が、これが機能しない理由であるとは思いません (可能だとは思いましたが)。 )。
お時間を割いていただきありがとうございます。
編集:
i2c_multiread 関数は次のとおりです。
void i2c_multiRead(char deviceAddrR, char registerAddr, BYTE data[], int numBytes)
{
int x;
i2c_start();
i2c_write(deviceAddrR-0b00000001);
i2c_write(registerAddr);
i2c_start();
i2c_write(deviceAddrR);
for(x=0; x<numBytes-1; x++)
{
data[x]=i2c_read();
}
data[numBytes-1] = i2c_read(0); //NACK on last read
i2c_stop();
}
void main ()
{
struct Sensor s;
int raw_accel_data[6];
int i, data;
char data_ready;
fprintf(COM_A,"keyspan working \n\r");
initAccel(&s);
//initGyro(&s);
fprintf(COM_A,"ALL SYSTEMS GO (accel initialized successfully)\n\r");
while(true) {
//data_ready = i2c_singleRead(ACCEL_READ_ADDR,ACCEL_INT_MAP);
//data_ready = data_ready >> 7;
readAccel(&s);
//readGyro(&s);
//displayGyroData(&s);
//displayGyroRawData(&s);
delay_ms(100);
}
// Address of ITG (Gyro Chip)
// Read: 0xD1
// Write: 0xD0
}