Hi,
mach mal noch ein Config Twi = 400000 / 100000 rein und ein I2cinit. Außerdem würde ich Wert1 & Wert2 als Byte deklarieren. Dann könntest du dir noch den Error ausgeben lassen, um zu sehen, ob die Kommunikation überhaupt funktioniert.
Gruß
Chris
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 Wert1 As Word Dim Wert2 As Word Dim Sad As Byte $lib "i2c_twi.lbx" Config Scl = Portc.5 ' Ports fuer IIC-Bus, nicht Standard ! Config Sda = Portc.4 Waitms 1000 Do 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 Waitms 10 Cls Locate 1 , 1 Lcd Wert1 Locate 2 , 1 Lcd Wert2 Waitms 1000 Loop End
Hi,
mach mal noch ein Config Twi = 400000 / 100000 rein und ein I2cinit. Außerdem würde ich Wert1 & Wert2 als Byte deklarieren. Dann könntest du dir noch den Error ausgeben lassen, um zu sehen, ob die Kommunikation überhaupt funktioniert.
Gruß
Chris
Nach wie vor nur beim Einschalten dann nach einer Sekunde Für Wert1 und Wert2 den gleichen Wert der sich nicht ändert. Das kann mal 200 mal 75 oder mal 105 etc sein.Code:Dim Wert1 As Byte Dim Wert2 As Byte Dim Sad As Byte $lib "i2c_twi.lbx" Config Twi = 100000 I2cinit Config Scl = Portc.5 Config Sda = Portc.4 Waitms 1000
mit Config Twi = 400000 zeigt sich das Gleiche.
Sehr seltsam.
Hi,
probier mal das :
Weißt du den, dass der Sensor funktioniert?Code:$regfile = "m8def.dat" $crystal = 8000000 $framesize = 80 $hwstack = 80 $swstack = 80 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 $lib "i2c_twi.lbx" Config Scl = Portc.5 Config Sda = Portc.4 Config Twi = 400000 I2cinit Dim Wert1 As Word Dim Wert2 As Word Dim Sad As Byte Waitms 200 Do I2cstart I2cwbyte &HD2 I2cwbyte &H28 I2crepstart I2cwbyte &HD3 I2crbyte Wert1 , Ack I2crbyte Wert2 , Nack I2cstop Sad = Err Locate 1 , 1 Lcd Wert1 ; " : " ; Wert2 ; " " Locate 2 , 1 Lcd "Error: " ; Sad ; " " Waitms 1000 Loop End
Gruß
Chris
Sowas ähnliches habe ich gerade auch Gecodet.
Also die Errorausgabe auf dem LCD.
Mit deinem Code erhalte ich zb.
200 : 200
Error 0
102 : 102
Error 0
75 : 75
Error 0
Aber lediglich nur wenn ich die Spannung neu anmache. Sobald ich den Atmega8 laufen lasse ändert sich die Anzeige auf dem Bildschirm nichtmehr.
Nehme ich den Sensor aus seinem Sockel raus erhallte ich immer
205 : 205
Error 1
Der Sensor ist total neu. Ob er funktioniert kann ich nicht sagen da ich nicht weiß wie ich das prüfen könnte.
Hast du mal im DB nachgeschaut, ob der Sensor irgendwie initalisiert werden muss? Bei den meisten Gyros kann man / muss man einstellen, welchen Wertebereich der erfassen soll, welchen Taktgeber er verwendet usw...
Sind Pullups in der Schaltung integriert?
Gruß
Chris
Genau an dem bin ich gerade dran.
Der Code den ich zu Beginn in meinem Post schonmal gepostet hab: http://www.mikrocontroller.net/attac...u_MinIMU-9.bas
Dieser enthält:
Ich habe das jetzt mal so vor der DO Loop umgesetzt:Code:Sub GYRO_ini() ' L3G4200D_CTRL_REG4_Wert = &b00000000 '250 dps full scale L3G4200D_CTRL_REG4_Wert = &b00010000 '500 dps full scale ' L3G4200D_CTRL_REG4_Wert = &b00100000 '2000 dps full scale call Register_schreiben(L3G4200DSlaveid , L3G4200D_CTRL_REG1 , &b00001111) call Register_schreiben(L3G4200DSlaveid , L3G4200D_CTRL_REG2 , &b00100110) call Register_schreiben(L3G4200DSlaveid , L3G4200D_CTRL_REG3 , &b00000000) call Register_schreiben(L3G4200DSlaveid , L3G4200D_CTRL_REG4 , L3G4200D_CTRL_REG4_Wert) call Register_schreiben(L3G4200DSlaveid , L3G4200D_CTRL_REG5 , &b00000000) call Register_schreiben(L3G4200DSlaveid , L3G4200D_REFERENCE , &b00000000) end sub
Jetzt bekomme ich jede Sekunde wahllos Werte ausgespuckt, selbst wenn der Sensor ruhig liegt schwanken diese zwischen 30 und 200 etc... Aber ich bekomme schon mal Werte übertragen.Code:I2cstart I2cwbyte &HD2 I2cwbyte &H20 I2cwbyte &B00001111 I2cstop I2cstart I2cwbyte &HD2 I2cwbyte &H21 I2cwbyte &BB00100110 I2cstop I2cstart I2cwbyte &HD2 I2cwbyte &H22 I2cwbyte &B00000000 I2cstop I2cstart I2cwbyte &HD2 I2cwbyte &H23 I2cwbyte &B00010000 I2cstop I2cstart I2cwbyte &HD2 I2cwbyte &H24 I2cwbyte &B00000000 I2cstop I2cstart I2cwbyte &HD2 I2cwbyte &H25 I2cwbyte &B00000000 I2cstop
Der gute Mann ließt die Werte so ein:
Was hat das mit demCode:Sub X_GYRO_lesen() Gyro_Status_Reg = Register_lesen(L3G4200DSlaveid , L3G4200D_STATUS_REG) if Gyro_Status_Reg.0 = 1 then call GYRO_BDU_EIN Gyro_X_h = Register_lesen(L3G4200DSlaveid , L3G4200D_OUT_X_H) Gyro_X_l = Register_lesen(L3G4200DSlaveid , L3G4200D_OUT_X_L) call GYRO_BDU_AUS Gyro_X = MAKEINT(Gyro_X_l , Gyro_X_h) end if End Sub
call GYRO_BDU_EIN
bzw
call GYRO_BDU_AUS
auf sich?
Liegt dort das letzte Rätsel versteckt? Diesen Teil versteh ich nicht ganz.
- - - Aktualisiert - - -
Ich habe jetzt mal den BascomCode von dem anderen Forum genommen und nur auf meine Anwendung gekürzt. Funktioniert 1A!
Jetzt versuche ich das mal Schritt für Schritt zu meinem Ursprünglichen Code umzuschreiben. Wenn ich den Fehler gefunden habe geb ich euch Bescheid!
Danke für die Unterstützung!![]()
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
Hi,
BDU steht für Block Data Update. Das bedeutet, solange BDU gesetzt ist (1), werden die Register, in denen der 16Bit Wert enthalten ist, nicht verändert, damits beim Auslesen keinen Datenwirrwarr gibt, eine Art Dead Lock.
Ob der Sensor zwingend auf die Veränderung dieses Bits warten, kann ich dir nicht sagen, wird sicher irgenwo stehen.
Viel Erfolg!
Gruß
Chris
Genau das wars! Erst wenn der Wert ausgelesen wurde setzt er wieder neue in das Register.
Ich bin echt froh das ich gleich am Anfang mal einen recht komplizierten I2C Sensor genommen habe. Jetzt versteh ich grundsätzlich den Aufbau dieser Dinger und kann mit dem ACC weiter machen.
Ich hab hier sogar schon ganz schöne Ergebnisse beim Integrieren um den Winkel zu erhalten. Sehr wenig Drift!
Bisher hatte ich immer Analoge Gyros. Sehr ungenau...
Vielen Dank euch allen und noch einen schönen Sonntag!![]()
Lesezeichen