PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom Beispielprogramm für DS1820 Temperatursensor und RN-AVR Universal



Frank
21.01.2013, 21:08
Das Beispielprogramm dürfte sich selbst erklären. Es demonstriert wie man den beliebten Temperatursensor DS18S20 anspricht. Wahlweise einen oder mehrere an einem beliebigen Port!



'################################################# #############
'BeispielDS18S20.bas
'
'Ein Programm für die Universalplatine RN-AVR UNIVERSAL
'
'Das Programm zeigt wie man den 3 poligen Temperatursensor
'DS18S20 ausliest. Nach dem Aufruf wird die Temperatur alle 5 Sekunden
'ausgegen. Es können auch mehrere Sensoren auf einer Leitung
'angesprochen werden.
'
' (c) 2013 Frank
'Bezug für Board und Sensor und DVD: www.robotikhardware.de (http://www.robotikhardware.de)
'Weitere Beispiele auf der Robotikhardware DVD oder
'im www.Roboternetz.de (http://www.Roboternetz.de) und rn-wissen.de
'################################################# #####################
'Portbelegung bzw. Modulverbindung
'PD3 Sensor Daten DS18S20 (nicht vergessen ein 4,7k Widerstand von PD3 nach +3,3V)
'GND Sensor GND
'3V Sensor 3V

Declare Sub Ds1820_seriennummer()
Declare Sub Ds1820_alleseriennummern()
Declare Sub Ds1820_temperatur_ausgeben()
Declare Sub Ds1820_sensor_temperatur()

$programmer = 12 'MCS USB (Zeile weglassen wenn anderer Programmer)
$prog &HFF , &HFF , &HD9 , &HFE 'Fusebits richtig programmieren (Quarz ein,Jtag aus)
$regfile = "m644pdef.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 8000000 'QuarzFrequenzuenz
$baud = 9600
Baud = 9600

Config Pind.6 = Output 'LED
Led1 Alias Portd.6
Led1 = 0 'ein
Config 1wire = Portd.3
Dim Sensordaten(9) As Byte
Dim Sensornummer(8) As Byte

Wait 2
Print "Beispielprogramm fuer RN-Avr Universal um Temperatur mit DS18S20 auszulesen"
Print "Serienummer notieren!"
Print "Einzelabruf:"
Ds1820_seriennummer
Print
Print "Falls es mehrere gibt, gleich alle abrufen::"
Ds1820_alleseriennummern
Print
Print "Temperatur ausgeben:"
Do
' Ds1820_temperatur_ausgeben 'Diese Funktion wenn nur ein Sensor am Bus
Ds1820_sensor_temperatur 'Diese Funktion wenn man mehrere an gleicher
'Leitung hat und einen davon ansprechen möchte
Wait 5
Loop


' ************ Hilfsfunktionen zur Kommunikation mit dem temperatursensor DS18S20 (c) Robotikhardware.de *********
' (nähere Infos im Datenblatt des Sensors auf der www.Robotikhardeware.de (http://www.Robotikhardeware.de) DVD)
' Hilfreich auch der RN-Wissen Artikel unter http://www.rn-wissen.de/index.php/Bascom_und_1-Wire
' ************ ************** ************ ************** ************ ************** ************ **********

'Gibt die Seriennummer über RS232 aus
'diese ist in jedem Sensor eindeutig vorhanden
'sie wird nur benötigt wenn mehrere Sensoren an einer Leitung hängen
Sub Ds1820_seriennummer()
Local I As Integer
Local Crc As Byte
1wreset
1wwrite &H33 ' ROM-Befehl zum lesen der SerienNr
Sensornummer(1) = 1wread(8) ' 8 Bytes lesen
Crc = Crc8(sensornummer(1) , 7)
If Crc <> Sensornummer(8) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
For I = 1 To 8
Print Hex(sensornummer(i)); ' Ausgeben
Print " ";
Next
Print
End Sub

'Gibt die Seriennummer aller Sensoren an einem Bus über RS232 aus
Sub Ds1820_alleseriennummern()
Local Crc As Byte
Local I As Integer
Local Anzahl As Integer
Sensornummer(1) = 1wsearchfirst()
If Err = 0 Then 'Wenn err, dann gibt es keinen Sensor
Do
Crc = Crc8(sensornummer(1) , 7)
If Crc <> Sensornummer(8) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
For I = 1 To 8
Print Hex(sensornummer(i));
Print " ";
Next
Print
Sensornummer(1) = 1wsearchnext() 'nächste suchen
Loop Until Err = 1
End If
Print
Anzahl == 1wirecount() 'Anzahl der Sensoren
Print "Anzahl der Sensoren am Bus: " ; Anzahl
End Sub

