PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : M32 Kompass über I2C Auslesen



Spacecam
04.03.2013, 19:52
Hallo RN,
ich habe mir den Kompass LSM303DLM gekauft.
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00026454.pdf

Diesen möchte ich nun über den I2C bus auslesen.

Mein Script:

#include "RP6ControlLib.h"
#include "RP6I2CmasterTWI.h"


void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR - TWI STATE: 0x");
writeInteger(errorState, HEX);

}
void I2C_requestedDataReady(uint8_t errorState)
{
writeString_P("\nI2C ERROR - TWI STATE: 0x");
writeInteger(errorState, HEX);

}


int main(void)
{
initRP6Control();

I2CTWI_initMaster(100);
initLCD();
uint8_t daten[6];

while(true)
{
task_I2CTWI();
writeString_P("Daten:");


I2CTWI_transmitByte(0x3C,0x30);
I2CTWI_readBytes(0x30, daten, 6);
I2CTWI_setTransmissionErrorHandler(I2C_transmissio nError);
I2CTWI_setRequestedDataReadyHandler(I2C_requestedD ataReady);

writeString_P("Daten:");
writeInteger(daten[0], DEC);
writeInteger(daten[1], DEC);
writeInteger(daten[2], DEC);
writeInteger(daten[3], DEC);
writeInteger(daten[4], DEC);
writeInteger(daten[5], DEC);
writeChar('\n');

mSleep(250);
}

return 0;
}



Nur leider giebt er mir NICHTS aus?

Woran könnte es liegen?

LG

SlyD
06.03.2013, 10:00
Hallo,

bist Du sicher, dass die Adressen stimmen?
(7 Bit + 1 read/write bit welches immer 0 ist und automatisch von der Lib gesetzt wird)

I2CTWI_transmitByte(0x3C,0x30);
I2CTWI_readBytes(0x30, daten, 6);

Also was nun, Adresse 0x30 oder 0x3C? ;)
Schau Dir die Beispiele lieber nochmal ganz genau an.


I2CTWI_setTransmissionErrorHandler(I2C_transmissio nError);
I2CTWI_setRequestedDataReadyHandler(I2C_requestedD ataReady);


Das gehört übrigens an den Anfang des Programms nach I2C init.
Nicht in die endlosschleife. (macht aber nix ausser Rechenzeit kosten).

MfG,
SlyD

Spacecam
06.03.2013, 14:23
The accelerometer and the magnetometer have separate 7-bit slave addresses on the I2C bus. The magnetometer’s slave address is 0011110b and cannot be changed. The accelerometer’s slave address has its least significant bit (LSb) determined by the voltage on the slave address selector pad (SA0_A). The carrier board pulls SA0_A to ground through a 4.7kΩ resistor, setting the accelerometer’s slave address to 0011000b by default. If the accelerometer’s selected slave address happens to conflict with some other device on your I2C bus, it is possible to access SA0_A through the untented via on the bottom of the board and pull it up. In our tests of the board, we were able to communicate with the chip at clock frequencies up to 400 kHz.


Also ist die Adresse:



Dirk hat gesagt ich soll mal den Script versuchen:



