'( **************************************************************************** * Temperatur messen und über 16*2 Lcd anzeigen mittels DS18B20 * * Controller Atmega8 * Sensor DS18B20 es können 10 Sensoren in Reihe angeschlossen werden * * LCD an PortC.0 PortC.1 PortB.2 PortB.3 PortB.4 PortB.5 * Sensor über 1Wire an PortC.5 *************************************************************************** ') $regfile = "m8def.dat" $crystal = 3686400 $hwstack = 32 $swstack = 10 $framesize = 40 Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , Rs = Portc.1 , E = Portc.0 Config Lcd = 16 * 2 Cursor Off Cls Config 1wire = Portc.5 Dim Ar(8) As Byte Dim W As Word Dim I As Byte Dim Ii As Byte Dim Wert_aus_ds1820 As Integer Dim Seriennummer As Byte Dim Eeprom As Byte Dim Halbegrad As Single Dim Temperatur As Single Seriennummer = 1 Locate 1 , 1 Lcd " 1-wire test" Wait 1 Ar(1) = 1wsearchfirst() '* Seriennummer vom 1. DS18B20 holen If Err = 0 Then '* Überprüfen ob 1 Sensor gefunden wurde Do '* Start slaife 1 um weitere Sensoren suchen Cls Locate 1 , 1 Lcd "Seriennummer " ; Seriennummer '* Gefundene Sensoren nummerrieren For I = 1 To 8 Ii = I * 2 Ii = Ii - 1 Locate 2 , Ii Lcd Hex(ar(i)); '* Seriennummer auf LCD ausgeben Eeprom = Seriennummer * 10 Eeprom = Eeprom + I Writeeeprom Ar(i) , Eeprom '* Seriennummer in Eeprom schreiben Next Wait 1 Seriennummer = Seriennummer + 1 If Seriennummer > 11 Then Exit Do '* Auf 10 sensoren begrenzt Ar(1) = 1wsearchnext() '* Nach weiterem Gerät suchen Loop Until Err = 1 ' solange bis sich kein weiteres Gerät mehr meldet. End If Wait 1 W = 1wirecount() ' Anzahl der gefundenen Geräte zählen Cls Locate 1 , 1 Lcd W ; " Sensoren" '* auf LCD ausgeben wifiele Sensoren gefunden wurden Locate 2 , 3 Lcd "Gefunden" Wait 5 Do For Seriennummer = 1 To W For I = 1 To 8 Eeprom = Seriennummer * 10 Eeprom = Eeprom + I Readeeprom Ar(i) , Eeprom '* Seriennummer aus Eeprom lesen Next 1wverify Ar(1) ' Gerät mit der SerienNr. aus Ar() auswählen If Err = 0 Then '* Wenn Sensor fehler 1wwrite &H44 Waitms 500 1wreset 1wverify Ar(1) 1wwrite &HBE Wert_aus_ds1820 = 1wread(2) '* Temperatur Lesen '* 0000 0000 0110 0000 1wreset '* Bit 0-3 nach Komma 4-12 Temperatur wert 13-16 0=+ 1=- Halbegrad = 0 If Wert_aus_ds1820.0 = 1 Then Halbegrad = 0.0625 '* Bit 0 0.0625 C Shift Wert_aus_ds1820 , Right If Wert_aus_ds1820.0 = 1 Then Halbegrad = Halbegrad + 0.125 '* Bit 1 0.125 C Shift Wert_aus_ds1820 , Right If Wert_aus_ds1820.0 = 1 Then Halbegrad = Halbegrad + 0.25 '* Bit 2 0.25 C Shift Wert_aus_ds1820 , Right If Wert_aus_ds1820.0 = 1 Then Halbegrad = Halbegrad + 0.5 '* Bit 3 0.5 C Shift Wert_aus_ds1820 , Right If Wert_aus_ds1820.9 = 0 Then Temperatur = Wert_aus_ds1820 Else Wert_aus_ds1820 = Wert_aus_ds1820 And &B0000000011111111 Decr Wert_aus_ds1820 For I = 0 To 7 Toggle Wert_aus_ds1820.i Next Cls Locate 1 , 1 : Lcd "Testausgabe 5" Locate 2 , 1 : Lcd Bin(wert_aus_ds1820) Wait 10 Temperatur = -wert_aus_ds1820 End If Temperatur = Temperatur + Halbegrad Cls Locate 1 , 1 Lcd "Sensor = " ; Seriennummer ; " von " ; W Locate 2 , 1 Lcd Fusing(temperatur , "#.#") Wait 5 End If Next Loop End 'end program