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?
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:
Leider zeigt das Display nur 0 und 0 an.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
Könnt ihr mir sagen was ich falsch mache?
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
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)
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:
GrußCode:i2cstart i2cwbyte L3g4200slaveid i2cwbyte &h28 i2crepstart i2crbyte wert1 , ack i2crbyte wert2, nack i2cstop
Chris
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
Daher meinst du das dann der Code folgendermaßen lauten muss:
So sollte es funktionieren? Hab ich den Code so richtig verstanden?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
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
Hi,
probier mal das :
GrußCode:i2cstart i2cwbyte &hd2 i2cwbyte &h28 i2crepstart i2cwbyte &hd3 i2crbyte wert1 , ack i2crbyte wert2 , nack i2cstop
Chris
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
Und gleich nochmals ein Update:
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.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
Sehr auffällig ist auch das Wert1 und Wert2 immer identisch sind.
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
Lesezeichen