'Diese Funktion gibt Temperaturbereich +85 bis -55 mit Vorzeichen auf ein halbes Grad genau aus
'Diese Funktion ist nur geeignet, wenn nur ein Sensor am Bus liegt
'Auf Fließkommazahlen wird verzichtet
Sub Ds1820_temperatur_ausgeben()
Local Temp As Integer
Local S As String * 5
Local Crc As Byte
1wreset ' Initialisierung
1wwrite &HCC ' SKIP ROM
1wwrite &H44 ' CONVERT T / Temperaturmessung starten
Waitms 500 ' warten
1wreset ' Initialisierung
1wwrite &HCC ' SKIP ROM
1wwrite &HBE ' READ SCRATCHPAD
Sensordaten(1) = 1wread(9) ' Daten lesen
Temp = Sensordaten(1)
If Sensordaten(2) > 0 Then 'Minus Temperatur
Temp = 256 - Temp
Temp = Temp * 10
Temp = Temp / 2
Temp = 0 - Temp 'Vorzeichen -
Else
Temp = Temp * 10
Temp = Temp / 2
End If
S = Str(temp)
Print
Print Format(s , "0.0") ; " Grad C"
Crc = Crc8(sensordaten(1) , 8)
If Crc <> Sensordaten(9) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
End Sub

'Diese Funktion macht das gleiche wie die Funktion Ds1820_temperatur_ausgeben
'Jedoch wird hier gezielt ein bestimmter Sensor angesprochen, es können also
'mehrere an der gleichen Leitung hängen
'Die Seriennummer des anzusprechenden Sensors muss vor dem Aufruf
'in das Array Sensornummer eingetragen werden
Sub Ds1820_sensor_temperatur()
Local Temp As Integer
Local S As String * 5
Local Crc As Byte
1wverify Sensornummer(1) 'Seriennummer muss in Array Sensornummer stehen
If Err = 0 Then
1wwrite &H44
Waitms 500 'warten
1wverify Sensornummer(1) 'Gerät auswählen
1wwrite &HBE 'Temperatur lesen
Sensordaten(1) = 1wread(9) 'Daten lesen
Else
Print "Diesen Sensor nicht gefunden!"
End If
Temp = Sensordaten(1)
If Sensordaten(2) > 0 Then 'Minus Temperatur
Temp = 256 - Temp
Temp = Temp * 10
Temp = Temp / 2
Temp = 0 - Temp 'Vorzeichen -
Else
Temp = Temp * 10
Temp = Temp / 2
End If
S = Str(temp)
Print
Print Format(s , "0.0") ; " Grad C"
Crc = Crc8(sensordaten(1) , 8)
If Crc <> Sensordaten(9) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
End Sub




http://www.shop.robotikhardware.de/shop/catalog/images/artikelbilder/ds1820/sensor.jpg

oderlachs
29.05.2014, 13:18
Bekomme nur alles FF als ID und CRC Fehler

Unregistriert
15.03.2015, 22:24
Hallo,

ich bekomme bei meinem DS1820 folgendes Ergebnis ausgelesen:
Einlesen: 1 - 123
Einlesen: 2 - 1
Einlesen: 3 - 75
Einlesen: 4 - 70
Einlesen: 5 - 12
Einlesen: 6 - 255
Einlesen: 7 - 5
Einlesen: 8 - 16
Einlesen: 9 - 29
Die Zimmertemperatur beträgt etwar 22,5C.
Wenn ich das Programm nun nutze um die Temperatur in Bascom auszurechnen, teile ich

++Temp = 256 - Temp
Temp = 256 - 123 (=133)
++ Temp = Temp * 10
++Temp = 0 - Temp

So kann ich doch niemals auf die 22,5C kommen!

Ich habe schon einen zweiten Sensor angeschlossen. Auch er zweigt mit diese Werte

avr_racer
16.03.2015, 18:48
sicher das du die werte bekommst???

Welchen Sensor hast du denn dran den DS18S20 (Wert/2) oder den DS18B20 (Wert/16)


++Temp = 256 - Temp
Temp = 256 - 123 (=133)
++ Temp = Temp * 10
++Temp = 0 - Temp

Dies wird nur bei negativen Temps angewendet, abhängig vom TEMP_MSB = 0 positive Temps / 1 = negative Temps

und das steht sogar als Kommentar dahinter.

Der Wert für 22,5°C ist 45dez = 2D hex

heinzi
12.02.2017, 15:05
Hallo Frank!

Siehst du eine Möglichkeit, wie das vom Tempsensor gewünschte Timing auch mit nur 1MHz unter BASCOM eingehalten werden kann?
8MHz geht problemlos aber bei 1MHz kommen die von "oderlachs" erwähnten CRC Fehler und falsche ID zusammen.

Frank
13.02.2017, 10:19
Also eigentlich bin ich von aus gegangen das dies auch mit 1 Mhz noch klappt, habe es aber damals nur mit 8 Mhz getestet. Dazu kann ich dir leider heute nichts mehr sagen, liegt schon einige Jahre zurück, heute nutze ich meist eine Arduino Lib zur Abfrage.