Sensor mit I2C an Atmega 328p, Daten werden nicht übertragen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Sensor mit I2C an Atmega 328p, Daten werden nicht übertragen

      Hallo zusammen,

      ich habe einen I2C Sensor VCNL3040 von Vishay, das ist ein optischer Distanz Sensor.
      Der Sensor ist an einen Atmgea328P angeschlossen, sie Serielle Schnittstelle zum PC läuft auch.
      Ich habe ein Testprogramm laufen lassen um die I2C Adresse herauszufinden.
      Diese wir im Seriellen Monitor auch angezeigt, deshalb gehe ich davon aus das alle Anschlüsse ok sind.

      Der Serielle Monitor zeiht mit die I2C Adresse H60 an:
      Scan start
      Slave at : 192d, = C0hex
      with chip address 60h
      End Scan´

      Das Problem wird in der nächsten Nachricht beschreiben weil ich am Ende der Verfügbaren Zeichen war...
      Dateien

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Dima () aus folgendem Grund: Hier ist mein Bascom Coode: $regfile = "m328pdef.dat" $crystal = 1000000 $baud = 9600 Config Sda = Portc.4 Config Scl = PortC.5 Const schreiben_Adresse= &H60 Const lesen_Adresse= &H61 I2cinit Dim Lowbyte As Byte Dim Highbyte As Byte Lowbyte=0 Highbyte=0 Do 'Hier möchte ich meinen Sensor parametrieren: I2cstart 'I2C Start I2cwbyte &H60 'Adresse schreiben I2cwbyte &H03 'Commandcode 0x03 I2cwbyte &B00000000 'Lowbyte I2cwbyte &B00000000 'Highbyte I2cstop 'I2C Stop Print Err 'Error Im Seriellen Monitoir drucken, bei 0 ok, bei 1 kein Ack vom Sensor erhalten 'Hier möchte ich die Parametrierung aus dem Sensor auslesen: I2cstart I2cwbyte &H61 'Adresse schreiben I2cwbyte &H03 'Command Code I2cstart I2cwbyte &H61 'Adresse schreiben I2cwbyte &H03 'Command Code I2crbyte Lowbyte , ack 'Lowbyte lesen und eine ACK senden I2crbyte Highbyte , Nack 'High Byte lesen und einen NACK senden I2cstop waitms 1 Print "Highbyte: "; Highbyte Print "Lowbyte: "; Lowbyte Print Err Loop END

    • Hier ist mein Bascom Coode:

      $regfile = "m328pdef.dat"
      $crystal = 1000000
      $baud = 9600


      Config Sda = Portc.4
      Config Scl = PortC.5
      Const schreiben_Adresse= &H60
      Const lesen_Adresse= &H61
      I2cinit
      Dim Lowbyte As Byte
      Dim Highbyte As Byte
      Lowbyte=0
      Highbyte=0
      Do

      'Hier möchte ich meinen Sensor parametrieren:
      I2cstart 'I2C Start
      I2cwbyte &H60 'Adresse schreiben
      I2cwbyte &H03 'Commandcode 0x03
      I2cwbyte &B00000000 'Lowbyte
      I2cwbyte &B00000000 'Highbyte
      I2cstop 'I2C Stop
      Print Err 'Error Im Seriellen Monitoir drucken, bei 0 ok, bei 1 kein Ack vom Sensor erhalten

      'Hier möchte ich die Parametrierung aus dem Sensor auslesen:
      I2cstart
      I2cwbyte &H61 'Adresse schreiben
      I2cwbyte &H03 'Command Code
      I2cstart
      I2cwbyte &H61 'Adresse schreiben
      I2cwbyte &H03 'Command Code
      I2crbyte Lowbyte , ack 'Lowbyte lesen und eine ACK senden
      I2crbyte Highbyte , Nack 'High Byte lesen und einen NACK senden
      I2cstop
      waitms 1
      Print "Highbyte: "; Highbyte
      Print "Lowbyte: "; Lowbyte
      Print Err
      Loop
      END
    • Vom Seriellen Monitor erhalte ich folgendes:

      Lowbyte: 255
      Highbyte: 255
      1
      1


      die beiden "1" ist das Err, hier solle ich eine 0 bekommen, hier sagt bascom dass das Ack vom Sensor gesendet wurde, wenn ich er richtig verstanden habe.
      Und bei Low und High Byte würde ich eine 0 erwarten, weil die ja reingeschrieben wurde.
      Anscheinend mache ich etwas beim schreiben falsch?? Ich weiß aber nicht was.
      Ich messe den Strom auf der Platine, dieser müsste ja auch etwas ansteigen, sobald der Sensor eingeschaltet wurde...

      Ich würde mich freuen wenn mir jemand helfen kann.
      Sitze schon eine ganze Weile daran...

      Vielen Dank schonmal vor ab.

      Grüße
      Dima
    • Mit den Adressen 192 und 193 habe ich es jetzt ausprobiert, war das gleich Ergebnis:


      Do

      'Hier möchte ich meinen Sensor parametrieren:
      I2cstart 'I2C Start
      I2cwbyte &H192 'Adresse schreiben
      I2cwbyte &H03 'Commandcode 0x03
      I2cwbyte &B00000000 'Lowbyte
      I2cwbyte &B00000000 'Highbyte
      I2cstop 'I2C Stop
      Print Err 'Error Im Seriellen Monitoir drucken, bei 0 ok, bei 1 kein Ack vom Sensor erhalten

      'Hier möchte ich die Parametrierung aus dem Sensor auslesen:
      I2cstart
      I2cwbyte &H193 'Adresse lesen
      I2cwbyte &H03 'Command Code
      I2cstart
      I2cwbyte &H193 'Adresse lesen
      I2cwbyte &H03 'Command Code
      I2crbyte Lowbyte , ack 'Lowbyte lesen und eine ACK senden
      I2crbyte Highbyte , Nack 'High Byte lesen und einen NACK senden
      I2cstop
      waitms 1
      Print "Highbyte: "; Highbyte
      Print "Lowbyte: "; Lowbyte
      Print Err
      Loop
    • Jetzt habe ich die Slave Adresse wir Michael es sagte auf 192 und 193 in Hex eingetragen C0 und C1.

      Jetzt hat sich was getan, ich bekomme im Monitor folgendes:

      Highbyte:255
      Lowbyte:255
      1
      0

      Ich würde sagen dass das lesen jetzt erfolgreich war und das schreiben nicht erfolgreich war?
    • Du hattest recht, der Sensor ist jetzt eingeschaltet, der Strom ist von 2,1 auf 4,9mA angestiegen.
      Und die IR Led kann ich mit meinem Handy jetzt auch sehen.

      Also funktionier der Code schonmal fürs schreiben. Vielen Dank nochmal für deinen Hinweis mit der Adresse!!!

      Beim lesen habe ich anscheinend ich einen Fehler.
      Hier gehe ich aber doch genau nach dem Datenblatt oder übersehe ich hier auch etwas?
      Was ich im Datenblatt komisch finde ist das der I2C 2x gestartet werden soll?

      I2cstart
      I2cwbyte &HC1 'Adresse lesen
      I2cwbyte &H03 'Command Code
      I2cstart
      I2cwbyte &HC1 'Adresse lesen
      I2cwbyte &H03 'Command Code
      I2crbyte Lowbyte , ack 'Lowbyte lesen und eine ACK senden
      I2crbyte Highbyte , Nack 'High Byte lesen und einen NACK senden
      I2cstop
    • Dima schrieb:

      I2cstart
      I2cwbyte &HC1 'Adresse schreiben
      I2cwbyte &H03 'Command Code
      I2cstart
      I2cwbyte &HC1 'Adresse lesen
      I2cwbyte &H03 'Command Code
      I2crbyte Lowbyte , ack 'Lowbyte lesen und eine ACK senden
      I2crbyte Highbyte , Nack 'High Byte lesen und einen NACK senden
      I2cstop
      Das muss &hC0 heißen, du willst doch lesen oder nicht?

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mitch64 ()

    • Im Anhang habe ich ein Bild von der Lese Kommunikation vom Sensor und dem Bascom Code eingetragen.
      Da ist doch alles so wie im Datenblatt oder übersehe ich da was?

      Das rot markierte Rd ist doch mit I2crbyte erledigt oder?
      Dateien
      • I2C_Lesen.bmp

        (36,16 kB, 20 mal heruntergeladen, zuletzt: )
    • Michael schrieb:

      Da musst du nochmal ran.
      Ich habe noch ein paar Markierungen hinzugefügt.

      Unbenannt.png


      Start
      Schreibadresse mit Schreibbit (null) schreiben.
      Commandbyte schreiben
      Start
      Leseadresse (Schreibadresse plus Lesebit) schreiben
      Byte lesen
      Byte lesen
      ...
      Stop


      Vergiss nicht die Stackwerte, ich sehe keine im Programm.
      Später wirst du sie brauchen.

      Kaum macht man es richtig, schon läuft die Verbindung.
      Vielen Dank für die Unterstützung.

      Ich habe für die Schreibadresse, die Leseadresse eingetragen.

      Ich habe die Bedeutung für Wr und Rd nicht ganz einzuordnen gewusst.
      Jetzt weiß ich was es bedeutet.

      Vielen Dank nochmal für die Hilfe!!!! a_64_3a718cae a_64_3a718cae a_64_3a718cae a_64_3a718cae