PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sensor Kontrolle DS18s20



!*sascha*!
19.02.2009, 08:31
Hallo,

wie so oft geht es um den DS18s20!

Ich baue eine Temperaturüberwachung und werde 3-5 Sensoren an eminen Atmega betreiben!

Mit der Abfrage klappt alles! ** Fast **

Wenn ich zum testen 3 Sensoren anschließe bekomme ich die richtigen Daten!

T1 = 20,5 / T2=20,0 / T3=21 === Alles io
Nur wenn ich jetzt einen Sensor wegnehme(T3)! Weil er z.B. defekt ist oder kabel getrennt wird passiert es.

Statt z.B. Sensor 3 (T3) seinen wert behält oder 0 steht bekommt er den Wert von Sensor 2 es Antwortet dann einer!

Das darf nicht sein! (Bei bestimmten Temperaturen wird ein Alerm ausgelöst! schlecht wenn das bei 24° passieren soll und er die Temp. von dem Aussenfühler bekommt im Winter)

Ich habe schon mehrere Quelltext ausprobiert nur mit allen tritt dieses Problem auf!

Habe auch die Adressen mal Manuel in ein Array eingetragen oder mit „ Id1(1) = 1wsearchfirst() “
Bei allen Methoden das gleiche Problem.

Das Programm schreibe ich in Bascom!

Mfg
Sascha

linux_80
19.02.2009, 11:13
Hallo,

kannst Du etwas mehr von deinem Programm zeigen.
Interessant ist was nach dem Adressieren eines Sensors passiert, denn es muss erkannt werden, ob sich da auch einer drauf gemeldet hat.

!*sascha*!
19.02.2009, 12:15
Das ist ein Code den ich getestet habe... Aber vom Aufbau ist es der gleich wie der den ich geschrieben habe. Berehnung ist anders.



$regfile = "m32def.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 = Portc.5

Dim T As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim T3 As Integer
Dim T4 As String * 10
Dim T5 As String * 10
Dim T6 As Single
Dim T7 As Single
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(9) As Byte
Dim Ar2(9) As Byte
Dim I As Byte , Tmp As Byte , Tmp2 As Byte

Dim 1t As Integer
Dim 1t1 As Integer
Dim 1t2 As Integer
Dim 1t3 As Integer
Dim 1t4 As String * 10
Dim 1t5 As String * 10
Dim 1t6 As Single
Dim 1t7 As Single
Dim Id3(8) As Byte
Dim Id4(8) As Byte
Dim 1ar1(9) As Byte
Dim 1ar2(9) As Byte
Dim 1i As Byte , 1tmp As Byte , 1tmp2 As Byte

Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()
Id3(1) = 1wsearchnext()
Id4(1) = 1wsearchnext()

Print "Print Id1(1)"
Print ""
Print Id1(1)
Print Id1(2)
Print Id1(3)
Print Id1(4)
Print Id1(5)
Print Id1(6)
Print Id1(7)
Print Id1(8)
Print ""



Do
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &H44

Waitms 300
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &HBE
Ar1(1) = 1wread(9)

If Ar1(9) = Crc8(ar1(1) , 8) Then

Print "CRC i.o"

Else

Print "CRC Error"


End If

Print ""

1wreset
Tmp = Ar1(1) And 1
If Tmp = 1 Then Decr Ar1(1)
T = Makeint(ar1(1) , Ar1(2))
T = T * 50
T = T - 25
T1 = Ar1(8) - Ar1(7)
T1 = T1 * 100
T1 = T1 / Ar1(8)
T = T + T1
T = T / 10
T6 = T / 10
T4 = Fusing(t6 , "#.#")

Waitms 500
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &H44

