-
        

Ergebnis 1 bis 9 von 9

Thema: von einem auf zwei(oder mehr) DS18S20 ???

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2004
    Beiträge
    101

    von einem auf zwei(oder mehr) DS18S20 ???

    Anzeige

    Hallo,

    ich probiere zur Zeit mit den Tempsensoren DS18S20 rum und habe auch schon einen am laufen.

    Nun möchte ich noch einen 2.Sensor mit einbinden, aber es wird mir immer bei beiden Sensoren das gleiche angezeigt.

    Hier mal mein Codebeispiel:
    Code:
    $regfile = "m16def.dat"
    $crystal = 8000000
    
    Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.4 , Db7 = Portd.3 , E = Portb.7 , Rs = Portb.6
    Config Lcd = 16 * 2
    Config Lcdbus = 4
    Cursor Off
    Cls
    
    Config 1wire = Portb.1
    
    Declare Sub Messung1
    Declare Sub Messung2
    
    
    Dim Sensor1(9) As Byte
    Dim Sensor2(9) As Byte
    Dim T As Integer
    Dim Temp As Single
    Dim T1 As Integer
    Dim Temp1 As Single
    
    Deflcdchar 0 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32
    
    Locate 1 , 1 : Lcd "Sensor 1: "
    Locate 2 , 1 : Lcd "Sensor 2: "
    
    Do
       Messung1
       Messung2
    Loop
    
    End
    
    Sub Messung1
       1wwrite &HCC
       1wwrite &H44
       Waitms 300
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       Sensor1(1) = 1wread(9)
       1wreset
                   Decr Sensor1(1)
                   T = Makeint(sensor1(1) , Sensor1(2))
                   T = T / 2
                   Temp = Sensor1(8) - Sensor1(7)
                   Temp = Temp / Sensor1(8)
                   Temp = T + Temp
                   Temp = Temp - 2.3
       Locate 1 , 11 : Lcd Fusing(temp , "#.##") ; Chr(0)
    End Sub
    
    Sub Messung2
       1wwrite &HCC
       1wwrite &H44
       Waitms 300
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       Sensor2(1) = 1wread(9)
       1wreset
                   Decr Sensor2(1)
                   T1 = Makeint(sensor2(1) , Sensor2(2))
                   T1 = T1 / 2
                   Temp1 = Sensor2(8) - Sensor2(7)
                   Temp1 = Temp1 / Sensor2(8)
                   Temp1 = T1 + Temp1
                   Temp1 = Temp1 - 2.3
       Locate 2 , 11 : Lcd Fusing(temp1 , "#.##") ; Chr(0)
    End Sub
    Warum läuft das nicht so? Was muß ich ändern?

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Soweit ich des seh, werden da anscheinend beide Sensoren mit der gleichen Adresse aufgerufen, d.h. der 2. Sensor wird garnicht abgefragt; der erste dafür 2x...

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    53
    Beiträge
    1.080
    Ich hab, ehrlich gesagt nicht viel Ahnung von 1wire. Aber könnte es sein, das unterschiedliche Geräte unterschiedliche Geräteadressen haben müssen?
    Deine Subs Messung1 und Messung2 schicken beide die selben Daten raus, warum sollte jedes Mal ein anderer Sensor abgefragt werden?

    Vielleicht hilft dir diese Seite weiter

    http://www.pirnaer.de/bascom_fuer_my...ur_ds1820.html

    Gruß MeckPommER
    Mein Hexapod im Detail auf www.vreal.de

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo,
    du musst jetzt den Sensor identifizieren, der antworten soll.
    Dies geht über die eingebrannte Nr.
    Schau dir mal die 1wsearchfirst und 1wsearchnext Befehle an.
    Wenn du die Nummern hast, dann gibst du anstelle des skip_rom Befehls ein Match_rom aus und anschließend überträgst du die Nummer (8byte).
    Dann kommt der read_scratchpad Befehl wie gewohnt.

    Gruß

    Rolf

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2004
    Beiträge
    101
    Könnte mal bitte einer so nett sein und mir das an meinen Code oben anpassen.

    Irgendwie bekomme ich nichtmal die Adressen ausgefragt(immer 0000...), so wie oben im Link beschrieben, aber die Sensoren funktionieren alleine schon in einem anderen Codebeispiel.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    30.01.2007
    Beiträge
    17
    Hallo

    hier ist ein code der Dir weiterhelfen sollte. Dieser funktioniert bei mir ohne Probleme. Das sind Teile eines Programs von mir. Nicht grad schoen aber es geht.


    Code:
    Dim Dsid1(8) As Byte                                        'Dallas ID 64 bits incl CRC
    Dim Dsid2(8) As Byte
    Dim Dsid3(8) As Byte
    Dim Dsid4(8) As Byte
    
    
    Dim Sc(9) As Byte                                           'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20
    
    
    Cls
    Setfont Font8x8
    
    W = 1wirecount()
    Dsid1(1) = 1wsearchfirst()
    Dsid2(1) = 1wsearchnext()
    Dsid3(1) = 1wsearchnext()
    Dsid4(1) = 1wsearchnext()
    
    If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       ' Control that the received CRC match the calculated
    Lcdat 1 , 1 , "CRC OK Sensor 1"
    Wait 1
    Lcdat 2 , 1 , Hex(dsid1(1))
    For B = 2 To 8
    Lcd Hex(dsid1(b))
    Next
    End If
    
    
    If Dsid2(8) = Crc8(dsid2(1) , 7) Then
    Lcdat 3 , 1 , "CRC OK Sensor 2"
    Wait 1
    Lcdat 4 , 1 , Hex(dsid2(1))
    For B = 2 To 8
    Lcd Hex(dsid2(b))
    Next
    End If
    
    If Dsid3(8) = Crc8(dsid3(1) , 7) Then
    Lcdat 5 , 1 , "CRC OK Sensor 3"
    Wait 1
    Lcdat 6 , 1 , Hex(dsid3(1))
    For B = 2 To 8
    Lcd Hex(dsid3(b))
    Next
    End If
    
    If Dsid4(8) = Crc8(dsid4(1) , 7) Then
    Lcdat 7 , 1 , "CRC OK Sensor 4"
    Wait 1
    Lcdat 8 , 1 , Hex(dsid4(1))
    For B = 2 To 8
    Lcd Hex(dsid4(b))
    Next
    End If
    
    
    Wait 5
    
    Cls
    
    Call Init
    
    ' Main loop
    Do
    Call Convallt                                               ' "Convert ALL T on the 1w-bus"
    'Waitus 100 :
    
     1wverify Dsid1(1)                                          'Issues the "Match ROM "
      Locate 1 , 1
     If Err = 1 Then
     Lcdat 9 , 1 , "Err " , 0                                   'Err = 1 if something is wrong,
     Elseif Err = 0 Then                                        'lcd " Sensor found"
     1wwrite &HBE
     Sc(1) = 1wread(9)                                          'read bytes into array
     If Sc(9) = Crc8(sc(1) , 8) Then
     Dg = Decigrades(sc(9))
    
      If Min1 > Dg Then
      Min1 = Dg
      Emin1 = Min1
     End If
    
     If Max1 < Dg Then
      Max1 = Dg
      Emax1 = Max1
     End If
    
    
     Lcdat 1 , 1 , Dg , 0 : Lcd " " : Lcd Min1 : Lcd " " : Lcd Max1
     Print Date$ ; "-" ; Time$ ; "-" ; "S1" ; Dg
     End If
     End If
    
    
     1wverify Dsid2(1)
     Locate 2 , 1
     If Err = 1 Then
     Lcd "DsId2 not on bus "
     Elseif Err = 0 Then
     1wwrite &HBE
     Sc(1) = 1wread(9)
     If Sc(9) = Crc8(sc(1) , 8) Then
     Dg = Decigrades(sc(9))
     Dg = Dg - 3
    
     If Min2 > Dg Then
      Min2 = Dg
      Emin2 = Min2
     End If
    
     If Max2 < Dg Then
      Max2 = Dg
      Emax2 = Max2
     End If
    
    
     Lcdat 2 , 1 , Dg , 0 : Lcd " " : Lcd Min2 : Lcd " " : Lcd Max2
     Print Date$ ; "-" ; Time$ ; "-" ; "S2" ; Dg
     End If
     End If
    
    
    
    
     1wverify Dsid3(1)
     Locate 3 , 1
     If Err = 1 Then
     Lcd "DsId3 not on bus "
     Elseif Err = 0 Then
     1wwrite &HBE
     Sc(1) = 1wread(9)
     If Sc(9) = Crc8(sc(1) , 8) Then
     Dg = Decigrades(sc(9))
     Dg = Dg - 2
    
     If Min3 > Dg Then
      Min3 = Dg
      Emin3 = Min3
     End If
    
     If Max3 < Dg Then
      Max3 = Dg
      Emax3 = Max3
     End If
    
    
    
     Lcdat 3 , 1 , Dg , 0 : Lcd " " : Lcd Min3 : Lcd " " : Lcd Max3
     Print Date$ ; "-" ; Time$ ; "-" ; "S3" ; Dg
     End If
     End If
    
    
     1wverify Dsid4(1)
     Locate 4 , 1
     If Err = 1 Then
     Lcd "DsId4 not on bus "
     Elseif Err = 0 Then
     1wwrite &HBE
     Sc(1) = 1wread(9)
     If Sc(9) = Crc8(sc(1) , 8) Then
     Dg = Decigrades(sc(9))
    
     If Min4 > Dg Then
      Min4 = Dg
      Emin4 = Min4
     End If
    
     If Max4 < Dg Then
      Max4 = Dg
      Emax4 = Max4
     End If
    
     Lcdat 4 , 1 , Dg , 0 : Lcd " " : Lcd Min4 : Lcd " " : Lcd Max4
     Print Date$ ; "-" ; Time$ ; "-" ; "S4" ; Dg
     End If
     End If
    
    
    
     For I = 1 To 10
     Test = 11 - I
     If Test < 10 Then
        Lcdat 6 , 1 , "0" , 0
        Lcd Test
    
     Else
        Lcdat 6 , 1 , Test , 0
    
     End If
    
     Wait 1
     Next I
    
    Loop
    End
    
    Sub Init
     Cls
    
    Min1 = Emin1                                                ' to get a real value from start
    Min2 = Emin2
    Max1 = Emax1
    Max2 = Emax2
    Min3 = Emin3                                                ' to get a real value from start
    Min4 = Emin4
    Max3 = Emax3
    Max4 = Emax4
    
    
    End Sub
    
    
    
    
    Sub Convallt
     1wreset                                                    ' reset the bus
     1wwrite &HCC                                               ' skip rom
     1wwrite &H44
     Set Portb.3
     Waitms 800
     Reset Portb.3                                              ' Convert T
    End Sub
    
    
    Function Decigrades(byval Sc(9) As Byte)
    Dim Tmp As Byte , T As Integer , T1 As Integer
    
     Tmp = Sc(1) And 1                                          ' 0.1C precision
     If Tmp = 1 Then Decr Sc(1)
     T = Makeint(sc(1) , Sc(2))
    
     T = T * 50                                                 'here we calculate the 1/10 precision like
     T = T - 25                                                 'DS18S20 data sheet
     T1 = Sc(8) - Sc(7)
     T1 = T1 * 100
     T1 = T1 / Sc(8)
     T = T + T1
     Decigrades = T / 10
    End Function

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2004
    Beiträge
    101
    Danke fürs Beispiel, das ist mir aber ehrlich gesagt zuviel, da ich noch nicht mal richtig durch meinen Code durchblicke.
    Dieses Ganze 1wirezeugs ist neu für mich, den Rest habe ich scho fertig(Menüsteuerung, DCF usw.) Mir fehlt nur noch die Temp auf 0.1° genau...

    PS
    Gibt es noch Alternativen zum DS18S20 (Preislich gesehen, weil ich mehre brauche...)

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    30.01.2007
    Beiträge
    17
    Hei

    mir sind keine anderen Senoren bekannt. Zmindest nicht Preislich. Ich habe bis jetzt immer die DS18S20 genommen. Mit der 0,1° nimm das nicht zu eng. Ich habe 8 Senosren am Bus und alle zum testen auf ein Stueck Metall geklebt. Alle 8 Sensoren schwanken ein wenig. Die max. differenz die ich zwischen 2 Sensoren hab sind 0,8° Damit ich zumindest von einem "Startpunkt" ausgehen kann hab ich das Mittel der Temperaturen genommen und alle Senoren durch addition oder subtraktion auf einen Wert gebracht. Aber die Sensoren sind sehr einfach zu nutzen deswegen probier ich auch nicht mit was neuem rum. Probier einfach mal meinen code aus und spiele damit herum.

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    43
    Beiträge
    379
    Hi Papsi,

    schau mal hier rein: http://www.roboternetz.de/phpBB2/viewtopic.php?t=35075

    Ich habe mich lange damit rumgeschlagen und jetzt läuft es gut! (1x DS1820 und DCF)

    für einen zweiten.... dritten Sensor musst Du dann nur noch folgendes einfügen und schau mal in diesen Trade:

    http://www.roboternetz.de/phpBB2/zei...ghlight=ds1820

    Wenns dann noch nicht klappt dann meld Dich einfach!

    Gruß MAT

Berechtigungen

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