Forum: Mikrocontroller und Digitale Elektronik Kompassmodul HDMM01 von Pollin will nicht - Bascom


von Norbert S. (norberts)


Angehängte Dateien:

Lesenswert?

Hi,

ich versuche das besagte Modul von Pollin zum Laufen zu kriegen aber es 
will nicht.
Code ist anbei, den Teil der Ansteuerung des Moduls habe ich von hier:
http://www.mtahlers.de/index.php/elektronik/sensoren/mmc2120mg

Den I2C Teil habe ich aber jetzt auch komplett nach Datenblatt 
durchgearbeitet und kann keinen Fehler finden.

Das Modul sendet für alle Bytes immer 0110 0001, also die zuletzt 
gesendete Adresse des Moduls zum lesen (Cmp_r). Auch das erste Byte, 
welches das Control-Register sein sollte hat diesen Wert.

Hat einer ne Ahnung was das sein könnte?

Ach ja, Frequenz auf 100kHz runter - keine Änderung.
An SCL und SDA sind Pullups (5k1).

Gruß,
Norbert

von Norbert S. (norberts)


Angehängte Dateien:

Lesenswert?

So, ich habe jetzt mal so probiert:

'$lib "i2c_twi.lbx"

'Config Twi = 100000
Config I2cdelay = 1

Also die Lib und das Twi auskommentiert und I2cdelay rein.
So funzt das woanders mit einem ATmega32 und einem Modul mit je 3-Achs 
Kompass, Beschleunigung und Gyro.
Den Code zum Auslesen habe ich mir selbst erarbeitet und nicht irgendwo 
kopiert.
Damit kommen komplett Einsen, das Drecksding antwortet also (scheinbar?) 
überhaupt nicht.

Zu Hülf!

Ich hab nochmal das Datenblatt von dem Modul angehängt.


Gruß,
Norbert

von Karl (Gast)


Lesenswert?

Füge mal ein "Print Err" überall ein. Siehe hier:

http://avrhelp.mcselec.com/index.html?i2start_i2cstop__i2crbyte__i2cwbyte.htm

von MWS (Gast)


Lesenswert?

Norbert S. schrieb:
> Den Code zum Auslesen habe ich mir selbst erarbeitet und nicht irgendwo
> kopiert.

Das ist zwar sehr lobenswert, aber angesichts dessen:

> Damit kommen komplett Einsen, das Drecksding antwortet also (scheinbar?)
> überhaupt nicht.

nicht wirklich effektiv.

Das hier gesehen?
http://www.mtahlers.de/index.php/elektronik/sensoren/mmc2120mg

von Karl (Gast)


Lesenswert?

MWS schrieb:
> Das hier gesehen?
> http://www.mtahlers.de/index.php/elektronik/sensor...

Hat er. (s.o.) ;-)

von Norbert S. (norberts)


Lesenswert?

Hi,
1
Get_data:
2
3
   I2cstart
4
   I2cwbyte Cmp_w                                           'write
5
   I2cwbyte &H00                                            'adress
6
   I2cwbyte &B00000010                                      'set coil
7
   I2cstop
8
   Waitms 5
9
   I2cstart
10
   I2cwbyte Cmp_w                                           'write
11
   I2cwbyte &H00                                            'adress
12
   I2cwbyte &B00000100                                      'reset coil
13
   I2cstop
14
   Waitms 5
15
16
   Print Err
17
18
   I2cstart
19
   I2cwbyte Cmp_w                                           'write
20
   I2cwbyte &H00                                            'adress
21
   I2cwbyte &H01                                            'measure
22
   I2cstop
23
24
   Print Err
25
26
   Waitms 5
27
28
   I2cstart
29
   I2cwbyte Cmp_w
30
   I2cwbyte &H00                                            'adress
31
   I2cwbyte Cmp_r                                           'read values
32
33
   Print Err
34
35
   For I = 1 To 4
36
      I2crbyte Dat(i) , Ack
37
      Print Err
38
   Next
39
   I2crbyte Dat(5) , Nack
40
   I2cstop
41
42
   Print Err
43
44
   'Dat(2) = Dat(2) And &B0000_1111
45
   'Dat(4) = Dat(4) And &B0000_1111
46
   X = Dat(2) * 256
47
   X = X + Dat(3)
48
   Y = Dat(4) * 256
49
   Y = Y + Dat(5)
