PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kompasssensor CMPS03 an I2C



Diron
28.02.2008, 02:12
Hab mir einen Kompasssensor für meinen mega2560 bestellt und ihn angeschlossen...auch richtig. Aber beim Programmbeispiel (angepasst an den 2560) liefert er mir keine Ausgabe ausser dem Print in dem Beispiel "RN-Control CMPS03 Kompass Testprogramm
CMPS03 Kompass Firmware Version:". Verzweifel langsam dran... 4 kabel und en paar zeilen code....aber keine Antwort *schnief*

ich poste mal den Code:


Declare Function Rn_cmps_himmelsrichtung() As Word
Declare Function Rn_cmps_firmware() As Byte


' ---------- Das RN-Control übliche --------------
$prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus

$regfile = "m2560def.dat"
$hwstack = 82
$framesize = 68
$swstack = 68

$crystal = 16000000 'Quarzfrequenz

$baud = 9600

Config Scl = Portd.0 'Ports fuer I2C-Bus
Config Sda = Portd.1

Config Pine.5 = Input
Usb Alias Pine.5 'Ist 1 wenn USB angeschlossen

Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com4:" For Binary As #4 'USB Buchse

' ------------------------------------------------

Dim Himmelsrichtung As Word
Dim Grad As Single
Dim V As Byte

Wait 3 'Warte 3 Sekunde
I2cinit
Print #4 , "RN-Control CMPS03 Kompass Testprogramm "
Print #4 , "CMPS03 Kompass Firmware Version:" ; Rn_cmps_firmware()


V = 1
Do
Himmelsrichtung = Rn_cmps_himmelsrichtung()
Print #4 , "Himmelsrichtung in 0,1 Grad Schritten: " ; Himmelsrichtung
Grad = Himmelsrichtung / 10
Print #4 , "Himmelsrichtung genau in Grad: " ; Grad

V = V + 3
Wait 1
Loop

End



Function Rn_cmps_himmelsrichtung() As Word
Local Lob As Byte
Local Hib As Byte
Local Cmps_slaveid As Byte
Local Cmps_slaveid_read As Byte

Cmps_slaveid = &HC0
Cmps_slaveid_read = Cmps_slaveid + 1 'Register auswählen
I2cstart
I2cwbyte Cmps_slaveid
I2cwbyte 2
I2cstop

I2cstart
I2cwbyte Cmps_slaveid_read
I2crbyte Hib , Ack
I2crbyte Lob , Nack
I2cstop

Rn_cmps_himmelsrichtung = Makeint(lob , Hib)
End Function


Function Rn_cmps_firmware() As Byte
Local Firmware As Byte
Local Cmps_slaveid As Byte
Local Cmps_slaveid_read As Byte

Cmps_slaveid = &HC0
Cmps_slaveid_read = Cmps_slaveid + 1

I2cstart
I2cwbyte Cmps_slaveid
I2cwbyte 0 'Leseregister festlegen
I2cstop

I2cstart
I2cwbyte Cmps_slaveid_read
I2crbyte Firmware , Nack
I2cstop

Rn_cmps_firmware = Firmware
End Function
---
Jemand en Tipp? Kann ich das Ding andersweitig auf seine Funktion testen? Habt ihr das einfach angeschlossen und es ging?

Dirk
28.02.2008, 20:57
Hallo Diron,

probier die Functions 'mal so:

Function Rn_cmps_himmelsrichtung() As Word
Local Lob As Byte
Local Hib As Byte
Local Cmps_slaveid As Byte
Local Cmps_slaveid_read As Byte

Cmps_slaveid = &HC0
Cmps_slaveid_read = Cmps_slaveid + 1 'Register auswählen
I2cstart
I2cwbyte Cmps_slaveid , Ack
I2cwbyte 2
Waitms 10

I2cstart
I2cwbyte Cmps_slaveid_read , Ack
I2crbyte Hib , Ack
I2crbyte Lob , Nack
I2cstop

