Der XBUS2 sollte doch eigentlich unverwendet sein, da der XBUS1 für M32 - Base verwendet wird und ich noch keine weiter Platine an der M32 Platine angeschlossen hab.
INT1 und INT2 muss du nur verdrahten wen sie die auch benutzen wollen : das Kompass hat die moglichkeit um ein INT zu generieren bei programmierte Bedingungen. Es kann auch sein das diese INT1 schon verwendet ist für die Schnittstelle M32 - Base. Schau mal nach in die Schaltplane.
Der XBUS2 sollte doch eigentlich unverwendet sein, da der XBUS1 für M32 - Base verwendet wird und ich noch keine weiter Platine an der M32 Platine angeschlossen hab.
XBUS1 und XBUS2 sind parallel geschaltet : alle pinnen sind durchgeschaltet (siehe Schaltplan). INT1 ist verbunden met Base (pin PA4 auf Mega32) und auf M32 (pin PD2). Sie soll ich nicht verwenden, da die eigenlich forgesehen ist für die Schnittstelle M32-Base. INT2 und INT3 (PB2, PD3) sind nur verbunden mit den M32, die kannst du nach Bedarf verwenden.
Achso okay,
Dann werd ich mein glück in den nächsten Tagen mal versuchen und evtl auch Bilder posten ^^
danke schonmal für eure Hilfe
So,
Ich habe den Kompass mal angeschlossen und zwar an den XBUS2.
Habe ganz normal SDA an SDA, SCL an SCL und GND bzw. VDD an GND bzw. VDD angeschlossen.
Nun klappt das bis jetzt nur mit der Programmierung nicht so wie es soll.
Diesen Code:
habe ich ganz einfach aus der compass.c (dem Beispiel) entnommen.Code:void i2c_start(void) { TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // send start condition while (!(TWCR & (1 << TWINT))); } void i2c_write_byte(char byte) { TWDR = byte; TWCR = (1 << TWINT) | (1 << TWEN); // start address transmission while (!(TWCR & (1 << TWINT))); } char i2c_read_byte(void) { TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN); // start data reception, transmit ACK while (!(TWCR & (1 << TWINT))); return TWDR; } char i2c_read_last_byte(void) { TWCR = (1 << TWINT) | (1 << TWEN); // start data reception while (!(TWCR & (1 << TWINT))); return TWDR; } void i2c_stop(void) { TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); // send stop condition }
Nun hängt sich der RP6 bei:
einfach auf.Code:DDRC = 0; PORTC = (1 << PC1) | (1 << PC0); // SDA | SCL TWSR = 0; TWBR = 17; i2c_start(); i2c_write_byte(0x3C); i2c_write_byte(0x02); i2c_write_byte(0x00); // hier..... i2c_stop();
Als ich diese Zeile einfach einmal auskommentiert hab, hat er sich eine Zeile davor aufgehängt.
Bei der aktivierung des Beschleunigungssensors bleibt er übrigens auch hängen.
Weiß jemand wieso? Bzw. was daran falsch ist? Habe ich evtl etwas falsch angeschlossen?
Geändert von Berghuhn (16.12.2011 um 12:56 Uhr)
Normalerweise 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 ?
@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 20:32 Uhr)
Gruß
Dirk
Lesezeichen