50
   Xsing = X
51
   Ysing = Y
52
   Angsing = Atn2(ysing , Xsing)
53
   Angsing = Rad2deg(angsing)
54
   Angle = Angsing                                          '+/-180 degrees
55
56
   Print X ; " " ; Y ; Dat(1)
57
58
Return

Err ist immer 0.
Und nu?

Also das Modul antwortet wohl (ist jetzt wieder mit der Lib) aber mit 
der zuletzt geschriebenen Leseadresse.

Gruß,
Norbert

von Norbert S. (norberts)


Lesenswert?

Hi,

MWS schrieb:
> Norbert S. schrieb:
>> Den Code zum Auslesen habe ich mir selbst erarbeitet und nicht irgendwo
>> kopiert.
>
> Das ist zwar sehr lobenswert, aber angesichts dessen:
>
>> Damit kommen komplett Einsen, das Drecksding antwortet also (scheinbar?)
>> überhaupt nicht.
>
> nicht wirklich effektiv.

Ich wollte damit zum Ausdruck bringen, daß ich diesen Code nicht nur 
kopiert sondern auch nachvollzogen habe. Weil ich sowas auch schon 
komplett selbst gemacht habe.

Mich auf genau den Link hinzuweisen, den ich als Quelle für meinen Code 
angegeben habe, ist wirklich toll. So kann ich das nochmal nachlesen.
Danke.

Gruß,
Norbert

von Karl (Gast)


Lesenswert?

Norbert S. schrieb:
> Err ist immer 0.

Na, das ist doch gut zu wissen.

Funktioniert es mit dem Code aus dem Link? Gleiches Ergebnis?

von MWS (Gast)


Lesenswert?

Karl schrieb:
> Hat er. (s.o.) ;-)

Jep, übersehen :D

SCL und SDA vertauscht ? :-)

Norbert S. schrieb:
> Mich auf genau den Link hinzuweisen, den ich als Quelle für meinen Code
> angegeben habe, ist wirklich toll. So kann ich das nochmal nachlesen.
> Danke.

Nicht rummotzen, hab's nur übersehen.

> So kann ich das nochmal nachlesen.

Das hätte evtl. geholfen, denn:
   I2cstart
   I2cwbyte Cmp_w
   I2cwbyte &H00                                            'adress
---> hier fehlt ein (re-)start
   I2cwbyte Cmp_r

:D

von Norbert S. (norberts)


Lesenswert?

Hi,

da muß ich mich für meine sarkastische Bemerkung wohl entschuldigen, da 
ist tatsächlich ein I2cstart.
Laut Datenblatt gehört das da aber nicht hin!
Damit funktioniert es aber jetzt, zumindest ändern sich die Werte wenn 
ich das Ding drehe, sieht sinnvoll aus.

Malte schreibt das in seinem Beitrag aber im Datenblatt steht es 
definitiv nicht drin.

Naja, jetzt kann es weitergehen...

Danke nochmal!

Gruß,
Norbert

von MWS (Gast)


Lesenswert?

Norbert S. schrieb:
> Laut Datenblatt gehört das da aber nicht hin!

Nach welchem ? Dem Pollin'schen ? Das sah' mir ein wenig unkoordiniert 
aus.

Norbert S. schrieb:
> sarkastische Bemerkung wohl entschuldigen,

Kein Problem, bin nicht zart besaitet.

Norbert S. schrieb:
> Malte schreibt das in seinem Beitrag aber im Datenblatt steht es
> definitiv nicht drin.

Es ist üblich bei einem I2C-Read erst die zu lesenden Register per Write 
zu adressieren, dann ein Restart zu machen, schließlich den Lesevorgang 
zu starten indem man die Read-Adresse schickt und die Register ausliest.

Norbert S. schrieb:
> Danke nochmal!

Bitte.

von Norbert S. (norberts)


Lesenswert?

Hi,

ja, das pollinsche Datenblatt. Etwas konfus das Ding aber da habe ich 
schon Schlimmeres gesehen (BTM-112 z.B.)

MWS schrieb:
> Es ist üblich bei einem I2C-Read erst die zu lesenden Register per Write
> zu adressieren, dann ein Restart zu machen, schließlich den Lesevorgang
> zu starten indem man die Read-Adresse schickt und die Register ausliest.

Das leuchtet mir jetzt auch ein.

Gruß,
Norbert

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.