Ja ich verwende die M32 Platine als Master. Die Kommunikation funktioniert so wie immer, es kommen zumindest auch keine Fehler.
Ja ich verwende die M32 Platine als Master. Die Kommunikation funktioniert so wie immer, es kommen zumindest auch keine Fehler.
@Berghuhn:
Du machst es dir aber echt schwer, indem du alle Ratschläge jeweils nur zu 50% umsetzt und sonst wieder eigene Wege gehst...
Probier doch einfach mal das Beispiel, das ich als Post #17 verlinkt habe, auf der RP6Base aus, so wie es ist. Wenn das funktioniert, ist schonmal die Hardware ok.
Wenn du die M32 anstelle der RP6Base benutzen willst, müßte die Demo nur leicht angepaßt werden.
Gruß
Dirk
Verwenden sie fur Lesen und Schreiben ein anders Adress ? Aus den Datasheet :For magnetic sensor, the default (factory) 7-bit slave address is 0011110b(0x3C) for write operations, or 00111101b (0x3D) for read operations.
Moglich ist das schon in die I2Clib forgesehen, muss du mal nachshauen.
So ich habe wie empfohlen den Kompass nun erstmal an die Base angeschlossen.
Hier mal mein Code (testweise nur für X Werte):
So das ganze funktioniert nun schonmal (zumindest bekommen ich erste WerteCode:void LSM303Init() { I2CTWI_transmitByte(MAG_ADDRESS, 0x3C); I2CTWI_transmitByte(MAG_ADDRESS, 0x02); I2CTWI_transmitByte(MAG_ADDRESS, 0x00); } int main(void) { initRobotBase(); I2CTWI_initMaster(400); // 400kHz I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); setLEDs(0b111111); mSleep(500); setLEDs(0b000000); powerON(); LSM303Init(); PORTC &=~SCL; PORTC &=~SDA; DDRC &=~SDA; DDRC &=~SCL; unsigned char ACC_Data[6]; while(true) { task_I2CTWI(); // Call I2C Management routine task_RP6System(); I2CTWI_transmitByte(MAG_ADDRESS, 0x3C); I2CTWI_transmitByte(MAG_ADDRESS, OUT_X_H_M); ACC_Data[0] = I2CTWI_readByte(0x3D); I2CTWI_transmitByte(MAG_ADDRESS, 0x3C); I2CTWI_transmitByte(MAG_ADDRESS, OUT_X_L_M); ACC_Data[1] = I2CTWI_readByte(0x3D); writeString_P("--------------------------- \n"); writeString_P("X High: \n"); writeIntegerLength(ACC_Data[0], DEC, 10); writeString_P("\nX Low: \n"); writeIntegerLength(ACC_Data[1], DEC, 10); writeString_P("\n--------------------------- \n"); mSleep(5000); }).
für X High:
0000000000
X Low:
0000000032
Egal wie der Kompass geneigt ist es kommen immer die selben. (Bei Y Werten kommen ebenfalls die selben daten wie bei den x Werten)
Geändert von Berghuhn (21.12.2011 um 22:08 Uhr) Grund: etwas hinzugefügt
Dirk schrieb:
Probier doch einfach mal das Beispiel, das ich als Post #17 verlinkt habe, auf der RP6Base aus, so wie es ist.
Gruß
Dirk
Da ich in letzter Zeit etwas viel zu tun hatte kann ich nun endlich die Arbeit mit dem Kompass fortsetzen.
Ich habe das Beispiel so wie es ist einfach mal so übernommen und die Speicheradressen angepasst.
Nun bekomme ich in unregelmäßigen abständen folgende Werte:
819.2 Grad
003.2 Grad
000.0 Grad
immerhin nicht immer das gleiche aber wirklich Sinn ergibt das ganze noch nicht Bild hier
Geändert von Berghuhn (06.02.2012 um 06:12 Uhr)
Edit: Okay die Werte kommen doch in einem regelmäßigen Abstand. Kann es sein, dass der Kompass defekt ist?
Was sind die Register Werte die du auslest ? Kann es sein das die Berechnung nach Graden nicht stimmt ?
Lesezeichen