Hallo,
Ich benutze das RD4247Mag3110-Evaluationskit von Freescale zum Aufbau
eines eKompasses.
Auf diesem Board befindet sich zum einen der
MMA8451Q-Beschleunigungssensor(3-Achsen) und der bereits erwähnte
Magnetfeldsensor MAG3110(3-Achsen).
Die beiden hängen an einem I2C-Bus.
Nun hab ich aber dass Problem, dass sich der Beschleunigungssensor ohne
Probleme auslesen lässt, aber der Magnetfeldsensor leider Probleme
macht.
Dieser liefert mir beim ACK-Bit bei richtiger Addressierung ein Bit mit
halber VCC, was der Master aber leider (natürlich) als NACK erkennt.
Adressiere ich den Magnetfeldsensor absichtlich falsch, liefert er mir
ein NACK mit normalem Pegel von VCC, wie es auch normalerweise sein
sollte.
An den Routinen kanns nicht legen, da der Beschleunigungssensor das
gleiche Kommunikationsprotokoll hat wie der Magnetfeldsensor, und dieser
ja funktioniert.
Ich habe bereits mehrere Pullups von 4,7k bis 1k versucht, leider ändert
sich hierbei nichts.
Bin momentan Ratlos, und wär für jeden Tip dankbar.
Gruß
Andy
Kannst du mal das Steuerprogramm für den Magnetfeldsensor posten? Ich
hab das Ding auch (funktioniert gut), erinnere mich aber, dass es ein
bisschen knifflig in Betrieb zu nehmen war.
Wenn ich daheim bin, poste ich mein Steuerprogramm mal.
Sven B. schrieb:> Ich> hab das Ding auch (funktioniert gut), erinnere mich aber, dass es ein> bisschen knifflig in Betrieb zu nehmen war.
Wenn du denn schon mal in Gebrauch hattest, würd mich interresieren
welche Genauigkeit du mit dem MAG3110 erreicht hast. z.B wenn ich mich
um 90°drehe, wie weit liegt man dann von den wirklichen 90° weg?
Andy S. schrieb:> Sven B. schrieb:>> Ich>> hab das Ding auch (funktioniert gut), erinnere mich aber, dass es ein>> bisschen knifflig in Betrieb zu nehmen war.>> Wenn du denn schon mal in Gebrauch hattest, würd mich interresieren> welche Genauigkeit du mit dem MAG3110 erreicht hast. z.B wenn ich mich> um 90°drehe, wie weit liegt man dann von den wirklichen 90° weg?
Kann ich Dir nicht sagen, weil ich bisher nicht in der Lage (bzw. eher
zu faul) war, die Werte in Neigungswinkel umzurechnen. Das ist nicht
ganz trivial, weil du ja sowas bekommst wie "Projektion des
Magnetfeldvektors auf x, y, und z-Achse des Geräts", und der
Magnetfeldvektor zeigt irgendwie schräg nach unten und nach Norden. Du
bekommst also nichtmal Winkel raus, sondern eben die Projektionen dieses
Vektors auf das Koordinatensystem, und daraus müsste man die Winkel
erstmal errechnen, und dann noch richtig hindrehen (bzw. andersrum). *
Wenn man ein paar Werte mittelt, ist der Jitter aber ~1 Grad. Ich hab
mal ein paar Objekte in Blender damit gedreht, das geht recht flüssig
(bis darauf, dass die Winkel halt alle total komisch und falsch sind).
Zum eigentlichen Problem: Sendest Du denn keine Konfiguration an das
Ding? Ich weiß nicht, was das tut, wenn Du alle Steuer-Register nicht
initialisierst. Hier ist jedenfalls mal das, was ich mache (auf dem
Raspberry Pi, deshalb ein bisschen mehr High-Level):
Als Slave Address habe ich irgendwie 0x0e, das ist anders als bei Dir,
oder?
Grüße,
Sven
_______
* P.S.: Wenn jemand Code dafür hat, den nehme ich gern! :D
Hab auch schon probiert, vorher die register zu konfigurieren, leider
kann ich ja ned mit dem Baustein sprechen, was die sache erschwert;:).
Die Adresse ist 0x0E, hab ich auch. Du betreibst den baustein alleine am
bus oder?
Ich werds morgen auch mal mitn raspberry pi ausprobieren, vielleicht
gehts so.
Aber weshalb mein ACK bei halb Vcc liegt weiss keiner oder?
Deshalb funzt die kommunikation leider nicht.
Ah, du hast ein Raspberry Pi? Das ist ja günstig, dann kannst du ja
einfach mal meinen Code probieren. Wenn's damit funktioniert, wissen wir
immerhin, ob es an der Software oder an der Hardware liegt.
Der Baustein ist bei mir allein am Bus, ja.
Wegen des ACK habe ich leider überhaupt keine Ahnung.
Im Anhang der Code mit Makefile und so.
Also ich hab das Problem gelöst, wobei die Lösung schon sehr komisch
ist.
Hab jetzt 14,7k Pullups drin, jetzt liegt der Pegel des ACK endlich bei
<0,3VCC.
Entweder ist auf dem Board ein riesen Serienwiederstand drin, oder der
Open-Kollektor Transister des MAG3110 kann den Transistor nicht komplett
durchschalten, wobei ich nicht weiss warum und weshalb er das nicht
machen sollte.
Mit FAST-I2C wirds dann wahrscheinlich nichts mehr bei den Pullups:).