PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I²C und Kompass CMPS03 auslesen



alecs
03.12.2005, 17:02
Hallo, hat jemand nen Beispiel in C für das auslesen des Kompass-Moduls ?
Ich bin noch Umsteiger von Bascom auf C ...

Danke

locked
04.12.2005, 11:58
Nimm eine normale I2C Routine die Adressen und befehle stehen sicher im Kompassmodul Datenblatt.

mfg

super_castle
05.12.2005, 11:10
Gib mir mal deine Mail in meine Post, dann schicke ich dir einen Schwung Win-Avr-c-Programme. Die funktionieren Alle. Vom Compass über I2c-EEProm bis zur UART und LCD. Musst nur das Make-File selber erstellen und natürlich bei einigen die ASM.S-programme mit anbinden inder Make.

Castle

alecs
05.12.2005, 23:36
Hallo, ich hab mir nun aus verschiedenen Qullen etwas zusammen gebastelt und benutze die twimaster.c (eingebunden über Makefile)
also so sieht nun meine Methode zum lesen des CMPS03 über I2C aus:

int read_compass()
{
int data;

i2c_start(0xc0); // start the I2C bus
i2c_write(0xc1); // device address of the compass
i2c_write(1); // memory address first part

i2c_start(0xc0); // restart
i2c_write(0xc1); // device address, reading in this case

data=i2c_readAck(); // read 1 byte

i2c_stop(); // stopp

return data; // return the number of direction
}

so weit so gut, doch ich bekomme immer den wert "193", ich weiß aber leider nicht warum !!!

Kann mir jemand helfen ?

Danke

Pascal
06.12.2005, 15:01
Nach dem zweiten Start, bei dem du die Addresse 0xc1 statt 0xc0 verwenden musst, da du lesen willst und nicht schreiben, musst du gleich lesen und nicht erst nochmal was schreiben. Generell kann es nicht funktionieren, dass man ohne restart zwischen Senden und Empfangen wechselt.
Und der Wert, den du erhältst(193) entspricht genau den 0xc1, die du vor dem lesen sendest. Daher steht der Wert noch im Register TWDR, das du dann nach dem Senden wieder ausliest.

alecs
06.12.2005, 21:45
so und hier noch mal die Methode aber jetzt funktioniert es :


int read_compass()
{
int data;

i2c_start(0xc0); // start the I2C bus
i2c_write(0xc1); // device address of the compass
i2c_write(1); // memory address first part
i2c_stop();

i2c_start(0xc1); // restart
data = i2c_readAck(); // read 1 byte
data += i2c_readNak(); // read 1 byte
i2c_stop(); // stopp

return data; // return the number of direction
}


Vielen Dank an Pascal !!!

super_castle
29.01.2006, 10:54
ich suche noch nach einer routine für das cmps03modul.

wie sieht deine programmsammlung aus für dieses ausgabe.

castle

alecs
30.01.2006, 00:44
Was sucht du denn genau ???

super_castle
31.01.2006, 16:48
eine routine (programm)von winavr-c um das compassmodul cmps03 auszulesen.

Castle

alecs
31.01.2006, 22:52
Hallo, um den Kompass auszulesen benutze ich folgenden Code:



int read_compass()
{
int data;

i2c_start(0xc0); // start the I2C bus
i2c_write(0xc1); // device address of the compass
i2c_write(1); // memory address first part
i2c_stop();

i2c_start(0xc1); // restart
data = i2c_readAck(); // read 1 byte
data += i2c_readNak(); // read 1 byte
i2c_stop(); // stopp

return data; // return the number of direction
}


Der war ja schon weiter oben zu sehen, und damit das ganze noch funktioniert, musst du die TWI.h (avr/include) und die twi_cmps.h/.c einbinden. (googlen oder mal ne Mail an mich, hab den Link leider nicht mehr)... so und dann sollte es funktionieren ....
Viel Erfolg!!!