-         

Ergebnis 1 bis 10 von 10

Thema: ds1621 auslesen

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.01.2005
    Ort
    hessen
    Alter
    29
    Beiträge
    1.099

    ds1621 auslesen

    Anzeige

    hallo


    Ich habe hier versucht den ds1621 auslesen über das Rn-Board V.1.4 über die Twileitung, dabei bin ich aber recht erfolgreich gescheitert.leider

    hier zeige ich euch erstmal das Programm:

    Code:
    $regfile = "m8def.dat"
    $crystal = 7372800
    $baud = 9600
    $lib "i2c_twi.lbx"
    
    Config Int0 = Low Level
    Config Scl = Portc.5
    Config Sda = Portc.4
    
    Declare Function Twistart() As Byte
    Declare Function Twisend(byval Databyte As Byte) As Byte
    Declare Function Twireceive(byref Databyte As Byte) As Byte
    Declare Sub Twistop()
    Dim Status As Byte
    Dim Datenbyte1 As Byte
    Dim Datenbyte2 As Byte
    Dim Command As Byte
    Dim I As Byte
    Dim B As Byte
    I2cinit
    Twbr = 0
    Twsr = &B00000000
    '----------------------------------------------Hauptprogramm------------------------------------------------------------
    Do
    Twsr.2 = 1
    Twcr = &H08
    Status = Twistart()
    Status = Twisend(&B00000001 And &B7665321X90)
    Status = Twireceive(datenbyte1)
    Status = Twireceive(datenbyte2)
    Print Datenbyte1
    Print Datenbyte2
    Twistop
    Loop
    End
    
    Function Twistart() As Byte
    Twcr = &B10100100
    Do : Loop Until Twcr.twint = 1
    Twistart = Twsr And &B11111000
    End Function
    
    'twi anweisungen
    
    Function Twisend(byval Databyte As Byte) As Byte
    Twdr = Databyte
    Twcr = &B10000100
    Do : Loop Until Twcr.twint = 1
    End Function
    
    Function Twireceive(byref Databyte As Byte) As Byte
    Twcr = &B10000100
    Do : Loop Until Twcr.twint = 1
    Twireceive = Twsr And &B11111000
    End Function
    
    Sub Twistop()
    Twcr = &B10010100
    End Sub
    Ich habe auch nicht gerade viel über das Thema Twi gefunden.
    Habt ihr vielleicht ein paar Tipps oder könnt ihr mir auf eine andere Art helfen.

    gruß
    patrick

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    64
    Beiträge
    277

    Re: ds1621 auslesen

    Zitat Zitat von patti16
    Ich habe auch nicht gerade viel über das Thema Twi gefunden.
    Habt ihr vielleicht ein paar Tipps oder könnt ihr mir auf eine andere Art helfen.
    Na, da steht in der Hilfe schon einiges. Ich werde auch das Gefühl nicht los, daß Du Dir das Leben schwerer machst, als wirklich notwendig.
    BTW: Das Einbinden der TWI-Lib ist nur dann notwendig, wenn Du Hardware I2C nutzen willst (spart ein paar Byte Platz und geht mit dem Meega. Dann musst Du aber auch die entsprechenden Pins nutzen.

    Hier mal eine Subroutine zum einfache Auslesen des 1621/1631:

    Code:
    Sub Readtemp(byval Device As Byte)
    Local Deviceread As Byte
    Deviceread = Device + 1
    
    I2cstart
    I2cwbyte Device
    I2cwbyte &HEE                                'temperaturmessung anstoßen
    I2cstop
    
    I2cstart
    I2cwbyte Device
    I2cwbyte &HAA                                'Temperaturmessung Lesekommando
    I2cstop
    
    I2cstart
    I2cwbyte Deviceread
    I2crbyte Lowtemp , Ack                       'LSB holen
    I2crbyte Hightemp , Nack                     'MSB holen
    
    I2cstop
    
    Value = Lowtemp * 10
    If Hightemp = 128 Then
      Value = Value + 5
    End If
    
    End Sub
    Nach Aufruf der Sub steht das Ergebnis in Value im Format Grad*10. Also für z.B. 18,5°C der Wert 185. Diese Routine erlaubt nur eine Auflösung von 0,5°C, wenn die möglichen 0,07°C benötigt werden, sieht es etwas komplizierter aus, das reiche ich gerne nach, wenn die einfache Lösung bei Dir funktioniert.

    Viele Grüße
    Henrik

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.01.2005
    Ort
    hessen
    Alter
    29
    Beiträge
    1.099
    hi

    danke werde ich gleich morgen abend nach der arbeit ausrpobieren.

    gruß
    patrick

  4. #4
    Gast
    hi

    danke, habe ds gerade auch mal umgeschrieben jedoch klappt es noch nicht habe ich was vergessen?

    Code:
    '------------------------------------die anweisungen für prozessor,use.-------------------------------------------------
    $regfile = "m8def.dat"
    $crystal = 7372800
    $baud = 9600
    
    
    Config Scl = Portc.5
    Config Sda = Portc.4
    
    Dim Device As Byte
    Dim Deviceread As Byte
    Dim Lowtemp As Byte
    Dim Hightemp As Byte
    Dim Value As Byte
    I2cinit
    '----------------------------------------------Hauptprogramm------------------------------------------------------------
    Do
    
    I2cstart
    I2cwbyte Device
    I2cwbyte &HEE                                'temperaturmessung anstoßen
    I2cstop
    
    I2cstart
    I2cwbyte Device
    I2cwbyte &HAA                                'Temperaturmessung Lesekommando
    I2cstop
    
    I2cstart
    I2cwbyte Deviceread
    I2crbyte Lowtemp , Ack                       'LSB holen
    I2crbyte Hightemp , Nack                     'MSB holen
    
    I2cstop
    
    Value = Lowtemp * 10
    If Hightemp = 128 Then
      Value = Value + 5
    End If
    
    Loop
    End
    gruß
    patrick

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.01.2005
    Ort
    hessen
    Alter
    29
    Beiträge
    1.099
    hier habe ich es das er mir das ausgibt praktisch müsste ich das nur noch durch 10 Teilen und dann hätte ich doch schon alles.

    Code:
    '------------------------------------die anweisungen für prozessor,use.-------------------------------------------------
    $regfile = "m8def.dat"
    $crystal = 7372800
    $baud = 9600
    
    
    Config Scl = Portc.5
    Config Sda = Portc.4
    Dim Device As Byte
    Dim Deviceread As Byte
    Dim Lowtemp As Byte
    Dim Hightemp As Byte
    Dim Value As Byte
    I2cinit
    '----------------------------------------------Hauptprogramm------------------------------------------------------------
    Do
    
    I2cstart
    I2cwbyte Device
    I2cwbyte &HEE                                'temperaturmessung anstoßen
    I2cstop
    
    I2cstart
    I2cwbyte Device
    I2cwbyte &HAA                                'Temperaturmessung Lesekommando
    I2cstop
    
    I2cstart
    I2cwbyte Deviceread
    I2crbyte Lowtemp , Ack                       'LSB holen
    I2crbyte Hightemp , Nack                     'MSB holen
    
    I2cstop
    
    Value = Lowtemp * 10
    If Hightemp = 128 Then
      Value = Value + 5
    End If
    
    print value
    
    Loop
    End

    so sieht das ganze glaube ich schon viel viel besser aus danke.

    gruß
    patrick

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    64
    Beiträge
    277
    Zitat Zitat von Anonymous
    hi

    danke, habe ds gerade auch mal umgeschrieben jedoch klappt es noch nicht habe ich was vergessen?
    Ja, einiges. Woher soll denn der Chip wissen, daß er gemeint ist.
    Bei meiner Sub wird die Adresse ja als Parameter übergeben, wenn Du es anders machst, musst Du Device schon mit einem Wert versehen.
    Außerdem muss Value ein Word sein (zumindest wenn Temperaturen über 25,5°C gemessen werden sollen).

    Und wie liest Du den Wert aus? Ich entdecke weder eine Print value noch eine Lcd value Anweisung. Ich hatte doch extra eine Sub vorgeschlagen, die Du dann natürlich declarieren musst, um das flexibel in eigenen Programmen verwenden zu können.

    Aber bitte... untenstehend der korrigierte Code für Deinen Ansatz:

    Code:
    '------------------------------------die anweisungen für prozessor,use.-------------------------------------------------
    $regfile = "m8def.dat"
    $crystal = 7372800
    $baud = 9600
    
    
    Config Scl = Portc.5
    Config Sda = Portc.4
    
    Dim Device As Byte
    Dim Deviceread As Byte
    Dim Lowtemp As Byte
    Dim Hightemp As Byte
    Dim Value As Word      '!!!!!!!
    I2cinit
    
    Device = 144         'Wenn alle Adressleitungen des 1621 auf GND sind.
    Deviceread = 145
    
    '----------------------------------------------Hauptprogramm------------------------------------------------------------
    Do
    
    I2cstart
    I2cwbyte Device
    I2cwbyte &HEE                                'Temperaturmessung anstoßen
    I2cstop
    
    I2cstart
    I2cwbyte Device
    I2cwbyte &HAA                                'Temperaturmessung Lesekommando
    I2cstop
    
    I2cstart
    I2cwbyte Deviceread
    I2crbyte Lowtemp , Ack                       'LSB holen
    I2crbyte Hightemp , Nack                     'MSB holen
    
    I2cstop
    
    Value = Lowtemp * 10
    If Hightemp = 128 Then
      Value = Value + 5
    End If
    
    Print value
    ' oder LCD value
    
    waitms 500                                         'kurze Pause 
    Loop
    End
    Viele Grüße
    Henrik

  7. #7
    Gast
    habe aber noch eine frage

    woher weißt du das device = 144 ist habe das ihr im rb unter Sensoren (den adressname anders gesagt bekommen)??
    was hat deviceread der wert 145 zu sagen??

    tut mir leid für die fragen aber bin bei I2C erst das erstemal am bearbeiten.

    Device = 144 'Wenn alle Adressleitungen des 1621 auf GND sind.
    Deviceread = 145

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    64
    Beiträge
    277
    Zitat Zitat von patti16
    hier habe ich es das er mir das ausgibt praktisch müsste ich das nur noch durch 10 Teilen und dann hätte ich doch schon alles.
    Ja, wenn Du die oben erwähnten paar Kleinigkeiten noch berücksichtigst .

    Die formatierte Ausgabe läßßt sich dann enteder mit der print value/10; ","; print value MOD 10 Methode erledigen oder, wenn solche Konvertierungen öfter benötigt werden:
    Code:
    Dim Convert_strg As String * 10 
    ...
    ...
    ...
    '------------------------------------------------------------
    Sub Showvalue_komma1()
    
    Convert_strg = Str(value)
    Convert_strg = Format(convert_strg , " 0.0")
    print Convert_strg
    
    End Sub
    Grüße
    Henrik

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    64
    Beiträge
    277
    Zitat Zitat von Anonymous
    woher weißt du das device = 144 ist habe das ihr im rb unter Sensoren (den adressname anders gesagt bekommen)??
    was hat deviceread der wert 145 zu sagen??
    Ich weiß das, weil ich Datenblätter lese und mir daher bekannt ist, daß das höherwertige Adressnibble für den DS1621 feast auf &h09 (dezimal 144) liegt, er drei vom User zu definierende Pins (im niederwertigen Nibble) hat, die die ingesamt 16 möglichen Devices näher bestimmen. Das niederwertigste Bit entscheidet ob der Slave bei der nächsten Operation gelesen oder geschrieben werden soll. Bei Leseoperationen ist die Adresse also immer um eins höher als die Deviceadresse.

    Das steht aber wirklich alles ganz ausführlich in den datenblättern und in ungezählten Artikeln im Netz. Wie hat Du denn Deinen Schaltkreis aufgebaut, ohne Kenntnisse dessen zu haben?

    Viele Grüße
    Henrik

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.01.2005
    Ort
    hessen
    Alter
    29
    Beiträge
    1.099
    nee ich habe habe mich schon informiert habe aber gedacht das dich das mit meiner version richtig wäre.

    naja auf jeden fall wusste ich wie ich das ganze aufbauen sollte habe nach gefragt habe auch schon was gefunden in einem Buch.

    naja muss das datenblatt mal richtig übersetzen.

    gruß
    patrick

Berechtigungen

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