Hi inka,
Ich habe jetzt die normalize funktion "leergemacht", es ist alles auskommentiert bis auf {}. Nun läuft die compilierung fehlerfrei durch und auch das programm läuft durch - natürlich mit nicht normalisierten werten...
Das ist gut.
Du könntest jetzt noch probieren, ob du den Inhalt der normalizeLSM303DLHC_M()-Funktion ans Ende der Funktion readLSM303DLHC_M() stellen kannst.
Die sähe dann so aus:
Code:
void readLSM303DLHC_M(void)
{
uint8_t readBuf[6];
I2CTWI_transmitByte(I2C_MULTIIO_LSM303DLHC_M_ADR, OUT_X_H_M);
I2CTWI_readBytes(I2C_MULTIIO_LSM303DLHC_M_ADR, readBuf, 6); // Read X-/Y-/Z-axis
// xb = y:
x_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] << 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];
// yb = -x:
y_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] << 8) + readBuf[OUT_X_L_M - OUT_X_H_M];
y_axism *= -1;
// zb = z:
z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] << 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];
mSleep(10);
#ifdef GET_TEMP_M
// Read temperature raw value:
I2CTWI_transmitByte(I2C_MULTIIO_LSM303DLHC_M_ADR, TEMP_OUT_H_M);
readBuf[0] = I2CTWI_readByte(I2C_MULTIIO_LSM303DLHC_M_ADR);
I2CTWI_transmitByte(I2C_MULTIIO_LSM303DLHC_M_ADR, TEMP_OUT_L_M);
readBuf[1] = I2CTWI_readByte(I2C_MULTIIO_LSM303DLHC_M_ADR);
temperaturem = ((readBuf[0] << 8) + readBuf[1]) / 16;
mSleep(10);
#endif
// Add hard iron offsets:
x_axism += OFFSET_X_M;
y_axism += OFFSET_Y_M;
z_axism += OFFSET_Z_M;
// Scale raw values:
xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;
ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;
zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;
}
Wenn das so läuft, hättest du Glück: Du könntest dann auch kalibrieren.
Könnte es hier nicht ähnlich sein, dass eine für die funktion erforderliche avr-grundfunktion bei mir nicht verfügbar ist
Das weiß ich nicht. Die besten Chancen hättest du sicher, wenn du die GNU GCC Tool-Chain verwenden würdest, falls das unter Linux geht. Unter Windows ist das mit Code:Blocks möglich. Dann wäre das ja der gleiche Kompiler, den ich auch verwende.
Lesezeichen