Kommunikation mit MLX90614

    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!

    • Kommunikation mit MLX90614

      Da die I2C verindung nun endlich funktioniert a_14_3ef964b0 möchte ich den MLX nicht nur auslesen sondern auch neu Konfigurieren :)

      Ich habe etwas herum Probiert bekomme aber leider keine daten Geändert.
      Im Datenblatt 8.4.5 steht das die ersten/letzten bits angeben ob man auf den Ram oder EEProm zugreifen möchte.
      Ich vermute das ich ein Fehler beim ansprechen habe.

      Opcode Command
      000x xxxx* RAM Access
      001x xxxx* EEPROM Access
      1111_0000** Read Flags
      1111_1111 Enter SLEEP mode

      Ich habe versucht werte zu ändern, jedoch gelingt mir das nicht.
      Übrigens ist die SM Adresse wirklich 5A ! Er reagiert darauf aber nicht, sondern nur auf 0X00

      Mein neuer Code:

      BASCOM-Quellcode

      1. Call Read_mlx(Addr , cmd , Rlbyte , Rhbyte , Crc)
      2. Call Write_mlx(addr , Cmd , Rlbyte , Rhbyte , Crc)
      3. Sub Read_mlx(byval Addr As Byte , Byval Command As Byte , Rlbyte As Byte , Rhbyte As Byte , Crc As Byte)
      4. I2cstart 'start
      5. I2cwbyte Addr 'address
      6. I2cwbyte Cmd 'command
      7. I2crepstart 'repeat start
      8. I2cwbyte Addr 'repeat adress
      9. I2crbyte Rlbyte , Ack 'lowbyte
      10. I2crbyte Rhbyte , Ack 'highbyte
      11. I2crbyte Crc , Nack 'crc error
      12. I2cstop
      13. End Sub
      14. Sub Write_mlx(byval Addr As Byte , Byval Command As Byte , Byval Rlbyte As Byte , Byval Rhbyte As Byte , Crc As Byte)
      15. I2cstart 'start
      16. I2cwbyte Addr 'address
      17. I2cwbyte Cmd 'command
      18. I2cwbyte Rlbyte 'lowbyte
      19. I2cwbyte Rhbyte 'highbyte
      20. I2crbyte Crc , Nack 'crc error
      21. I2cstop
      22. End Sub
      Alles anzeigen
    • Ich tippe jetzt auf Zeile 26. So wie ich das Db lese, musst du die passende CRC da auch schreiben. Mittendrin mal lesen, hm, ich denke da müsste ein i2cstart vorher kommen, mit Adresse und so weiter. Davon steht im DB nix. Zum Schreiben immer schreiben, nicht lesen. X/ Die empfangene PEC wird wohl ausgewertet werden und vielleicht werden die gesendeten Daten nur bei gültiger CRC gespeichert, sodass man diese Daten nach dem Schreiben zum Vergleich wieder auslesen sollte.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Also ich denke,aus dem low- und high-byte musst du eine crc8 checksum bilden und mitschicken. Der slave wird dann mit dieser crc die empfangenen Daten auf Richtigkeit prüfen und entweder verwerfen oder an der gewünschten Stelle abspeichern. Durch Auslesen nach dem Schreiben muss man den Schreiberfolg überprüfen. Schau mal hier avrhelp.mcselec.com/crc8.htm


      edit im Db steht "The PEC calculation includes all bits except the START, REPEATEDSTART, STOP, ACK, and NACK bits." So müssen auch SA und command auch in die crc einfließen.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

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

    • So sieht das bei mir momentan aus.

      Leider sind die crc werte immer unterschiedlich :/ also berechne ich das wohl falsch.

      Sensor crc8: 12 (dez)
      Berechneter crc8: 233(dez)


      BASCOM-Quellcode

      1. Call Read_mlx(&H00 , &H22 , Rlbyte , Rhbyte , Crc)
      2. Dim Crca(5) As Byte
      3. Dim Crc2 As Byte
      4. Crca(1) = Addr
      5. Crca(2) = Cmd
      6. Crca(3) = Addr
      7. Crca(4) = Rlbyte
      8. Crca(5) = Rhbyte
      9. Crc2 = Crc8(crca(1) , 5)
      10. Cls
      11. Locate 1 , 1
      12. Lcd "Sensor crc8: " ; Crc ; " "
      13. Locate 2 , 1
      14. Lcd "Calc crc8: " ; Crc2 ; " "
      Alles anzeigen
    • Ich muss gestehen, ich bin auch ein bisschen ratlos und dachte, es ginge ganz einfach. Ich hab' mal in Wikipedia gelesen de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung und im Datenblatt. Im letzteren steht ja der Satz "The PEC calculation includes all bits except the START, REPEATEDSTART, STOP, ACK, and NACK bits. The PEC is a CRC-8 with polynomial X8+X2+X1+1. The MostSignificant Bit of every byte is transferred first." Mit dem rot markierten 'Generatorpolynom' müsste man dann die CRC berechnen. In bascom nach dessen Hilfe vielleicht so "When you want to use a different polynome, you can override the default by defining a constant named CRC8_POLY
      Const CRC8_POLY = &HAA 'use a different value". Aber was ist dann eigentlich die default Einstellung in bascom? Für mich gerade rätselhaft.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Ich habe mit meinem Code die Gespeicherte Adresse abgefragt.

      Slave adresse: 00(Hex)
      Befehl: 2E(Hex) = 00101110 (Bin) (EEprom slave adresse)

      Antwort:
      Low byte: 5A(Hex)
      High byte: B6(Hex)
      crc: 01100000(Bin) 80(dez)


      Berechneter crc: 10101111(bin) 127(dez)



      BASCOM-Quellcode

      1. Call Read_mlx(&H00 , &H2E , Rlbyte , Rhbyte , Crc)
      2. Dim Crca(5) As Byte
      3. Dim Crc2 As Byte
      4. Crca(1) = Addr
      5. Crca(2) = Cmd
      6. Crca(3) = Addr
      7. Crca(4) = Rlbyte
      8. Crca(5) = Rhbyte
      9. Crc2 = Crc8(crca(1) , 5)
      10. Cls
      11. Locate 1 , 1
      12. Lcd "Sensor crc8: " ; Crc ; " "
      13. Locate 2 , 1
      14. Lcd "Calc crc8: " ; Crc2 ; " "
      Alles anzeigen
    • @Michael &H00 kann ja nicht sein, das würde ja beim XORen nichts ändern.

      In der Hilfe für CRC8 ist eine VB Routine erwähnt, die scheinbar das Gleiche wie CRC machen soll.
      Dort wird das Polynom &H8C verwendet.
      Das passt zu X8+X5+X4+1, welches 1-wire nutzt, wenn das Polynom genau umgekehrt angegeben wird und das oberste wegfällt (weil immer 1):
      X8+X5+X4+X0 -> &B1_0011_0001 -> &B1000_1100 = &H8C
      Würde in deinem Fall bedeuten
      X8+X2+X1+X0 -> &B1_0000_0111 -> &B1110_0000 = &HE0
      Falls die Logik doch eine andere ist, müsstest du die 254 möglichen Polynome ausprobieren. Würde ich dann aber gegen 1-wire machen, wo man weiß, dass es stimmt.
    • Hab jetzt für den Simulator einen Kurzen Test geschrieben.

      BASCOM-Quellcode

      1. Const Crc8_poly = &HE0
      2. Const Addr = &H00
      3. const Cmd = &H2E
      4. const Rlbyte = &H5A
      5. const Rhbyte = &HB6
      6. const Crc = 80
      7. Dim Crca(5) As Byte
      8. Dim Crc2 As Byte
      9. Crca(1) = Addr
      10. Crca(2) = Cmd
      11. Crca(3) = Addr
      12. Crca(4) = Rlbyte
      13. Crca(5) = Rhbyte
      14. Crc2 = Crc8(crca(1) , 5)
      15. Print "Sensor crc8: " ; Crc ; " "
      16. Print "Calc crc8: " ; Crc2 ; " "
      17. End
      Alles anzeigen

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

    • So hab nun noch einmal die Temperatur ausgelesen

      Befehle:
      Adresse: &H00
      Befehl: &H07

      Antwort:


      Lowbyte: 15
      Highbyte: 58
      crc: 7

      Das Programm Berechnet aber 94

      Die Möglichkeit so einen wert auseinander zu nehmen gib es wohl nicht oder ?
      Außer Brute Force a_15_a5ddcf85

      BASCOM-Quellcode

      1. Const Crc8_poly = &HE0
      2. Const Addr = &H00
      3. Const Cmd = &H07
      4. Const Rlbyte = 15
      5. Const Rhbyte = 58
      6. Const Crc = 7
      7. Dim Crca(5) As Byte
      8. Dim Crc2 As Byte
      9. Crca(1) = Addr
      10. Crca(2) = Cmd
      11. Crca(3) = Addr
      12. Crca(4) = Rlbyte
      13. Crca(5) = Rhbyte
      14. Crc2 = Crc8(crca(1) , 5)
      15. Print "Sensor crc8: " ; Crc ; " "
      16. Print "Calc crc8: " ; Crc2 ; " "
      17. 'lowbyte 15
      18. 'highbyte 58
      19. 'crc 7
      20. '14863
      21. End
      Alles anzeigen
    • Neben einer Mail an MCS, dass dies nicht funktioniert, wäre dann die nächste Idee, den Vb code aus der Hilfe zu nehmen, an Bascom anzupassen und dann mit einem anderen Polynom laufen zu lassen.
      Dabei kannst du dann fürs Polynom auch eine Variable nehmen und alle möglichen durchprobieren.

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

    • Hm ich hab die Version 2.0.7.1 ist das Später irgendwann gefixt worden ?
      Het jemand die aktuellste version und könnte das im simulator ausprobieren ?


      Ich hatte mal eine neuere version.. 75
      Der hat zum einen wegen Mega8 und 8A herungejammert und die Fusebits hat er auch nicht richtig gemacht, sodass der controller statt mit 8Mhz nur in zeitlupe lief :/
      Deshalb hab ich noch die Alte.
    • Barter schrieb:

      Hm ich hab die Version 2.0.7.1 ist das Später irgendwann gefixt worden ?
      Het jemand die aktuellste version und könnte das im simulator ausprobieren ?


      Ich hatte mal eine neuere version.. 75
      Der hat zum einen wegen Mega8 und 8A herungejammert und die Fusebits hat er auch nicht richtig gemacht, sodass der controller statt mit 8Mhz nur in zeitlupe lief :/
      Deshalb hab ich noch die Alte.
      Ich probiere das mal, bin aber noch nicht zu Hause.
      2.0.8.0 funktioniert übrigens ausgezeichnet, ist nur etwas tricky zu finden, siehe hier