Waitms 300
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &HBE
Ar2(1) = 1wread(9)
1wreset
Tmp2 = Ar2(1) And 1
If Tmp2 = 1 Then Decr Ar2(1)
T2 = Makeint(ar2(1) , Ar2(2))
T2 = T2 * 50
T2 = T2 - 25
T3 = Ar2(8) - Ar2(7)
T3 = T3 * 100
T3 = T3 / Ar2(8)
T2 = T2 + T3
T2 = T2 / 10
T7 = T2 / 10
T5 = Fusing(t7 , "#.#")



1wreset
1wwrite &H55
1wwrite Id3(1) , 8
1wwrite &H44

Waitms 300
1wreset
1wwrite &H55
1wwrite Id3(1) , 8
1wwrite &HBE
1ar1(1) = 1wread(9)
1wreset
1tmp = 1ar1(1) And 1
If 1tmp = 1 Then Decr 1ar1(1)
1t = Makeint(1ar1(1) , 1ar1(2))
1t = 1t * 50
1t = 1t - 25
1t1 = 1ar1(8) - 1ar1(7)
1t1 = 1t1 * 100
1t1 = 1t1 / 1ar1(8)
1t = 1t + 1t1
1t = 1t / 10
1t6 = 1t / 10
1t4 = Fusing(1t6 , "#.#")

Waitms 500
1wreset
1wwrite &H55
1wwrite Id4(1) , 8
1wwrite &H44

Waitms 300
1wreset
1wwrite &H55
1wwrite Id4(1) , 8
1wwrite &HBE
1ar2(1) = 1wread(9)
1wreset
1tmp2 = 1ar2(1) And 1
If 1tmp2 = 1 Then Decr 1ar2(1)
1t2 = Makeint(1ar2(1) , 1ar2(2))
1t2 = 1t2 * 50
1t2 = 1t2 - 25
1t3 = 1ar2(8) - 1ar2(7)
1t3 = 1t3 * 100
1t3 = 1t3 / 1ar2(8)
1t2 = 1t2 + 1t3
1t2 = 1t2 / 10
1t7 = 1t2 / 10
1t5 = Fusing(1t7 , "#.#")

Locate 1 , 1 : Lcd "T1:" ; T4
Locate 1 , 10 : Lcd "T2:" ; T5
Locate 2 , 1 : Lcd "T3:" ; 1t4
Locate 2 , 10 : Lcd "T4:" ; 1t5

Waitms 500

Loop
End

Ich habe wegen der CRC prüfung geguckt aber das ist ja nur zur kontrolle ob die Daten richtig übertragen wurden. So verstehe ich es.

Ich müssen iwie gucken von welchen Sensor die Daten gekommen sind.

Muss auch sagen das ich noch sehr neu auf dem Gebiet bin! Aber gbe mir größte mühne auch alle zu verstehen was auf dem 1WireBuss passiert.

Mfg
Sascha

linux_80
19.02.2009, 13:04
Schon mal im Wiki geschaut bei https://www.roboternetz.de/wissen/index.php/Bascom_und_1-Wire ?

Hier ist beschrieben, wie man Sicher an alle IDs kommt.
Man kann auch gleich prüfen, ob es sich um den richtigen Sensor handelt.
Mit Err überprüfen, ob sich überhaupt ein Sensor auf ein 1wsearch... gemeldet hat.


Ich habe wegen der CRC prüfung geguckt aber das ist ja nur zur kontrolle ob die Daten richtig übertragen wurden. So verstehe ich es.

Ich müssen iwie gucken von welchen Sensor die Daten gekommen sind.

CRC sollte man immer verwenden, vor allem wenn irgendwo in der Aufgabe das Wort "Alarm" vorkommt, wie sollte man denn sonst erkennen, ob zB. ein 2. Sensor gerade dazwischengefunkt hat, und statt +24, -17 o.ä. rauskommt !?

!*sascha*!
21.02.2009, 13:05
vielen Dank!


1wverify Ar(1) ' Gerät mit der SerienNr. aus Ar() auswählen
' Gerät vorhanden
If Err = 0 Then



1wverify habe ich schonmal benutzt, nur kannte die Err Variable nicht...

Also es geht :-)