Temperaturen messen mit dem 1Wire-Baustein DS18B20
Verfasst: Fr 1. Feb 2013, 13:45
Auf dem Tiny-RTC-Mdul (vgl. https://www.forum.g-heinrichs.de/viewto ... ?f=12&t=68) kann man optional einen 1Wire-Temperatursensor einbauen; in der folgenden Abbildung ist er in der rechten unteren Ecke zu sehen. Ich habe hier den Baustein DS18B20 gewählt. Über die Ansteuerung solcher Geräte findet man Grundlagen-Informationen unter https://de.wikipedia.org/wiki/1-Wire.
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.
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