Rn_cmps_himmelsrichtung = Makeint(lob , Hib)
End Function


Function Rn_cmps_firmware() As Byte
Local Firmware As Byte
Local Cmps_slaveid As Byte
Local Cmps_slaveid_read As Byte

Cmps_slaveid = &HC0
Cmps_slaveid_read = Cmps_slaveid + 1

I2cstart
I2cwbyte Cmps_slaveid , Ack
I2cwbyte 0 'Leseregister festlegen
Waitms 10

I2cstart
I2cwbyte Cmps_slaveid_read , Ack
I2crbyte Firmware , Nack
I2cstop

Rn_cmps_firmware = Firmware
End Function


Gruß Dirk

Diron
29.02.2008, 20:12
Da meckert mein Bascom bei "I2cwbyte Cmps_slaveid , Ack" mit "Invalid datatype", sowie am Ende mit "End Sub or End Function expected"

Dirk
29.02.2008, 20:17
Da meckert mein Bascom ...

Es müßte gehen, wenn du nicht Variablen für die CMPS03-Adressen nimmst, sondern Konstanten, also so:
I2cwbyte &HC0 , Ack

Gruß Dirk

Diron
29.02.2008, 21:20
Das hat leider nichts gebracht. Hab ich was anner verkabelung falsch gemacht? Ich verbinde doch nur SCL mit SCL und SDA mit SDA. Keine Widerstände oder sowas. Einfach direkt dran...
Strom dran... fertig!
*grmbl*

Kann das Kompassmodul kaputt sein? Hab schon den Support gefragt, der meinte das wäre sehr unwahrscheinlich. Haben wohl noch kein kaputtes Modul gehabt.
Kann ich das irgendwie testen ob das ding noch zuckt oder schon tot ist?

Furtion
01.03.2008, 08:33
Hi,

du musst da umbeding 10k Widerstände von SDA nach Vcc und von
SCl nach Vcc legen, sonst funktioniert da garnichts. War auch bei mir der
Fehler, 2 Widerstände dran, funktioniert. Ich weiß nur nicht ob das Modul
da schon welche intern hat?

http://www.robotikhardware.de/download/cmps03kompass.pdf
Seite 3 da steht das über die PullUps

Diron
01.03.2008, 14:42
Ja, das ist doch mal ne Aussage. Neben der fehlenden Dokumentation über vorhandenen oder nicht vorhandenen Pullup-Widerstände auf dem Mega2560 Board wäre die Erwähnung von notwendigen Abschlußwiderständen für den I2C-BUS im RN-Wissen Artikel durchaus sinnvoll.

Nochmal ne Frage dazu... auf beiden Seiten die Widerstände? Oder reicht es einseitig SDL und SDA mit 10k an VCC anzubinden? Was passiert wenn ich weitere I2C Geräte dranhänge?

Furtion
01.03.2008, 14:56
Hi,

du musst SDA ----10k------VCC(der Pluspol)
und SCL -----10k-----VCC

genau so musst du es aufbauen. Und das nur einmal(glaube ich).

linux_80
01.03.2008, 15:30
Hallo,

Abschlusswiderstände gibts/brauchts beim I2C-Bus nicht, nur diese Pullups, davon je einen irgendwo in der Leitung, wo ist egal.
Da es ein Bus ist, kann man weitere Teilnehmer einfach dazu anklemmen.

Die Seite im Wiki ist doch recht gut gelungen, genauso muss es verkabelt werden wie in dem Bild.

PS:
Gemeinsame Masse (Gnd) nicht vergessen !

Diron
03.03.2008, 11:42
jetzt bekomme ich nur 0 als Rückmeldung:

Firmware: 0
Himmelsrichtung in 0,1 Grad Schritten: 0
Himmelsrichtung genau in Grad: 0.0

Jemand en Tipp?