0

構造体を関数に(参照により)渡し、その関数に構造体のいくつかの値を設定しようとしています。

構造体は次のとおりです。

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
}
4

1 に答える 1

1

これは fprintf 実装の「機能」にすぎないのでしょうか?

fprintf(COM_A,"x: %d\ty: %d\tz: %d\r\n", s->ax, s->ay, s->az);

フォーマット文字列は、3 つの int を提供することを示していますが、代わりに 3 BYTE を提供しています。fprintf の実装が 2 番目と 3 番目の引数に対して間違ったアドレスを生成する可能性があります。

于 2012-07-21T14:02:41.413 に答える