@Berghuhn,
hier: https://www.roboternetz.de/community...vantech-CMPS03
... gab es schon mal ein Programmbeispiel für den CMPS03.
@Berghuhn,
hier: https://www.roboternetz.de/community...vantech-CMPS03
... gab es schon mal ein Programmbeispiel für den CMPS03.
Gruß
Dirk
OKay... danke =)Dirk@Berghuhn,
hier: https://www.roboternetz.de/community/...vantech-CMPS03
... gab es schon mal ein Programmbeispiel für den CMPS03.
werd das nacher mal ausprobieren
Ja ich muss es dann wohl mit Define machen ^^RP6conradNormalerweise programmieren sie so etwas in der 'Main' Schleife. Al sie Functionen sind programmiert in die lib von RP6, die muss du nicht neu einprogrammieren. Wichtig : das I2C Kompass hat eine bestimmte Adresse. Das muss naturlich eingegeben werden : sieht dan so aus : [c]// Define the addresses of our devices - in this simple example we only have
// our PCF8574:
#define PCF8574_8LEDS_ADR 0x70
// With this routine we write the data byte to the PCF8574 port:
I2CTWI_transmitByte(PCF8574_8LEDS_ADR, (~runningLight) );
// We need to invert the bits with "~" because the LEDs are
// switched on when the port is LOW. The PCF8574 can only sink
// up to 25mA of current. It is only able to source about 300µA
// of current. Thus you need to connect the cathode of the LED
// to the ports - in series with a 1K or 2K2 resistor connected to
// VDD.[/c]
So wird dan eine Byte nach das I2C Slave gesendet. Gelesen wird dan mit : I2CTWI_requestDataFromDevice(SRF_ADR, MEASURE_US_HIGH, 1);
Ist das Kompass mit der RP6 verbunden, oder mit beide (RP6 /M32).
Welchen compilierfehler hasst du ?
Nein ich habe keinen Compilierfehler. Es Compiliert alles ganz normal so wie sonst.
Also,
jetzt habe ich das ganze mal über die defines gemacht:
Code:#ifndef LSM303 #define LSM303 #define ACC_ADDRESS (0x30) #define MAG_ADDRESS (0x3C) #define CTRL_REG1_A (0x20) #define CTRL_REG2_A (0x21) #define CTRL_REG3_A (0x22) #define CTRL_REG4_A (0x23) #define CTRL_REG5_A (0x24) #define HP_FILTER_RESET_A (0x25) #define REFERENCE_A (0x26) #define STATUS_REG_A (0x27) #define OUT_X_L_A (0x28) #define OUT_X_H_A (0x29) #define OUT_Y_L_A (0x2A) #define OUT_Y_H_A (0x2B) #define OUT_Z_L_A (0x2C) #define OUT_Z_H_A (0x2D) #define INT1_CFG_A (0x30) #define INT1_SOURCE_A (0x31) #define INT1_THS_A (0x32) #define INT1_DURATION_A (0x33) #define INT2_CFG_A (0x34) #define INT2_SOURCE_A (0x35) #define INT2_THS_A (0x36) #define INT2_DURATION_A (0x37) #define CRA_REG_M (0x00) #define CRB_REG_M (0x01) #define MR_REG_M (0x02) #define OUT_X_H_M (0x03) #define OUT_X_L_M (0x04) #define OUT_Y_H_M (0x05) #define OUT_Y_L_M (0x06) #define OUT_Z_H_M (0x07) #define OUT_Z_L_M (0x08) #define SR_REG_M (0x09) #define IRA_REG_M (0x0A) #define IRB_REG_M (0x0B) #define IRC_REG_M (0x0C) ////////////////////////////////////// void LSM303Init() { //enable magnetometer i2c_start(); i2c_write_byte(0x3C); // (MAG_ADDRESS) i2c_write_byte(0x02); // MR_REG_M i2c_write_byte(0x00); i2c_stop(); } #endif
und in der Main versuche ich dann die Daten so zu lesen:
Code:.... unsigned char Kompass_Data[6]; LSM303Init(); ..... i2c_start(); i2c_write_byte(0x3C); i2c_write_byte(OUT_X_H_M); // Select register OUT_X_H_M i2c_start(); i2c_write_byte(0x3D); Kompass_Data[0] = i2c_read_byte(); Kompass_Data[1] = i2c_read_byte(); Kompass_Data[2] = i2c_read_byte(); Kompass_Data[3] = i2c_read_byte(); Kompass_Data[4] = i2c_read_byte(); Kompass_Data[5] = i2c_read_last_byte(); i2c_stop();
Doch mein Problem hat sich dadurch immer noch nicht gelöst.
er belibt wie davor in dieser Zeile beim ausführen hängen:
i2c_write_byte(0x3C);
Ich habe aber keine Compiler fehler oder ähnliches.
@Berghuhn:
Der RP6 bringt ja eine eigene Library (RP6I2CmasterTWI) für die I2C-Kommunikation mit.
Die brauchst du nur einzubinden, wie ich vorgestern in dem Beispiel von 2007 gepostet hatte.
Geändert von Dirk (18.12.2011 um 19:32 Uhr)
Gruß
Dirk
Oh jaganz vergessen ^^
Habe das ganze mal umgeschrieben, aber ob ich das so:
Code:I2CTWI_transmitByte(0x3D, OUT_X_H_M); I2CTWI_readBytes(0x3D, ACC_Data, 6);
oder so:
Es bleibt immer beim lesen hängen...Code:ACC_Data[0] = I2CTWI_readByte(OUT_X_H_M); ACC_Data[1] = I2CTWI_readByte(OUT_X_L_M); ACC_Data[2] = I2CTWI_readByte(OUT_Y_H_M); ACC_Data[3] = I2CTWI_readByte(OUT_Y_L_M); ACC_Data[4] = I2CTWI_readByte(OUT_Z_H_M); ACC_Data[5] = I2CTWI_readByte(OUT_Z_L_M);![]()
irgend etwas mache ich wohl falsch ^^
Verwenden sie die M32 als Master ? Die I2C Schnittstelle zwischen M32 und Base functioniert also ? Nach verbinden von das Kompass functioniert noch immer die M32-Base Schnittstelle ? (muss normal so sein). Gibt diese I2C_Transmission_error() immer eine Failure ?
Ja ich verwende die M32 Platine als Master. Die Kommunikation funktioniert so wie immer, es kommen zumindest auch keine Fehler.
Lesezeichen