- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 5 von 5

Thema: Kompassmodul CMPS03 funktioniert nicht

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.01.2007
    Ort
    Berlin
    Alter
    36
    Beiträge
    7

    Kompassmodul CMPS03 funktioniert nicht

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    ich hab das Kompassmodul CMPS03 und möchte es über I²C ansprechen.
    Zum Testen hab ich das Beispielprogramm auf der Robotikhardware CD benutzt.
    Das Problem ist, dass das Modul beim Auslesen der Firmwareversion nicht zu antworten scheint. Nach einiger Zeit kommt dann als Version 0 und bei den Messungen kommt anschließend ebenfalls immer 0 heraus.
    Am I²C Anschluss und am Verbindungskabel kann es nicht liegen, da ein SRF10-Ultraschallmodul am gleichen Anschluss mit gleichem Kabel einwandfrei funktioniert.
    Ist das Modul jetzt kaputt?

    Code:
    '###################################################
    'cmps03_an_rnmega128funk.bas
    'für
    'RoboterNetz Board RN-Mega128Funk ab Version 1.1
    'Das neue vielseitige RN-Controllerboard mit ATMEGA128
    'und das Kompassmodul CMPS03 für Erkennung der Himmelsrichtung
    'Datenblatt zu CMPS03 siehe Downloadbereich:
    'https://www.roboternetz.de
    'Aufgabe:
    ' Gibt die Himmelsrichtung in Bezug auf Norden aus
    ' Die Unterfunktionen können gerne in eigenen Programmen
    ' genutzt werden.
    ' Autor: Frank  (Roboternetz)
    ' Modul: CMPS03 Devantech/robotikhardware.de  neuste Firmware
    ' Getestet mit CMPS Firmware 11
    '#######################################################
    
    Declare Function Rn_cmps_himmelsrichtung() As Word
    Declare Function Rn_cmps_firmware() As Byte
    
    ' ---------------RN-Mega128Funk übliche ------------------
    
    $regfile = "m128def.dat" ' Bei Mega 128 "
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 19200                                               'Baudrate für Funkmodul
    $baud1 = 9600                                               'Baudrate für MAX
    
    Config Scl = Portd.0                                        'Ports fuer IIC-Bus
    Config Sda = Portd.1
    
    Config Ping.0 = Output                                      'Spannung an LCD aktivieren
    Lcdpower Alias Portg.0
    
    Config Pine.2 = Output
    Rdy_hostempfangsbereit Alias Porte.2                        'Auf Low setzen wenn Empfangsbereit für Daten vom Funkmodul
    
    Config Pine.5 = Input
    Bsy_funkmodulsendebereit Alias Porte.5                      'Ist Low wenn Funkmodul frei zum senden
    
    Open "com2:" For Binary As #2                               'Ausgabe über zweite serielle Schnittstelle (MAX)
    
    Sound Portg.2 , 400 , 450                                   'BEEP bei RN-Mega128Funk
    Sound Portg.2 , 400 , 250                                   'BEEP bei RN-Mega128Funk
    Sound Portg.2 , 400 , 450                                   'BEEP bei RN-Mega128Funk
    ' ---------------------------------------------------
    
    Dim Himmelsrichtung As Word
    Dim Grad As Single
    Dim V As Byte
    
      Wait 3                                                   'Warte 3 Sekunde
    
       I2cinit
    
       Print #2 , "RN-Mega128Funk CMPS03 Kompass Testprogramm "
       Print #2 , "CMPS03 Kompass Firmware Version:" ; Rn_cmps_firmware()
    
       V = 1
    
       Do
         Himmelsrichtung = Rn_cmps_himmelsrichtung()
         Print #2 , "Himmelsrichtung in 0,1 Grad Schritten: " ; Himmelsrichtung
         Grad = Himmelsrichtung / 10
         Print #2 , "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 = &HE0
       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 = &HE0
       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
    Wäre für Hilfe echt dankbar.

    mfg

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    54
    Beiträge
    1.258
    Hallo tuxer,

    Mein (funktionierender) Code für das Auslesen des Kompasses sieht so aus:

    Code:
    I2cstart
    I2cwbyte Adr_kom_w
    I2cwbyte 1
    
    I2cstart
    I2cwbyte Adr_kom_r
    I2crbyte Temp , Nack
    I2cstop
    
    Kompass = Temp
    Den Unterschied macht vermutlich das fehlende I2cstop zwischendrin.

    Gruß, Michael

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.08.2006
    Ort
    Budapest
    Alter
    36
    Beiträge
    563
    Das fehlende stop zwischen schreiben und lesen braucht man nicht, wenn man einen repeated start sendet. Fragt mich aber nicht, wie das in Bascom geht, ich progge Assembly oder C. Es gibt aber sicher einen Unterschied, da ein anderer Statuscode verwendet wird.
    Aber die Assembly-routine könnte ich dir schicken.

    MfG

    pongi

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.12.2005
    Ort
    Nähe Mainz
    Alter
    32
    Beiträge
    3.467
    Das Modul wird wahrscheinlich nicht hops sein.
    Nehme mal den SRF10 von Bus ab und probiere es nur mit dem CMPS03.
    Was mich wunderet ist, dass er nur "0" ausgibt. wenn er keine Verbindung hat gibt er immer ein volles Word an. also irgendein Wert um 6500.

    jon
    Nice to be back after two years
    www.roboterfreak.de

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    05.01.2007
    Ort
    Berlin
    Alter
    36
    Beiträge
    7
    Hallo,

    erst mal danke für eure Antworten.
    Das Entfernen des I2cstop hat leider nichts gebracht, immer noch der selbe Fehler, zu mal in der Demo zu dem SRF10 der Befehl ebenfalls benutzt wird und der einwandfrei funktioniert.

    @Jon: Ich hab den SRF10 nur zum Testen des I2C Busses, sowie des Kabels an das Board angeschlossen, anonsten ist er ab.

    mfg tuxer

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress