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 |