Code für BASCOM
Die Abfrage der DS18 .. wurde aus dem Beispiel von BASCOM übernommen
Alle Prüfsummen können auch entfernt werden.
'=======================================================================
===
'
' Auslesen von zwei DS18S20 oder DS18B20
'
'
http://www.mcselec.com/index.php?option=com_content&task=view&id=75&Itemid=57
'
' Anpassung von LCD
' V0.3 ohne Parameterübergabe, mit Wertrückgabe bei Funktionen
' Min- und Max-Ausgabe geändert
'
'=======================================================================
===
$regfile = "m8def.dat"
$crystal = 14318180 'Mini-Atmega
4-Platine (mit LCD)
Declare Function Dg_ds18s20() As Integer 'Umrechnung
in Grad
Declare Function Dg_ds18b20() As Integer 'Umrechnung
in Grad
Config 1wire = Portc.0 '1wire-Port
festlegen
Config Lcd = 16 * 2 'Lcd
Initialisieren
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,
Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Dim B As Byte , W As Word , Dg As Integer , Dg_s As Single , Tg As Byte
Dim Min1 As Single , Min2 As Single , Max1 As Single , Max2 As Single
Dim Dsid1(8) As Byte , Dsid2(8) As Byte 'Dallas ID
64 bits incl CRC
Dim T As Integer , T1 As Integer , Ts As Single
Dim Sc(9) As Byte 'Scratchpad
0-8 72 bits incl CRC, explanations for DS18b20
Cls : Lcd "DS1820 Thermometer"
Locate 2 , 1 : Lcd "* V0.3 *"
Wait 1 : Cls
W = 1wirecount() : Lcd "Sensoren:" ; W 'Anzahl der
Sensoren augeben
Wait 1 : Cls
Dsid1(1) = 1wsearchfirst() '1.
Device-ID suchen
Do
Dsid2(1) = 1wsearchnext() 'weitere
ID's suchen
Loop Until Err = 1
' First sensor identified and stored in variable
If Dsid1(8) = Crc8(dsid1(1) , 7) Then ' Control
that the received CRC match the calculated
Locate 1 , 1
Lcd "CRC OK Sensor 1 ID"
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid1(b))
Next
End If
Wait 1
' Second sensor
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
Locate 1 , 1
Lcd "CRC OK Sensor 2 ID"
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid2(b))
Next
End If
Wait 1 : Cls
'Min/Max vorbesetzen
Min1 = 999 : Min2 = 999
Max1 = -999 : Max2 = -999
'Hauptschleife
Do
Tg = 1 - Tg 'für
wechselnde Min-Max-Anzeige
1wreset ' reset the
bus
1wwrite &HCC ' skip rom
1wwrite &H44 ' Convert T
anstoßen
Waitms 750
'Wandlungszeit abwarten
1wverify Dsid1(1) 'Prüft das
"Match ROM"
If Err = 1 Then
Lcd "DsId2 not on bus " 'Err = 1
Fehler
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
If Dsid1(1) = 16 Then Dg = Dg_ds18s20() '=10h
If Dsid1(1) = 40 Then Dg = Dg_ds18b20() '=28h
Dg_s = Dg / 10 'In
Dezimalgrad umwandeln
If Min1 > Dg_s Then Min1 = Dg_s
If Max1 < Dg_s Then Max1 = Dg_s
Locate 1 , 1 : Lcd "Tmp" ; Fusing(dg_s , "#.#")
If Tg = 1 Then : Locate 1 , 9 : Lcd "Min" ; Fusing(min1 ,
"#.#") : End If
If Tg = 0 Then : Locate 1 , 9 : Lcd "Max" ; Fusing(max1 ,
"#.#") : End If
End If
End If
1wverify Dsid2(1)
If Err = 1 Then
Lcd "DsId2 not on bus "
Elseif Err = 0 Then ' lcd "
Sensor found "
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
If Dsid2(1) = 16 Then Dg = Dg_ds18s20() '=10h
If Dsid2(1) = 40 Then Dg = Dg_ds18b20() '=28h
Dg_s = Dg / 10 'In
Dezimalgrad umwandeln
If Min2 > Dg_s Then Min2 = Dg_s
If Max2 < Dg_s Then Max2 = Dg_s
Locate 2 , 1 : Lcd "Tmp" ; Fusing(dg_s , "#.#")
If Tg = 1 Then : Locate 2 , 9 : Lcd "Min" ; Fusing(min2 , "#.#")
: End If
If Tg = 0 Then : Locate 2 , 9 : Lcd "Max" ; Fusing(max2 , "#.#")
: End If
End If
End If
Waitms 200
'Gesamtwartezeit ca.1s
Loop
End 'end program
'=======================================================================
========
Function Dg_ds18s20() 'keine
Parameter notwendig!
' Tmp = Sc(1) And 1 ' für 0.1C
precision das 0,5°-Bit löschen
' If Tmp = 1 Then Decr Sc(1)
Sc(1) = Sc(1) And &B11111110 ' alternativ
0,5°-Bit löschen
T = Makeint(sc(1) , Sc(2)) 'in 1/2°
T = T * 50 'in 1/100°
T = T - 25 'DS18S20
data sheet
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1 'Temperatur
in 1/100°
Dg_ds18s20 = T / 10 'Ergebnis in
1/10°
End Function
'=======================================================================
========
Function Dg_ds18b20() 'mit
Fehlerkorrektur
T = Makeint(sc(1) , Sc(2)) 'in 1/16°
Ts = T 'in Single
umwandeln
Ts = Ts * 6.25 'in 1/100°
umrechnen
T = Ts 'in 1/100°
als Integer merken
'in Integer
Dg_ds18b20 = T / 10 'Ergebnis in
1/10°
End Function