Ja der I2C Bus funktioniert noch.
Also die Kommunikation von der M32 Platine und der Base klappt einwandfrei.
Schade, ich vermute dass ich etwas beim Abrufen falsch mache aber ich habe leide keine Ahnung was.
Mfg Berghuhn
Druckbare Version
Ja der I2C Bus funktioniert noch.
Also die Kommunikation von der M32 Platine und der Base klappt einwandfrei.
Schade, ich vermute dass ich etwas beim Abrufen falsch mache aber ich habe leide keine Ahnung was.
Mfg Berghuhn
Hallo,
ich hatte nun endlich, nach langem rumprobieren einen Durchbruch!
Ich habe den Fehler gefunden, an dem es lag, dass immer nur ein Wert raus kam.
Ich bin eigentlich aus zufall darauf gekommen, bin aber daraus noch nicht schlau geworden.Code://bisherige Kompassadresse:
//#define MAG_ADDRESS (0x3C)
//funktionierende Kompassadresse:
#define MAG_ADDRESS (0x3C >> 1)
Wenn mir dass noch einer erklären kann wäre echt super :D .
MfG,
Berghuhn
Die I2C Adressen sind 7 Bit lang - das unterste bit wird für lesen/schreiben verwendet.
Achso, okay dann ergibt das sogar Sinn ^^.
Jetzt hätte ich noch eine frage zum Kalibrieren. Wie genau mache ich das?
Lege ich dabei einfach einen min, max Vektor fest?
Oder muss ich es schon in das register des LSM303DLH eintragen?
Wenn ja in welches?
Nach langer Zeit habe ich nun endlich wieder Zeit gefunden meinen RP6 auszugraben und daran weiter zu machen ^^.
der Kompass ist nur auf der M32 Platine angeschlossen und dass auslesen funktioniert fast ohne probleme ;D.
Mein Problem ist, dass beim auslesen immer folgender Error kommt:
I2C ERROR - TWI STATE: 0x20
dieser wird durch folgenden Code verursacht:
Danke schonmal im vorraus =)Code:
void read_data_raw(vector *a, vector *m)
{
// read accelerometer values
I2CTWI_transmitByte(0x30, 0x30);
I2CTWI_transmitByte(0x30, OUT_X_L_A);
unsigned char axl = I2CTWI_readByte(0x31);
I2CTWI_transmitByte(0x30, OUT_X_H_A);
unsigned char axh = I2CTWI_readByte(0x31);
I2CTWI_transmitByte(0x30, OUT_Y_L_A);
unsigned char ayl = I2CTWI_readByte(0x31);
I2CTWI_transmitByte(0x30, OUT_Y_H_A);
unsigned char ayh = I2CTWI_readByte(0x31);
I2CTWI_transmitByte(0x30, OUT_Z_L_A);
unsigned char azl = I2CTWI_readByte(0x31);
I2CTWI_transmitByte(0x30, OUT_Z_H_A);
unsigned char azh = I2CTWI_readByte(0x31);
// read magnetometer values
I2CTWI_transmitByte(MAG_ADDRESS, 0x3C);
I2CTWI_transmitByte(MAG_ADDRESS, OUT_X_H_M);
unsigned char mxh = I2CTWI_readByte(0x3D);
//I2CTWI_transmitByte(MAG_ADDRESS, OUT_X_L_M);
unsigned char mxl = I2CTWI_readByte(0x3D);
//I2CTWI_transmitByte(MAG_ADDRESS, OUT_Y_H_M);
unsigned char myh = I2CTWI_readByte(0x3D);
//I2CTWI_transmitByte(MAG_ADDRESS, OUT_Y_L_M);
unsigned char myl = I2CTWI_readByte(0x3D);
//I2CTWI_transmitByte(MAG_ADDRESS, OUT_Z_H_M);
unsigned char mzh = I2CTWI_readByte(0x3D);
//I2CTWI_transmitByte(MAG_ADDRESS, OUT_Z_L_M);
unsigned char mzl = I2CTWI_readByte(0x3D);
a->x = axh << 8 | axl;
a->y = ayh << 8 | ayl;
a->z = azh << 8 | azl;
m->x = mxh << 8 | mxl;
m->y = myh << 8 | myl;
m->z = mzh << 8 | mzl;
}
//...
// in der main ist noch folgendes:
I2CTWI_initMaster(100); // muss ich diese zahl evtl höher machen?
I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
DDRC = 0;
PORTC = (1 << PC1) | (1 << PC0); // enable pull-ups on SDA and SCL, respectively
Hallo,
was das 0x20 heisst findest Du in der RP6I2CMasterTWI.h aufgelistet dann wirds vermutlich klarer ;-)
(Not-Acknowledge (NACK) received!)
Die Adresse des Sensors ist 0x30 und nicht 0x31.
Die I2C Funktionen kümmern sich selbst ums setzen des Read/Write Bits.
MfG,
SlyD
Okay dass mit dem 0x20 hat sich geklärt danke =)
Meine Frage wäre nun,
könnte man mit einem 2D Kompass (wie z.B. der CMPS03 wenn er senkrecht hingestellt wird) auch die Inklination messen oder kann man damit nur die Deklination messen?
MfG,
Berghuhn
Elektrisch gesehen wird nur eine Feldstärke gemessen und aus welcher Richtung die kommt ist dem Modul recht egal... so lange es seine Lage/Winklel in der Feldlinie feststellen kann. Aber die Inklination misst man ja sinnvollerweise gegen die Pole... was dabei rum kommt wenn man das ganze um 90 Grad dreht.. also entlang der geographischen Breite misst.. keine Ahnung.. aber vermutlich nichts Sinnvolles. Dementsprechend wären Messungen im Bereich von 1 bis 89° bzw. -1 bis -89° Abweichung vom Nordpol mit steigender Abweichung schnell ungenauer. Das sagt mir zumindest die Logik.
LG Rolf