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
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
Füge mal ein "Print Err" überall ein. Siehe hier: http://avrhelp.mcselec.com/index.html?i2start_i2cstop__i2crbyte__i2cwbyte.htm
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
MWS schrieb: > Das hier gesehen? > http://www.mtahlers.de/index.php/elektronik/sensor... Hat er. (s.o.) ;-)
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
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
Norbert S. schrieb: > Err ist immer 0. Na, das ist doch gut zu wissen. Funktioniert es mit dem Code aus dem Link? Gleiches Ergebnis?
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.