1wire Programmierung mit BASCOM

Jetzt will ich etwas näher auf die speziellen Kommandos des DS1820 eingehen. Das 044H Kommando veranlasst den DS1820 eine Temperaturmessung durch zu führen. Also zuerst messen lassen und dann die Messwerte auslesen. Wenn man mehrere DS1820 verwendet kann man natürlich das Messen an alle auf einmal übertragen. Das sieht dann so aus:

1wreset	 
1wwrite &HCC	' skip rom (an alle)
1wwrite &H44	' messen
Waitus 200	' dem DS1820 etwas Zeit zum Messen geben

Der DS1820 besitzt 9 Byte Speicher das SCRATCHPAD. Die ersten beiden Byte’s beinhalten die Temperatur mit 9 Bit Auflösung (8Bit vor dem Komma und 1 Bit dahinter) das ergibt einen Bereich von 127>=X>=-64 in Schritten von 0,5 benutzt wird der Bereich von 85°C>=X>=-10°C in SChritten von 0,5°C.
Byte 7 und 8 sind die Zähler ‚REMAIN‘ und ‚PER °C‘ die zur höheren Auflösung der Temperatur benutzt werden können. Das Byte 9 ist die Prüfsumme CRC. Das SCRATCHPAD kann wie folgt ausgelesen werden:

Dim Sc(9) As Byte
Sc(1) = 1wread(9)	' Es werden 9 Byte vom DS1820 in das Array geladen

Jetzt kann man noch prüfen ob die gelesenen Daten korrekt waren. Das geht mit:

If Sc(9) = Crc8(Sc(1) , 8) Then

Wie man jetzt die Temperatur ermittelt und Ausgibt sieht man am Besten an einem Beispiel. Ich habe ein myAVR Board mit einem LCD Display benutzt und an den Port C Pin 5 den DS1820 angeschlossen.

Beispiel einfache Temperaturmessung mit myAVR+LCD+DS1820

Download: 1wire-lcd-ds1820-1.zip

' Beispiel für das myAVR Board 1 & 2 mit LCD und 1wire Temperatursensor an Pin 5 von Port C
$regfile = "m8def.dat"
$crystal = 3686411
 
' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
Ddrd = &HFF
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
 
' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5
 
Dim Dsid(8) As Byte
' Die Adresse meines DS1820 die ich vorher ermittelt habe
Dsid(1)=&H10 :Dsid(2)=&H68 :Dsid(3)=&H17 :Dsid(4)=&H25 :Dsid(5)=&H01 :Dsid(6)=&H08 :Dsid(7)=&H00 :Dsid(8)=&H98
Dim Sc(9) As Byte
Dim T As Integer
Dim T1 As Integer
Dim I As Byte
 
Cls
Cursor Off
Locate 1 , 1 : Lcd "Mein Termometer"
 
Do
 ' Alle angeschlossenen DS1820 zum Messen veranlassen
 1wreset
 1wwrite &HCC
 1wwrite &H44
 Waitus 200
 ' Den gewünschten Sensor auswählen
 1wverify Dsid(1)
 ' Kommando READ SCRATCHPAD
 1wwrite &HBE
 Sc(1) = 1wread(9)
 If Sc(9) = Crc8(sc(1) , 8) Then
  T = Makeint(sc(1) , Sc(2))
  ' Die Nachkommastelle entfernen
  T = T / 2
  ' Temperatur in ganzen Grad Schritten ausgeben
  Locate 2 , 1
  Lcd T ; " Grad Celsius"
 Else
  ' Wenn Fehler Scratchpad zur Kontrolle Hexadezimal ausgeben
  Locate 2 , 1
  ' Es passen nur 8 Byte auf das Display
  For I = 1 To 8
   Lcd Hex(sc(i))
  Next
 End If
 ' Ausgabe alle 0,5 Sekunden
 Waitms 500
Loop
 
End

Beispiel genauere Temperaturmessung mit myAVR+LCD+DS1820

Download: 1wire-lcd-ds1820-2.zip