Temperatursensor DS18S20 Bascom
Hi Leute,
ich mцchte gerne einen/mehrere Temperatursensoren vom Typ DS18S20 mit einem Atmega8 betreiben und mir die ausgegeben Temperatur auf einem LCD Display darstellen lassen.
Jetzt zu meinem Problem: egal welchen Code ich dafьr ausprobiert habe ich bin immer dabei gelandet, dass ich eine Fehlermeldung des Sensors erhalten habe. Hier mal ein Beispiel-Code aus einem Buch zu Bascom (Kьhnel):
$regfile = "m8def.dat"
$crystal = 1000000
$baud = 9600
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db7 = Portd.7 , Db6 = Portc.3 , Db5 = Portd.6 , Db4 = Portc.2 , E = Portc.1 , Rs = Portd.2
Initlcd
Config 1wire = Portb.0
Const Ds18s20 = &H10
Const Skiprom = &HCC 'Ьberspringe Rom Kommandos
Const Read_rom = &H33 'lese Rom
Const Convertt = &H44 'Start Temperaturmessung
Const Read_ram = &HBE 'Lese Scratchpad Ram
Const Write_ram = &H4E 'Schreibe Scratchpad RAM
Const Copy_ram = &H48 'Kopiere Scratchpad RAM
Const Recall_ee = &HB8 'Kopiere EEPROM nach RAM
Const Read_power = &HB4 'Abfrage Spannung
Dim Family_code As Byte
Dim Serial_number(6) As Byte 'Sensor Seriennummer
Dim Crc As Byte 'DS18S20 Crc
Dim Scratch(9) As Byte 'Scratchpad RAM Kopie
Dim I As Byte
Dim Temp As Word
Dim Temp1 As Integer
Dim Stemp As Single
Do
1wreset
If Err = 1 Then Lcd "Sensor Fehler"
Wait 1
Cls
1wwrite Read_rom 'Lese ROM Kommando
Family_code = 1wread() 'Auslesen ROM Inhalt
Lcd Family_code
Wait 5
Cls
For I = 1 To 6
Serial_number(i) = 1wread()
Next
Crc = 1wread()
If Family_code <> Ds18s20 Then Exit Do
1wwrite Convertt 'starte Temperaturmessung
Wait 2 'warte Temperaturmessung ab
Do
Temp = 1wread()
Loop Until Temp = &HFF 'warte bis Temperaturmessung beendet ist
1wreset
If Err = 1 Then Lcd "Sensor Fehler"
Wait 1
Cls
1wwrite Skiprom
1wwrite Read_ram
For I = 1 To 9
Scratch(i) = 1wread()
Next
Temp = Scratch(2)
Shift Temp , Left , 8
Temp = Temp + Scratch(i) 'Word Format
Temp1 = Temp 'Integer Format
Lcd "T=" ; Temp ; "Counts."
Wait 1
Cls
Temp1 = Temp1 / 2
Lcd "T=" ; Temp1 ; "Grad Celsius"
Wait 1
Cls
Stemp = Scratch(8) - Scratch(7) 'Interpolation
Stemp = Stemp / Scratch(8)
Stemp = Stemp + Temp1
Stemp = Stemp - 0.25
Lcd "exakte T="
Wait 1
Cls
Lcd Fusing(stemp , "#.##")
Wait 1
Cls
Lcd "Grad Celsius"
Wait 2
Cls
Loop
Lcd "Kein Temperatursensor"
Wait 1
Cls
End
Der Family Code sollte H10 also 16 betragen aber ausgegeben wird mir 256. Dieses Programm ist eigentlich fьr einen DS1820 geschrieben worden, liegt hier vielleicht das Problem? Im Datenblatt des DS18S20 (http://pdfserv.maximintegrated.com/en/ds/DS18S20.pdf) finde ich auch gar keinen Family Code...
Bei anderen getesteten Programmen (siehe http://www.avr-praxis.de/forum/showt...hp?108-Ds18s20 , http://bascom-forum.de/showthread.ph...ng-mit-DS18S20 , http://mikrocontroller.jacob-pirna.d..._ds1820_2.html) kam teilweise auch einfach der Standard Wert von 127° heraus.
Ich habe den Sensor genau wie im Datenblatt beschrieben angeschlossen, 1 auf GND , 2 mit 4,7k Vorwiderstand auf Vcc und 3 auf Vcc. 2 hab ich dann mit meinem Anschluss B0 am Atmega8 verbunden. D.h. ich hab den Sensor mit einer externen Spannung versorgt und ihn nicht parasitдr betrieben.
Ich habe auch bereits verschiedene DS18S20 Sensoren getestet, die waren alle neu aber bei allen kam die gleiche Fehlermeldung (Zahl) heraus.
Kann mir jemand weiterhelfen und erklдren wo hier das Problem liegt?
Schonmal Danke im vorraus! :)
Liste der Anhдnge anzeigen (Anzahl: 1)
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Lcd = 16 * 2 ' LCD
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0 'LCD PINs
Config Portd.0 = Input ' Menu Key
Config Portd.1 = Input 'UP Keu
Config Portd.5 = Input 'Down Key
Config Portd.2 = Input 'Int on press ANY Key
Config Portd.6 = Output ' Driver
On Int0 Menu
Enable Interrupts
Enable Int0
Config 1wire = Portc.5 ' Configuration of 1wire bus
' *** Заводим переменные
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Sign As String * 1
Dim T As Byte
Dim T1 As Byte
Dim T2 As Byte
Dim M As Byte 'Menu Counter
Dim Tempon As Byte ' TempON-Switch ONN
Dim Tempoff As Byte 'TempOFF SwitchOFF
Dim Tempon1 As Eram Byte
Dim Tempoff1 As Eram Byte
Dim P As Byte ' Key Delay Time
Dim W As Byte ' Exit Time
P = 200 ' Key Delay
W = 100
Tempon = Tempon1
Tempoff = Tempoff1
Cls
Cursor Off
'***ОСНОВНАЯ ПРОГРАММА
Do
' начало цикла
1wreset
If Err = 1 Then 'если при опросе небыло ответа ставим флаг ошибки
Cls
Lcd " Eror " ' выводим надпись об отсутствии датчика
Locate 2 , 1
Lcd "Sensor not found."
Wait 1
Else ' иначе, если ошибки не было, продолжаем опрос датчика
1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения
Waitms 750 ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE ' Команда чтения ОЗУ датчика
Byte0 = 1wread() ' Читаем нулевой байт
Byte1 = 1wread() ' Читаем первый байт
If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Sign = "-"
Else
Sign = "+"
End If
T1 = Byte0 / 16 ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16 ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2 ' Формируем результат для вывода на дисплей
' *** Коррекция полученных значений
If Sign = "-" Then ' для корректного вывода отрицательных температур
T1 = T1 + 1
End If
If Sign = "+" And T1 = 0 Then ' убираем знак "+" с нулевой температуры
Sign = " "
End If
' *** Выводим результат на дисплей
Rem Температура
Lcd " Temperature" ' тут пишем что измеряем
Locate 2 , 6
Lcd Sign ; T1 ; ' выводим знак и температуру на дисплей
Locate 2 , 9
Lcd Chr(223) ; "C" ' Сhr(223) - символ "градус"
Cursor Off
End If
If T1 => Tempon Then
Portd.6 = 1
End If
If T1 < Tempoff Then
Portd.6 = 0
End If
If Portd.6 = 0 Then
Locate 2 , 13
Lcd "OFF"
Else
Locate 2 , 13
Lcd "ON"
End If
Waitms 750
Loop ' повторяем цикл
End
Menu:
Cls
Do
W = W - 1
If Pind.0 = 0 Then 'Menu Key
M = M + 1
Waitms P
End If
If M = 1 Then 'Tempon menu keys
Locate 1 , 1
Lcd "TempON > "
Locate 2 , 1
Lcd "TempOff "
If Pind.1 = 0 And M = 1 Then 'Tempon +
Tempon = Tempon + 1
Waitms P
End If
If Pind.5 = 0 And M = 1 Then 'Tempon -
Tempon = Tempon - 1
Waitms P
End If
Locate 1 , 12
Lcd Tempon
Locate 2 , 12
Lcd Tempoff
End If
If M = 2 Then 'Tempoff menu keys
Locate 1 , 1
Lcd "TempON "
Locate 2 , 1
Lcd "TempOff >"
If Pind.1 = 0 And M = 2 Then
Tempoff = Tempoff + 1 'Tempoff +
Waitms P
End If
If Pind.5 = 0 And M = 2 Then 'Tempoff -
Tempoff = Tempoff - 1
Waitms P
End If
Locate 1 , 12
Lcd Tempon
Locate 2 , 12
Lcd Tempoff
End If
If M = 3 Then
M = 1
End If
If Pind.2 = 0 Then
W = 100
P = P - 3
If P < 50 Then
P = 30
End If
Else
P = 200
End If
If Tempoff > Tempon Then
Tempoff = Tempon
End If
Loop Until W = 0
M = 0
Tempon1 = Tempon
Tempoff1 = Tempoff
Return
End
Hier ist meine code zum vergleichen.
funktioniert 100%
- - - Aktualisiert - - -
schaltplanAnhang 26901