DS 1820 hőmérő élesztés

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: Robert »

Adatlap:
DS18B20 : +/- 0.5 fok, de a gyakorlatban +/- 0.1 fok
DHT11 : +/- 2 fok
Az autót nem tudom :)

Tipp: olvadó jég: 0 fok :P
Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: doncarlos »

Jó a tipp :D

még kihagytam a ds18b20-at így olvasom (mcselec forumrol):

Kód: Egész kijelölése

Dim Ds18b20_scratchpad(9) As Byte
Dim DS18B20_integer_temp As Integer AT DS18B20_Scratchpad OVERLAY
Dim DS18B20_single_temp As Single
Dim Calculated_CRC_value As Byte
Dim I As Byte
Dim Homerseklet As String * 6

1wreset ' Master issues reset pulse.
1wwrite &HCC ' Master issues Skip ROM command.
1wwrite &H44 ' Master issues Convert T command.
Waitms 800 ' Wait for T conversion.

1wreset ' Master issues reset pulse.
1wwrite &HCC ' Master issues Skip ROM command.
1wwrite &HBE ' Master issues Read Scratchpad command.

                                              ' Master reads entire scratchpad including CRC.
Ds18b20_scratchpad(1) = 1wread(9)

Calculated_crc_value = Crc8(ds18b20_scratchpad(1) , 8)      'Claculate the CRC value


If Ds18b20_scratchpad(9) = Calculated_CRC_value Then
   Ds18b20_single_temp = Ds18b20_integer_temp * 0.0625
   Homerseklet = Fusing(ds18b20_single_temp , "#.##")

   Lcdat 1 , 1 , "DS18B20 Temp" , Black , White
   Lcdat 10 , 1 , Homerseklet , Black , White
Else
   Lcdat 60 , 1 , "CRC Error" , Black , White
End If
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: Robert »

Igaz 1 db DS18x20 van a buszon? A kódból ez következik....
Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: doncarlos »

igen csak egy van rajta.
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: GPeti »

Boylerhez készítettem egy vízhőmérőt DS1820 IC-vel, mivel a fagyveszélyt is szeretném jelezni ezért a negatív tartományba is szeretném kiírni a hőfokot meg ha máshol is szükség lenne rá, mivel a boylert napkollektor melegíti ezért kell a teljes felbontás hogy lássam hogy melegszik vagy hűl a víz.
Szóval a DS1820 adatlapján sincs leírva a korrekt képlet meg 0 fok alatt össze-vissza jöttek az értékek és nem tudtam rájönni mi a hiba.

Remélem a fórumon nem követek el nagy szentségtörést hogy PIC-et használok, és itt kérdezősködök, de hát a lényeg a hőmérés meg a DS1820.

Kód: Egész kijelölése

Device 16F628A
Declare XTAL = 4
ALL_DIGITAL = true

Output PORTA.0
Output PORTA.1
Output PORTA.2
Output PORTA.3

Output PORTB
Low PORTA.0
Low PORTA.1
Low PORTA.2
Low PORTA.3
        
		Dim Temperature As	DWord			' Temperature storage
		Dim Temperature_m As Word
		Dim temperature_a As DWord
		Dim Count_remain As Byte			' Count remaining
		Dim Count_per_c As	Byte			' Count per degree C
        Dim Dum			As Byte				' Dummy variable to pad OWIN
        Dim i As Byte
        Dim d As Byte
        Dim dis As Byte
        Dim t As Byte
        Dim bt As Bit
        Dim dis0 As Byte, dis1 As Byte, dis2 As Byte, dis3 As Byte
        Dim d0 As Byte, d1 As Byte, d2 As Byte, d3 As Byte
        Dim dig0 As Byte, dig1 As Byte, dig2 As Byte, dig3 As Byte
        Dim C As Byte 
        Dim meanb As DWord
        Dim first As Bit
        Dim x As Byte
        Dim templow As Byte
        Dim temphigh As Byte
        Dim sig As Bit
        
        first = 0
        meanb = 5000                
		Symbol DQ = PORTA.4					' One-wire data pin

		DelayMS 100							' Wait for PICmicro to stabilise
        
Mainloop: 

		OWrite DQ, 1, [$CC, $44]       		' Start temperature conversion
        
        Repeat 
        x = 10
        GoSub display 
        ORead DQ, 4, [C]              ' Keep reading low pulses until
        Until C <> 0 
        
		OWrite DQ, 1, [$CC, $BE]			' Read the temperature
		Low PORTA.0
        Low PORTA.1
        Low PORTA.2
        Low PORTA.3
        'ORead DQ, 0, [Temperature_m.LowByte, Temperature_m.HighByte, Dum,Dum,Dum,Dum, Count_remain, Count_per_c]
        ORead DQ, 0, [templow, temphigh, Dum,Dum,Dum,Dum, Count_remain, Count_per_c]
        'Temphigh = 255
        'Templow = 206
         Temperature_m.LowByte = templow
         Temperature_m.HighByte = temphigh '+-
               
        If temphigh = 0 Then
        sig = 0
		Temperature_m = (((Temperature_m >> 1) * 100) - 25) + (((Count_per_c - Count_remain) * 100) / Count_per_c)
		 'Temperature_m = ((Temperature_m >> 1) * 100)
		EndIf
		
		If temphigh = 255 Then
        sig = 1
        Temperature_m = 65535 - Temperature_m + 1
		Temperature_m = (((Temperature_m >> 1) * 100) + 25) + (((Count_per_c - Count_remain) * 100) / Count_per_c)
		'Temperature_m = ((Temperature_m >> 1) * 100)
		EndIf
		
		Temperature = Temperature_m
		If first = 0 Then
		meanb = Temperature
		first = 1
		EndIf
		
		temperature_a = Temperature
		
		meanb = meanb * 10
        meanb = meanb + temperature_a                                         '"lowpass filter"
        meanb = meanb / 11                                      
        temperature_a = meanb
				
		If Temperature = temperature_a Then t = 2
		If Temperature > temperature_a Then t = 128
		If Temperature < temperature_a Then t = 16
        If Temperature < 500  Then t = 18
        If Temperature > 9500 Then t = 130
        If sig = 1 Then t = 146	
		
        dig0 = Dig  temperature_a ,0
        dig1 = Dig  temperature_a ,1
        dig2 = Dig  temperature_a ,2
        dig3 = Dig  temperature_a ,3
        x = 255
        GoSub display
  
		GoTo Mainloop
		
		End
		
		display:
		For i = 1 To x
		
        DelayMS 2
        Inc dis
        If dis > 3 Then dis = 0
        Select Case dis
        Case 0: 
         
         High PORTA.0
         Low PORTA.1
         Low PORTA.2
         Low PORTA.3
         PORTB = t 
        
         
        Case 1:
        
         Low PORTA.0
         High PORTA.1
         Low PORTA.2
         Low PORTA.3
         d1 = LookUp dig1 , [252,96,218,242,102,182,190,228,254,246,252]
         PORTB = d1 
         
         
        Case 2:
         
         Low PORTA.0
         Low PORTA.1
         High PORTA.2
         Low PORTA.3
         d2 = LookUp dig2 , [252,96,218,242,102,182,190,228,254,246,252]
         PORTB = d2+1 
         
         
        Case 3:
         
         Low PORTA.0
         Low PORTA.1
         Low PORTA.2
         High PORTA.3
         d3 =  LookUp dig3 , [252,96,218,242,102,182,190,228,254,246,252] 
         PORTB = d3
         
         
        End Select 
        Next i
		Return

Értelmezésem szerint ha a temph byte 0 ról 255 re vált akkor a temphigh, temolow-ból képzett word változónak kell a 2-es kompemensével számolni:
Temperature_m = 65535 - Temperature_m + 1 azaz Temperature_m = ~Temperature_m + 1

Továbbá sehol nincs leírva hogy a Count_per_c , Count_remain hogyan is van negatív tartományban.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: Robert »

Amit keresen adatot, az nem a DS1820-ban van benne. A DS1820S jelű kell neked (DS18S20 néven is szerepel)
A DS1820-ban nincs ilyen regiszter/változó.
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: GPeti »

Sikerült szereznem DS18B20-at, kettőt vettem így kipróbáltam a ROM kód alapján kérdezni a hőmérsékletet, viszont a rom search funkciót az nem értem.
Sajnos nem működik a dolog mert a 10m telefonvezetéken nem jön át a jel, átalakítom úgy a dolgot hogy fent lesz egy panel ami az 1wire átalakítja soros jellé, de nem MAX232 használnék hanem CAN illesztőt PCA82C250. Megmértem a telefonvezeték hullámellenállását ami 130 Ohm, így a két végén 270 Ohm ellenállással lezárva szimetrikus meghajtással tuti jó lesz, RS485 illesztőm az nincs azért használom meg a kísérletezés miatt.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: Robert »

Valamit elrontasz.
10 métert simán kellene vinnie...
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: SzLacus »

Mekkora a felhúzó.
Parazita vagy tápfesz is megy neki.
Nálam hosszabb madzagon is megy, 4 db 18B20 egy buszon, az egyik parazita, a többi tápon, hajlékony telefon 4 eres spagócán. Szerintem nem érdemes átmászni 485-re csak bonyolítja a helyzetet. Meg fogod szeretni a Dallas bus-t, az egyszerűsége okán, ha megtalálod a probléma okát. Nagyon jó dolog, hogy csak rá kell tolni a következő akármit a buszra, és már meg is lehet szólítani, pontosabban simán felfedezi a busz feltérképezés funkció. Nekem nagyon bejött.
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: GPeti »

Egyenlőre feltettem a panelt a solar tartály mellé 1m vezetékre, ha érdekel a vízhőfok felmegyek és megnézem, vagy fürdéskor egyből kiderül :)
Próbáltam a felhúzó ellenállást is változtatni a vezeték két végére vagy mindkettő, de nem lett jó.
Mivel pic-ket használok a porta.4 maradt ez más mint a többi port, open drain kimenetes és schmitt trigger bemenetes de ettől jónak kéne lenni, a tápot is felvittem az érzékelőhöz.
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: SzLacus »

Ha tápja van akkor a felhúzó maradhat az adatlap javaslata szerinti alap értéken. Akkor kell szigorítani, ha nagy a kapacitása a vonalnak. Ha parazita módban megy, akkor azon keresztül kapja a tápot. Ilyenkor amíg a mérés tart, illik magasban hagyni a vonalat, hogy legyen is táp a méréshez. Én még egy gyógy 100nF-ot raknék a táp és föld közé az érzékelőhöz közel, de ezt gondolom te is meg tetted. Utána szkóp és egyéb behatóbb vizsgálatok kezdődnek. Ha megnézted az adatlapját, meg a hivatkozott iButton leírást, akkor ott hihetetlen hosszúságot (600m) is leírnak idealizált körülmények között. Neked is működni fog.
Avatar
szasza7103
Biztosítékgyilkos
Hozzászólások: 53
Csatlakozott: 2012. október 10. szerda, 6:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: szasza7103 »

Szép jó napot!

Kicsit elkeveredtem.
Felélesztettem 2 ds18s20- érzékelőt mcselec minta progi alapján. De nem igazán értem hogyan tudnám tizedes formátumban megjeleníteni az lcd kijelzőn.
Magát a hőmérsékletet integer változóban tárolja ha jól emlékszem. Format paranccsal kellene? Ha nem akkor melyik parancs az ami nekem kell?

Üdv!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: Robert »

Tippek:
A programban a mérésnél van 3 db waitus 200. Cseréld ki 3 db waitms 200-ra (a mérés ideje)

Eredmeny az adat.
egesz fok: egesz(eredmeny/10)
tizedfok: MOD(eredmeny/10)

Kiiras: egesz;".";tizedfok;"oC"
Avatar
szasza7103
Biztosítékgyilkos
Hozzászólások: 53
Csatlakozott: 2012. október 10. szerda, 6:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: szasza7103 »

Köszönöm Robi!

Sikerült megoldanom a bajom. :)
Be is linkelem a megoldást hátha valakinek jól jön a későbbiekben.
Tizedes = Dg1 Mod 10
Egeszfok = Dg1 / 10
Lcd "Szenzor1" ; Egeszfok ; "." ; Tizedes

dg1 : az első szenzor értéke integer tip. változó
tizedes word tip. változó
egészfok integer tip. változó

Üdv!
Avatar
szasza7103
Biztosítékgyilkos
Hozzászólások: 53
Csatlakozott: 2012. október 10. szerda, 6:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: szasza7103 »

Szép jó napot!

Előfordulhat a ds18s20 , hogy ugrál a hőmérséklet tizedes értéke de csak negatív tartományban?
Bevágtam a fagyasztóba és szépen kezdett is csökkenni a hőmérséklet: -10.0C, -10.2C, -10.8C, -10.5C,-11.3C
Ez normális dolog?

Vagy én csináltam valamit rosszul a programban.


Üdv!
Válasz küldése