Einige im Internet kursierende Programme lieferten keine korrekten Temperaturwerte. Genauere Informationen zu dem Baustein DS18B20 entnehme man also lieber dem Manual des Herstellers. Die entscheidenden Informationen zur Temperaturcodierung im 12-Bit-Modus (Standardeinstellung) findet man hier auf S. 4.
Im folgenden Minimal-Programm wird die Temperatur über das Terminal als Text ausgegeben (Dezimalzahl mit maximal 4 Stellen nach dem Komma). Es wird davon ausgegeangen, dass kein weiterer 1Wire-Baustein angeschlossen ist.
Code: Alles auswählen
' Datei für Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Temperaturmessung mit dem DS18B20 (auf der RTC-Platine)
' Masse und Vcc anschließen; DS an PortB.0
' Ausgabe der Temperatur (über Terminal) als Text (Dezimalzahl mit
' max. 4 Nachkommastellen)
'----------------------------------------------------------------------------
$regfile = "attiny2313.dat" 'Attiny2313
$crystal = 4000000 '4 MHz
$baud = 9600
'**********************************************************
'******************* Deklarationen ************************
Dim Sp(9) As Byte
Dim Vorzeichen As Byte
Dim Temp0 As Word
Dim Temp1 As Byte
Dim Temperatur As Single
Dim Minussechzehn As Integer
'****************** Initialisierung ***********************
Ddrb = &B11111111 'Port B als Ausgangsport
Ddrd = &B01110000 'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111 'Eingänge auf high legen
Config 1wire = Portb.0
Minussechzehn = -16
Wait 1 'u. A. zum Aufladen des Kondensators bei Ta0
'**********************************************************
'******************** Hauptprogramm ***********************
' Minimalprogramm für Temperaturmessung (keine weiteren 1-Wire-Bausteine angeschlossenen)
Do
1wreset ' Initialisierung
1wwrite &HCC ' überspringe ROM-Befehl
1wwrite &H44 ' Temperaturmessung anstoßen
Wait 1 ' warten bis Messung fertig
1wreset ' Initialisierung
1wwrite &HCC ' überspringe ROM-Befehl
1wwrite &HBE ' Temperatur auslesen
Sp(1) = 1wread(9) ' alle Daten in ein Array lesen
'zum Test: 1111 1110 0110 1111 entspricht -25.0625°C
'Sp(2) = &B11111110
'Sp(1) = &B01101111
Vorzeichen = Sp(2) And &B10000000
If Vorzeichen = 0 Then 'Temperatur nicht negativ
Temp0 = Sp(2) * 256 'Highbyte in Sp(2)
Temp0 = Temp0 + Sp(1) 'Lowbyte in Sp(1); Ergebnis: Temperatur mal 16
Temperatur = Temp0 / 16
Else
'Zweierkomplement bilden
Temp1 = Not Sp(2)
Temp0 = Temp1 * 256
Temp1 = Not Sp(1)
Temp1 = Temp1 + 1
Temp0 = Temp0 + Temp1
Temperatur = Temp0 / Minussechzehn
End If
Print Temperatur
Wait 3
Loop