Temperaturen messen mit dem 1Wire-Baustein DS18B20

Hier können Sie ihre eigenen Projekte vorstellen
Antworten
Heinrichs
Beiträge: 173
Registriert: Do 21. Okt 2010, 18:31

Temperaturen messen mit dem 1Wire-Baustein DS18B20

Beitrag von Heinrichs » 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.

ds18b20_auf_tiny_rtc.jpg
Tiny-RTC-Modul mit DS18B20-Temperatursensor
ds18b20_auf_tiny_rtc.jpg (17.54 KiB) 11672 mal betrachtet

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

Antworten