Kompassmodul HDMM01 von Pollin will nicht - Bascom

#2642464
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
Angehängte Dateien:
#2642490
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
Angehängte Dateien:
#2642555
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
#2642563
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
Gast #2642588
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
#2642647
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
Gast #2642686
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.
#2642719
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren