- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: I2C Sensor - Bekomme keinen Wert

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

    LiFePo4 Akku selber bauen - Video
    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

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    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

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2010
    Beiträge
    16
    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
    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.

    mit Config Twi = 400000 zeigt sich das Gleiche.

    Sehr seltsam.

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

    probier mal das :
    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
    Weißt du den, dass der Sensor funktioniert?

    Gruß
    Chris

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2010
    Beiträge
    16
    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.

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    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

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2010
    Beiträge
    16
    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:
    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
    Ich habe das jetzt mal so vor der DO Loop umgesetzt:
    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
    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.


    Der gute Mann ließt die Werte so ein:

    Code:
    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
    Was hat das mit dem

    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!

  8. #18
    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
    Zitat Zitat von hannes_u Beitrag anzeigen
    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:
    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
    Ich habe das jetzt mal so vor der DO Loop umgesetzt:
    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
    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.


    Der gute Mann ließt die Werte so ein:

    Code:
    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
    Was hat das mit dem

    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!
    Das klingt doch super
    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. #19
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    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

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2010
    Beiträge
    16
    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!

Seite 2 von 2 ErsteErste 12

Ä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, 20:33
  2. Schalter K6 liefert keinen Wert
    Von rchdrei im Forum Asuro
    Antworten: 7
    Letzter Beitrag: 04.05.2011, 20:39
  3. Antworten: 24
    Letzter Beitrag: 21.12.2007, 11: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, 18: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, 09:13

Berechtigungen

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

12V Akku bauen