'****************** Test-Platine ************************ '* ist ein Testmodul für Digital Temperatur-Sensoren * '* [DS18x20] DS18S20 ist ein 9 Bit Family Adr &H10 * '* und DSB20 ein 12 Bit Family Adr &H28 * '* somit große Unterschiede bei der "Empfindlichkeit" * '* Das lesen der Bit's ist somit auch Unterschiedlich. * '******************************************************** $regfile "m32def.dat" $crystal = 16000000 $hwstack = 32 $swstack = 32 $framesize = 40 $baud = 19200 '### LCD Verbindungen mit Controller### Lcd_db4 Alias Portd.5 Lcd_db5 Alias Portd.4 Lcd_db6 Alias Portd.3 Lcd_db7 Alias Portd.2 Lcd_e Alias Portd.6 Lcd_rs Alias Portd.7 Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs Config Lcd = 16 * 2 'dies ist die Kennung für Lib Lcdpin Cursor Off Noblink 'Aus und nicht blinken Lcdinit Waitms 100 'für Test die am Port B.0 angeschlossenen Temperatursensoren Declare Sub Ds1820_alleseriennummern() 'Temperatursensor Anschluß an Portpin B.0 Dim 1wtemp_adresse_1(8) As Byte ' Adresse des Temperatursensors 1 Dim 1wtemp_adresse_2(8) As Byte ' Adresse des Temperatursensors 2 Dim Temp_bytes(9) As Byte Dim Tempdif As Integer Dim Tempdif1 As Integer 'Variable zur Temp. Berechnung DeziGrad Dim Temp1 As Single Dim Temp2 As Single 'Format für Single zwei Nachkommastellen Config Single = Scientific , Digits = 1 'wenn die 2 benötigt im Empf. + Zentrale anpassen. 'Temperatursensoren DS 18S20 an PortB.0 (Bascom Unterprogramm einbinden) Config 1wire = Portb.0 'Temperatursensor 1und2 Portb.0 = 1 'Port auf H schalten '------Temperatursensor erkennen------- 'testet die am Portpin B.0 angeschlossenen Temperatursensoren Call Ds1820_alleseriennummern() 1wtemp_adresse_1(1) = 1wsearchfirst() 'ist der erste gefundene Sensor 1wtemp_adresse_2(1) = 1wsearchnext() 'suche nächsten '1wtemp_adresse_3(1) = 1wsearchnext() 'wenn noch mehr erweitern Cls Do 'Temperatursensoren Daten einlesen Gosub Temperaturmessung Print " Temp1 " ; Temp1 Print " Temp2 " ; Temp2 'nun was anzeigen Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte Lcd " Temp1 " ; Temp1 Locate 2 , 1 'Cursor auf 2 Zeile, 1 Spalte Lcd " Temp2 " ; Temp2 Loop End Temperaturmessung: ' bei allen Sensoren den Messvorgang starten 1wreset 1wwrite &HCC ' SKIP ROM, alle Sensoren ansprechen 1wwrite &H44 ' CONVERT T, Temperatur messen 'Zeit zum Messen geben Waitms 50 '===== erster Temp.-Sensor ist ein S Typ===== 1wreset 1wverify 1wtemp_adresse_1(1) 1wwrite &HBE ' Read Scratchpad, Temperatur auslesen 'Zeit zum Messen geben Waitms 100 Temp_bytes(1) = 1wread(8) Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen Tempdif = Tempdif * 50 Tempdif = Tempdif - 25.6 Tempdif1 = Temp_bytes(8) - Temp_bytes(7) Tempdif1 = Tempdif1 * 100 Tempdif1 = Tempdif1 / Temp_bytes(8) Tempdif = Tempdif + Tempdif1 Temp1 = Tempdif / 100 '( '===== zweiter Temp.-Sensor wenn auch ein S Typ ===== ' Anfrage senden 1wreset 1wverify 1wtemp_adresse_2(1) 1wwrite &HBE ' Read Scratchpad, Temperatur auslesen Temp_bytes(1) = 1wread(8) Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen. Tempdif = Tempdif * 50 Tempdif = Tempdif - 25.6 Tempdif1 = Temp_bytes(8) - Temp_bytes(7) Tempdif1 = Tempdif1 * 100 Tempdif1 = Tempdif1 / Temp_bytes(8) Tempdif = Tempdif + Tempdif1 Temp2 = Tempdif / 100 'Zeit zum Messen geben Waitms 10 ') '===== erster Temp.-Sensor wenn es ein B Typ ist ===== ' Anfrage senden 1wreset 1wverify 1wtemp_adresse_2(1) 1wwrite &HBE ' Read Scratchpad, Temperatur auslesen 'Zeit zum Messen geben Waitms 100 Temp_bytes(1) = 1wread(8) Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen. Tempdif = Tempdif / 8 'hier der Unterschied Tempdif = Tempdif * 50 Tempdif = Tempdif - 25.5 Tempdif1 = Temp_bytes(8) - Temp_bytes(7) Tempdif1 = Tempdif1 * 100 Tempdif1 = Tempdif1 / Temp_bytes(8) Tempdif = Tempdif + Tempdif1 Temp2 = Tempdif / 100 Return '------------------------------------------------------------------------------- '############# nach Neustart Temperatursensor Test ############### 'wird dieser Test Erfolgreich beendet wird die "Messung" oben in den Variablen 'geschrieben [1wtemp_adresse_1(1)] ist der erste Sensor und 'und [1wtemp_adresse_2(1)] ist der zweite usw. 'Gibt die Seriennummer aller Sensoren des Bus über COM(TTL) aus. 'wenn Hardware-Fehler wird dieser angezeigt. Sub Ds1820_alleseriennummern() Local Crc As Byte Local I As Integer Local Anzahl As Integer Dim Adresse(8) As Byte Adresse(1) = 1wsearchfirst() 'prüft den ersten Teilnehmer am Bus If Err = 0 Then 'Wenn err, dann gibt es keinen Sensor 'ist nur für Info die Hex-Adresse ist "Name" mit dieser Kenntnis 'kannst Du mit [1wwrite &H55 und 1wwrite Sensor1_id("Name") , 8 'jeden einzeln ansprechen. Mach bei mehreren Sensoren Sinn. Print "sind Hex-Adresse der Ds1820" 'ab hier prüfen Do Crc = Crc8(adresse(1) , 7) If Crc <> Adresse(8) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!" For I = 1 To 8 Print Hex(adresse(i)) ; Print " "; Next Print Adresse(1) = 1wsearchnext() 'nächste suchen Loop Until Err = 1 End If 'Print Anzahl = 1wirecount() 'Anzahl der Sensoren Print "Anzahl der Sensoren am Bus: " ; Anzahl Print Print "Test abgeschlossen" Print "Hauptprogramm wird gestartet" Print Wait 5 End Sub