/*
* ************************************************** **************************
* RP6 ROBOT SYSTEM - RP6 CONTROL M32 Examples
* ************************************************** **************************
* Example: RP6Control LSM303DLM magnetometer test
* Author(s): Dirk
* ************************************************** **************************
* Description:
* In this example we show a test for the LSM303DLM magnetometer.
*
* ################################################## ##########################
* The Robot does NOT move in this example! You can simply put it on a table
* next to your PC and you should connect it to the PC via the USB Interface!
* ################################################## ##########################
* ************************************************** **************************
*/
/************************************************** ***************************/
// Includes:
#include "RP6ControlLib.h" // The RP6 Control Library.
// Always needs to be included!
#include "RP6I2CmasterTWI.h" // Include the I2C-Bus Master Library
/************************************************** ***************************/
// I2C Error handler
/**
* This function gets called automatically if there was an I2C Error like
* the slave sent a "not acknowledge" (NACK, error codes e.g. 0x20 or 0x30).
* The most common mistakes are:
* - using the wrong address for the slave
* - slave not active or not connected to the I2C-Bus
* - too fast requests for a slower slave
* Be sure to check this if you get I2C errors!
*/
void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR --> TWI STATE IS: 0x");
writeInteger(errorState, HEX);
writeChar('\n');
}
/************************************************** ***************************/
// Main function - The program starts here:
int main(void)
{
initRP6Control(); // Always call this first! The Processor will not
// work correctly otherwise.
initLCD(); // Initialize the LC-Display (LCD)
// Always call this before using the LCD!
setLEDs(0b1111);
mSleep(500);
setLEDs(0b0000);
writeString_P("\n\nRP6Control LSM303DLM Test 1!\n");
// IMPORTANT:
I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation
// with 100kHz SCL Frequency

// Register the event handler:
I2CTWI_setTransmissionErrorHandler(I2C_transmissio nError);
setLEDs(0b1111);
// Write a text message to the LCD:
showScreenLCD("################", "################");
mSleep(1500);
showScreenLCD(" RP6Control M32", "Example Program");
mSleep(2500);
showScreenLCD(" LSM303DLM", " Test 1");
mSleep(2500);
clearLCD();
setLEDs(0b0000);
// ---------------------------------------
uint8_t daten[6];
startStopwatch1();
while(true)
{
if(getStopwatch1() > 1000) // 1s
{
I2CTWI_transmitByte(0011110b, 0xEE);
I2CTWI_readBytes(0011110b, daten, 6);

writeString_P("Daten: ");
writeInteger(daten[0], DEC);
writeInteger(daten[1], DEC);
writeInteger(daten[2], DEC);
writeInteger(daten[3], DEC);
writeInteger(daten[4], DEC);
writeInteger(daten[5], DEC);
writeChar('\n');
setStopwatch1(0);
}
task_I2CTWI();
}
return 0;
}


wenn ich die Adresse 0011110b einsetze giebt es einen fehler wegen dem B.
und was muss ich für einen Wert senden?

Bin ich Blind? ;)

LG

Dirk
06.03.2013, 18:45
Was sind denn das für Zeilen:
I2CTWI_transmitByte(0011110b, 0xEE);
I2CTWI_readBytes(0011110b, daten, 6);
???

Ich hatte geschrieben:
I2CTWI_transmitByte(0x3c, 0x03);
I2CTWI_readBytes(0x3c, &daten[0], 6);

Klebwax
06.03.2013, 18:56
wenn ich die Adresse 0011110b einsetze gibt es einen Fehler wegen dem B.


In C heißt das ja auch 0b0011110.

Hier: "setLEDs(0b1111);" machst du es ja auch richtig.

MfG Klebwax

Spacecam
09.03.2013, 16:47
ich habe beides versucht geht nicht. Richtig angeschlossen ist er auch.
Ich vermute mal er is kaputt... ich hoffe sie nehmen ihn zurück :( (hab ihn angelötet)

Dirk
09.03.2013, 18:53
Eigentlich sind die Dinger hart im Nehmen.

Fragen:
1. Du hast noch nicht geschrieben, ob es mit dem letzten Programm I2C-Bus-Fehler (I2C ERROR --> TWI STATE IS: 0x??) gibt!? Welche ganau?
2. Hast du mal irgend etwas verpolt oder kurzgeschlossen am Modul?

Spacecam
09.03.2013, 19:08
1. Es werden keine Fehler angezeigt.
2. Bis jetzt noch nicht ;)

Dirk
09.03.2013, 19:35
1. Es werden keine Fehler angezeigt.
Dann wirf den Sensor nicht weg, er ist über den I2C-Bus wohl ansprechbar.


2. Bis jetzt noch nicht :wink:
???

Spacecam
09.03.2013, 19:41
Dann wirf den Sensor nicht weg, er ist über den I2C-Bus wohl ansprechbar.


???

Naja bis jetzt war ich noch nicht sooo doof und habe ihn kurz geschlossen^^
Also müsste es Fehler geben WENN ich den Sensor nicht anschließe und das Programm laufen lasse?

Dirk
09.03.2013, 20:19
Ja, oder wenn er z.B. nicht mit der richtigen Adresse angesprochen wird oder nicht antwortet...

Spacecam
09.03.2013, 20:26
ich hab jetzt mal zum testen:
I2CTWI_transmitByte(0x6c, 0x04);
I2CTWI_readBytes(0x6c, &daten[0], 6);
angegeben.

Es werden keine Fehler ausgegeben. Auch nicht wenn er NICHT angeschlossen ist. Komisch

Dirk
09.03.2013, 20:39
Ja, komisch.
Ich weiß aus der Ferne auch nicht weiter.

Spacecam
09.03.2013, 20:46
oh je,
ich habe grade mal den RP6Control_SELFTEST durchlaufen lassen... 12C Error... mal schaun ob&was man da machen kann....




edit:
liegt wohl daran das ich den RR6 nicht angeschlossen habe^^