- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 11

Thema: I2C und DS1631 allgemeine Grundlagen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638

    I2C und DS1631 allgemeine Grundlagen

    Hallo Gemeinde!


    Ich habe mich seit einigen Tagen an meinen ersten I2C-Versuchen gewagt. Allerdings scheinen mir einige Grundlagen massiv zu fehlen, weshalb ich nicht wirklich vorankomme. Ich habe das RN-Wissen und das Buch "Programmieren der AVR RISC-Microkontroller mit Bascom" von Claus Kühnel zu rate gezogen und mir sämtliches über I2C durchgelesen. Auch versuchte ich, über Google an einige Beispiele zu kommen. Das Datenblatt des DS1631 habe ich natürlich ebenfalls zur Hand.

    Zur Hardware: An einem Mega8 hängen ein DS1631 Temperatursensor und ein ST24C16 EEPROM. SDA und SCL sind über jeweils 6k8 an +5V.

    Als erste Tat wollte ich den DS1631 ansprechen, allerdings scheint mir hier einiges an Basiswissen zu fehlen. Ich habe bis jetzt folgende Dinge verstanden:
    • Der Mega8 ist der Master, die beiden Bausteine sind die Slaves
    • Der Datenstrom am Bus geht nacheinander vor sich
    • Um ein Baustein anzusprechen muss als erstes die Slave-Adresse des Bausteins gesendet werden
    • Die Übertragung geht Byteweise vor sich
    • Es funktioniert nicht


    Der DS1631 besitzt laut Datenblatt diese Adresse (A0,A1,A2 liegen auf GND):
    10010000 für schreiben
    10010001 für lesen

    Weiters gibt es Befehle, um den Baustein etwas zu befehlen (nona). Diese sind:
    Stop Convert T [ 22h ]
    Stops temperature conversions when the device is in continuous conversion mode (1SHOT = 0).
    Read Temperature [ AAh ]
    Reads last converted temperature value from the 2-byte temperature register.
    Access TH [ A1h ]
    Reads or writes the 2-byte TH register.
    Access TL [ A2h ]
    Reads or writes the 2-byte TL register.
    Access Config [ ACh ]
    Reads or writes the 1-byte configuration register.
    Software POR [ 54h ]

    Soweit ich das verstanden habe, sind die Befehle im Zahlensystem Hex. Als ich versuchte, diese Werte in Bascom zu verwenden bekam ich Compilerfehler. Ich vermute, ich muss die Eingabe eines Wertes in Hex irgendwie deklarieren. Leider war die Bascom-Hilfe wenig hilfreich.

    Vielleicht möchte jemand Licht in meine massive Dunkelheit bringen?
    Geändert von Thomas E. (18.03.2012 um 10:11 Uhr)
    Grüße
    Thomas

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Für z.B. HEX 20 kommt da einfach &H20 hin. Dein Beispiel mit Stop Convert T wäre dann &H22
    Der Compiler macht dann daraus eh wieder ein Byte.

    Aus irgendwelchen Gründen läuft bei mir meist SoftTWI besser als Hardware.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Zitat Zitat von peterfido Beitrag anzeigen
    Für z.B. HEX 20 kommt da einfach &H20 hin. Dein Beispiel mit Stop Convert T wäre dann &H22
    Alles klar, eigentlich hätte ich auch selbst draufkommen sollen.

    Zitat Zitat von peterfido Beitrag anzeigen
    Aus irgendwelchen Gründen läuft bei mir meist SoftTWI besser als Hardware.
    Ich benutze ebenfalls Soft-I2C.

    Inzwischen konnte ich bereits das EEPROM ansprechen, aber beim DS1631 beiße ich mir noch die Zähne aus. Mein Ansatz:
    Laut Datenblatt funktioniert das Auslesen der Temperatur so (Seite 12, Absatz "2-Wire Reads"):
    1. I2C start
    2. Control Byte
    3. Read Temperature Command
    4. ACK from device
    5. Repeated start
    6. Conrol byte with same Slave Adress
    7. Read ACK (Byte 1)
    8. Read NACK (Byte 2)
    9. Stop

    Das R/W-Bit im Control-Byte muss 1 sein, damit dem DS1631 eine Leseoperation mitgeteilt wird.
    Ist das so richtig?
    Grüße
    Thomas

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Thomas E. Beitrag anzeigen
    1. I2C start
    2. Control Byte
    3. Read Temperature Command
    4. ACK from device
    5. Repeated start
    6. Conrol byte with same Slave Adress
    7. Read ACK (Byte 1)
    8. Read NACK (Byte 2)
    9. Stop

    Das R/W-Bit im Control-Byte muss 1 sein, damit dem DS1631 eine Leseoperation mitgeteilt wird.
    Ist das so richtig?
    Die erste Operation ist ein Write, du schreibst das Kommando. Die Zweite ist ein Read, du liest die Werte.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Hallo Klebwax!


    Vielen Dank für deine Antwort.
    Nach nochmaligen Durchlesen des entsprechenden Absatzes im Datenblatt habe ich jetzt auch gesehen, dass das R/W-Bit beim ersten Mal 0 sein muss.

    Hier mein erster Versuch:
    Code:
    Do
    
       If S2 = 0 Then
    
          Led = 0
    
          Waitms 500
    
          Incr Count
    
          I2cstart
          I2cwbyte &H90
          I2cwbyte &HAA
          I2crepstart
          I2cwbyte &H91
          I2crbyte Var1 , Nack
          I2crbyte Var2 , Ack
          I2cstop
          Waitms 10
    
          Cls
          Lcd "Gelesen:"
          Locate 2 , 1
          Lcd "Var1=" ; Var1
          Lcd "  "
          Lcd "Var2=" ; Var2
          Lcd "  "
          Lcd Count
    
          Waitms 100
    
          Led = 1
    
       End If
    
    Loop
    Als Var1 bekomme ich 22, wenn ich die Platine mit dem Föhn "anföhne" steit dieser Wert kontinuierlich auf etwa 38. Var2 bleibt immer bei 255. Ich nehme an, dass der DS1631 standardmäßig im 8-bit Modus arbeitet?
    Grüße
    Thomas

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von Thomas E. Beitrag anzeigen
    I2cwbyte &H91
    I2crbyte Var1 , Nack
    I2crbyte Var2 , Ack
    Nack und Ack müssen genau anders herum.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Da wäre Code zum gucken besser. Bei meinen Bauteilen ist die Leseadresse um 1 höher als die Schreibadresse.

    Config:
    Code:
    Const Si4703_read_addr = &H21                               ' Lese Adresse SI4703
    Const Si4703_write_addr = &H20
    Lesen:
    Code:
    I2cstart
    I2cwbyte Si4703_read_addr
    For I = 0 To 31
       I2crbyte Register_read_byte(i) , Ack
    Next I
    I2cstop

    Schreiben:
    Code:
    Si4703_write_register:
       I2cstart
       I2cwbyte Si4703_write_addr
       For I = 1 To Anzahl
          I2cwbyte Registerbyte(i)
       Next I
       I2cstop
    Return
    Hat sich überschnitten. Jetzt ist ja code zum gucken da.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

Ähnliche Themen

  1. DS1631 unter Bascom
    Von tobuc0 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 26.02.2010, 18:45
  2. IIC-Temp.-sensor DS1631 Ausleseproblem
    Von Imrahil im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 4
    Letzter Beitrag: 25.09.2008, 22:38
  3. M-Unit und DS1631-Aufloesung
    Von Kauz im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 2
    Letzter Beitrag: 10.03.2007, 06:47
  4. DS1631 + Pullup
    Von philiph im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 25.09.2006, 19:17
  5. DS1631 Problem
    Von philiph im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 17.09.2006, 13:28

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress