- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: I2C Sensor - Bekomme keinen Wert

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2010
    Beiträge
    16

    I2C Sensor - Bekomme keinen Wert

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Roboternetz,

    ich versuche gerade vergeblich meinen ersten I2C Sensor auszulesen und auf einem LCD darzustellen.

    Es handelt sich dabei um den l3gd20 Gyrosensor der auf folgendem Board enthalten ist:
    http://www.ebay.de/sch/i.html?_from=...&_nkw=L3G4200D

    Die Adressen habe ich mal von folgendem INC File entnommen: http://www.mikrocontroller.net/attac...9/L3G4200D.inc
    Dieses stammt von diesem Post: http://www.mikrocontroller.net/topic/278690#2937191

    Hier mal vorab mein Code:

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.7 , Db6 = Portb.0 , Db7 = Portd.4 , E = Portd.5 , Rs = Portb.7
    Config Lcd = 16 * 2
    Cls
    
    Dim Wert As Word
    Dim Wert2 As Word
    
    
    Config Scl = Portc.5                         
    Config Sda = Portc.4
    
    
    Const L3g4200dslaveid = &HD2                                'I2C SlaveAdresse GYRO
    
    Do
    
    
        I2cstart
        I2cwbyte L3g4200dslaveid
        I2cwbyte &H28
        I2crbyte Wert
    
        I2cwbyte L3g4200dslaveid
        I2cwbyte &H29
        I2crbyte Wert2
        I2cstop
    
    
        Waitms 10
    
    Cls
    Locate 1 , 1
    Lcd Wert
    Locate 2 , 1
    Lcd Wert2
    Waitms 100
    
    Loop
    End
    Leider zeigt das Display nur 0 und 0 an.

    Könnt ihr mir sagen was ich falsch mache?

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Hey,

    ohne jetzt genauer ins Datenblatt zu gucken etc. Aber solltest du nicht nach dem Lesen des ersten Bytes ein Stop senden? Und erwartet der Sensor kein ACK/NACK nachdem du ein Byte gelesen hast?
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2010
    Beiträge
    16
    Habe jetzt mal folgenden Code probiert:

    I2cstart
    I2cwbyte L3g4200dslaveid
    I2cwbyte &H28
    I2crbyte Wert , Ack
    I2cstop

    I2cstart
    I2cwbyte L3g4200dslaveid
    I2cwbyte &H29
    I2crbyte Wert2 , Nack
    I2cstop

    Jetzt bekomme ich nichtmehr 0 und 0 sondern 255 und 255.

    Habe ich richtig verstanden das Ack einen weiteren Wert fordert und Nack dann keinen mehr?

    - - - Aktualisiert - - -

    Habe jetzt nocheinmal ins Datenblatt geschaut:

    http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00265057.pdf

    Seite 22 bzw. 5.1.1 Table 13. Hier ist die Adressierung beschrieben.
    Ich habe hier zwei Adressen:

    Read (D3h) => Müsste doch dann in Bascom &HD3 sein?

    Write (D2h)

    Die Adressen die dann ausgegeben werden können sind auf Seite 27:

    OUT_X_L output (2 => Müsste dann in Bascom &H28 sein?

    OUT_X_output (29)

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hi,

    ja Ack bedeutet du erwartest noch etwas, bei Nack nicht mehr. Allerdings hast du da schon einen Fehler drin, da in deiner ersten Abfrage ein Ack steht anstatt Nack.
    Ich glaube, du musst zuerst die Slave-Adresse senden, anschließend das benötigte Register, dann einen RepStart und dann kommen die Werte. Wenn du zwei Register hintereinander lesen willst bietet es sich meistens an, dies direkt hintereinander zu tun, also:
    Code:
    i2cstart
    i2cwbyte L3g4200slaveid
    i2cwbyte &h28
    i2crepstart
    i2crbyte wert1 , ack
    i2crbyte wert2, nack
    i2cstop
    Gruß
    Chris

  5. #5
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Du darfst außerdem nicht immer die selbe Adresse nehmen. Die Registerauswahl ist ein Schreibbefehl, da du das Register was du auslesen willst, auf den Bus schreibst. Das heißt für die Registerwahl musst du die Schreibadresse nehmen. Nach einem erneuten Start musst du die Leseadresse übersenden, da du aus dem Register lesen willst.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2010
    Beiträge
    16
    Daher meinst du das dann der Code folgendermaßen lauten muss:


    Code:
    i2cstart                                 ' I2C Starten
    i2cwbyte &HD2                    ' Write Register senden (Read wäre &HD3)
    i2cwbyte &h28                      ' Register was ich lesen will 
    i2crepstart                             ' mir unbekannter Befehl 
    i2crbyte wert1, ack                'Wert des Registers &h28  wird in wert1 geschrieben
    i2crbyte wert2, nack              ' *?*  wird hier jetzt automatisch das letzte Register um 1 erhöht (daher &h29) und dann in wert2 geschrieben? 
    i2cstop
    So sollte es funktionieren? Hab ich den Code so richtig verstanden?

    Vielen Dank für die freundliche Unterstützung! Habe bisher eben noch nie etwas mit I2C gemacht.

    - - - Aktualisiert - - -

    Habe jetzt den Code so versucht. Leider bekomme ich zweimal nur den Wert 40 angezeigt obwohl ich den Gyro bewege.
    Wenn ich statt der W Adresse &HD2 die R Adresse &HD3 verwende bekomme ich zweimal konstant den Wert 195.

    Klemme ich den Sensor ab bekomme ich zweimal 0.

    Mhm, und nun? Schwerer Anfang

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hi,

    probier mal das :
    Code:
    i2cstart
    i2cwbyte &hd2
    i2cwbyte &h28
    i2crepstart
    i2cwbyte &hd3
    i2crbyte wert1 , ack
    i2crbyte wert2 , nack
    i2cstop
    Gruß
    Chris

  8. #8
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Hey,

    nach dem wiederholten Start musst du die Deviceadresse erneut auf den Bus legen.
    Die Kommunikation lautet also wie folgt:

    I2C Start
    Deviceadresse zum Schreiben
    Registeradresse welches du auslesen willst
    I2C wiederholter Start
    Deviceadresse zum Lesen
    Daten lesen und mit Ack/Nack bestätigen
    I2C Stop
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2010
    Beiträge
    16
    Und gleich nochmals ein Update:

    Code:
    I2cstart                                                    ' I2C Starten
    I2cwbyte &HD2                                               ' Write Register senden (Read wäre &HD3)
    I2cwbyte &H28                                               ' Register was ich lesen will
    I2cstart
    I2cwbyte &HD3                                               'Lese Register senden
    I2crbyte Wert1 , Ack                                        'Wert des Registers &h28  wird in wert1 geschrieben
    I2crbyte Wert2 , Nack                                       ' *?*  wird hier jetzt automatisch das letzte Register um 1 erhöht (daher &h29) und dann in wert2 geschrieben?
    i2cstop
    jetzt habe ich jedesmal einen anderen Wert stehen wenn ich den Controller starte. Allerdings ändert sich dieser nicht wenn ich drehe. Erst wenn ich die Spannung abschalte und wieder neu einschalte habe ich einen anderen Wert.

    Sehr auffällig ist auch das Wert1 und Wert2 immer identisch sind.

  10. #10
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Du hast den Code ab schon in einer

    Do
    Loop

    Schleife oder ? Weil sonst wird der nur einmal ausgeführt (doofe Frage ich weiß aber es hört sich so an....)
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. LED Blink-Interval durch Sensor-Wert steuern..
    Von nion im Forum Software, Algorithmen und KI
    Antworten: 4
    Letzter Beitrag: 16.03.2012, 21:33
  2. Schalter K6 liefert keinen Wert
    Von rchdrei im Forum Asuro
    Antworten: 7
    Letzter Beitrag: 04.05.2011, 21:39
  3. Antworten: 24
    Letzter Beitrag: 21.12.2007, 12:16
  4. Wo bekomme ich en 10 pol. I2C Kabel für BSRNDIGI?
    Von Sheridan im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 17.07.2007, 19:12
  5. bekomme in ATmega16 Schaltung I2C und ISP nicht zum laufen
    Von highbeta im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 17.11.2005, 10:13

Berechtigungen

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

Solar Speicher und Akkus Tests