DS 1820 hőmérő élesztés
- gergobmwe30
- DrótVégénSzéndarab
- Hozzászólások: 19
- Csatlakozott: 2010. október 24. vasárnap, 6:00
Roviden:
1wire 8 byte-s azonositoja van. Ezt javasiolkt egy tombben kezelni, igy konnyebb megszolitani. Ha egy adott eszkozzel akarsz beszelgetni:
1wreset 'figyeljen mindenki
1wverify id(1) 'az 1...8 byte azonositoju eszkoz figyel a tobbieknek csond
.
.
.
.
'kibeszelgetted magadat az eszkozzel
1wreset
1wire 8 byte-s azonositoja van. Ezt javasiolkt egy tombben kezelni, igy konnyebb megszolitani. Ha egy adott eszkozzel akarsz beszelgetni:
1wreset 'figyeljen mindenki
1wverify id(1) 'az 1...8 byte azonositoju eszkoz figyel a tobbieknek csond
.
.
.
.
'kibeszelgetted magadat az eszkozzel
1wreset
- gergobmwe30
- DrótVégénSzéndarab
- Hozzászólások: 19
- Csatlakozott: 2010. október 24. vasárnap, 6:00
Na végre sikerült megoldani...
Rájöttem a kiolvasott kód tartalmára...
első 2 jegy: családkód, majd 12 jegy az ID, utána 2 a crc...
Lényeg hogy már megy, így tudok vele kisérletezni, próbálgatni mivel mit érek el...
Ezt összehozom még a menüvel, és kész a termosztátom...
OFF: azt azért még szeretném megkérdezni, bár nem ide tartozik, de: a menüt jó-e, ha külső megszakítással indítom el, majd abban meghívok különféle szubrutinokat, funkciókat? Más nem jut eszembe...
Köszi mindent!!
Rájöttem a kiolvasott kód tartalmára...
első 2 jegy: családkód, majd 12 jegy az ID, utána 2 a crc...
Lényeg hogy már megy, így tudok vele kisérletezni, próbálgatni mivel mit érek el...
Ezt összehozom még a menüvel, és kész a termosztátom...
OFF: azt azért még szeretném megkérdezni, bár nem ide tartozik, de: a menüt jó-e, ha külső megszakítással indítom el, majd abban meghívok különféle szubrutinokat, funkciókat? Más nem jut eszembe...
Köszi mindent!!
Sziasztok!
Rég nem voltam a fórumon annak ellenére hogy használgattam a procikat.
A napokban élesztettem volna egy fűtési rendszert amit csináltam már párat az elmúlt pár évben, de ilyen hibával még nem találkoztam.
ds18b20 1db egy előremenő csövön figyelne. Itthon atmega168 rá kötöm DQ és gnd waitms 750 a konverziónál 4,7k felhúzó és a 24 fokos szobában mér 24 fokot ha melegítem méri szabályosan ahogy kell és ahogy szokták.
Jogos a kérdés hogy akkor mi a bajom....
Elmentem oda ahova tenni kellene, bekábelezem, felszerelem, amit kell megcsináltam. Bemásoltam a 1W hőmérő programrész az ottani atmega8-ba, beállítottam portb.0 ra. és vártam hogy majd működik, DE NEM. --->RS232 debug---> -23 fok ott ahol 60nak kellene lennie. Itt a hiba.
Kérdésem: Ti futottatok bele ilyen hibába? ki milyen fügvényt a hőmérséklet konverzióra DS1820, DS1820S, és DS18B20 esetében?
Köszi
Jah és próbáltam úgy is hogy adok neki 5-v ot is de az nem befolyásolt semmit.
Rég nem voltam a fórumon annak ellenére hogy használgattam a procikat.
A napokban élesztettem volna egy fűtési rendszert amit csináltam már párat az elmúlt pár évben, de ilyen hibával még nem találkoztam.
ds18b20 1db egy előremenő csövön figyelne. Itthon atmega168 rá kötöm DQ és gnd waitms 750 a konverziónál 4,7k felhúzó és a 24 fokos szobában mér 24 fokot ha melegítem méri szabályosan ahogy kell és ahogy szokták.
Jogos a kérdés hogy akkor mi a bajom....
Elmentem oda ahova tenni kellene, bekábelezem, felszerelem, amit kell megcsináltam. Bemásoltam a 1W hőmérő programrész az ottani atmega8-ba, beállítottam portb.0 ra. és vártam hogy majd működik, DE NEM. --->RS232 debug---> -23 fok ott ahol 60nak kellene lennie. Itt a hiba.
Kérdésem: Ti futottatok bele ilyen hibába? ki milyen fügvényt a hőmérséklet konverzióra DS1820, DS1820S, és DS18B20 esetében?
Köszi
Jah és próbáltam úgy is hogy adok neki 5-v ot is de az nem befolyásolt semmit.
1820 és 18b20 -> eltérő a kezelése.
Puska: www.mcselec.com duálhőmérője.
Puska: www.mcselec.com duálhőmérője.
Kód: Egész kijelölése
' This program demonstrate 1Wire dualthermometer DS1820/DS1820S/DS18B20!
' AN111 rewriten
$crystal = 16000000 'Sebesseg
$regfile = "M168pdef.dat" 'Chip
$baud = 9600
$swstack = 20
$hwstack = 64
$framesize = 80
'1Wire
Config 1wire = Portb.3 '1w lab
Declare Sub Init()
Declare Sub Convallt() ' Convert T on ALL sensors
Declare Function Decigrades(byval Sc(9) As Byte , Byval Family As Byte) As Integer
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.7 , Db6 = Portb.0 , Db7 = Portb.1 , E = Portd.5 , Rs = Portd.4
'Temp variables
Dim B As Byte
Dim W As Word
Config Portb.5 = Output
Portb.5 = 1
'Program variables
'Implicit Err created by compiler
Dim Dg As Integer 'DECIgrades, I call it, cause I have no space for commas on the display....
Dim Min1 As Integer
Dim Min2 As Integer
Dim Max1 As Integer
Dim Max2 As Integer
Dim Dsid1(8) As Byte 'Dallas ID 64 bits incl CRC
Dim Dsid2(8) As Byte
'Dim Family As Byte
'When used like this : DsId(1) = 1wread(8)
'DsId(1) = family code 'Ds1820 10h, DS18B20 28h, Ds18s20 10h
'DsId(2) '48 Bits Serial, LSB
'DsId(3)
'DsId(4)
'DsId(5)
'DsId(6)
'DsId(7) '48 Bits Serial, MSB
'DsId(8) '8 CRC
Dim Sc(9) As Byte 'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20
'Sc(1) 'Temperature LSB
'Sc(2) 'Temperature MSB
'Sc(3) 'TH/user byte 1 also SRAM
'Sc(4) 'TL/user byte 2 also SRAM
'Sc(5) 'config also SRAM x R1 R0 1 1 1 1 1 - the r1 r0 are config for resolution - write FF to byte for 12 bit - others dont care
'Sc(6) 'res
'Sc(7) 'res
'Sc(8) 'res
'Sc(9) '8 CRC
'DALLAS DS18B20 ROM and scratchpad commands''''''''''''''''''''''''''1wwrite....
'&H 33 read rom - single sensor
'&H 55 match rom, followed by 64 bits
'&H CC skip rom
'&H EC alarm search - ongoining alarm >TH <TL
'&H BE read scratchpad
'&H 44 convert T
Initlcd
Cls
Initlcd
Cls
W = 1wirecount()
Print "1-Wire:" ; W
1wreset
If Err = 0 Then
Dsid1(1) = 1wsearchfirst()
End If
If W > 1 Then
Dsid2(1) = 1wsearchnext()
End If
If W > 0 Then
If Dsid1(8) = Crc8(dsid1(1) , 7) Then ' Control that the received CRC match the calculated
Locate 1 , 1
Lcd "CRC OK Sensor 1 ID"
Print "CRC OK Sensor 1 ID"
Wait 1
Locate 1 , 1
For B = 1 To 8
Lcd Hex(dsid1(b))
Next
End If
End If
' Second sensor
If W > 1 Then
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
Locate 2 , 1
Lcd "CRC OK Sensor 2 ID"
Print "CRC OK Sensor 2 ID"
Wait 1
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid2(b))
Next
End If
End If
Wait 1
Cls
Call Init()
' Main loop
Do
Call Convallt() 'Convert ALL T on the 1w-bus
Waitus 200
Waitus 200
Waitus 200
Waitus 200 'if you use 2-wire, could be reduced to 200us
1wverify Dsid1(1) 'issues The "Match ROM"
Locate 1 , 1
If Err = 1 Then
Lcd "DsId1 not on bus "
Print "DsId1 not on bus " 'Err = 1 if something is wrong
Elseif Err = 0 Then 'lcd " Sensor found"
1wwrite &HBE
Sc(1) = 1wread(9) 'read bytes into array
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9) , Dsid1(1))
If Min1 > Dg Then Min1 = Dg
If Max1 < Dg Then Max1 = Dg
Lcd Dg
Locate 1 , 8
Lcd Min1
Locate 1 , 14
Lcd Max1
Print "ID1:" ; Dg
End If
End If
1wverify Dsid2(1)
Locate 2 , 1
If Err = 1 Then
Lcd "DsId2 not on bus "
Print "DsId2 not on bus "
Elseif Err = 0 Then ' lcd " Sensor found "
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9) , Dsid2(1))
If Min2 > Dg Then Min2 = Dg
If Max2 < Dg Then Max2 = Dg
Lcd Dg
Locate 2 , 8
Lcd Min2
Locate 2 , 14
Lcd Max2
Print "ID2:" ; Dg
End If
End If
Wait 1
Loop
End 'end program
Sub Init()
Cls
Lcd " Min Max"
Locate 2 , 1
Lcd " Min Max"
Min1 = 999 ' to get a real value from start
Min2 = 999
End Sub
'WAIT 200-750 ms after issued, internal conversion time for the sensor''''''''''
'SKIPS ROM - so it makes the conversion on ALL sensors on the bus simultaniously
'When leaving this sub, NO sensor is selected, but ALL sensors has the actual
'temperature in their scratchpad ( within 750 ms )
Sub Convallt()
1wreset ' reset the bus
1wwrite &HCC ' skip rom
1wwrite &H44 ' Convert T
End Sub
'Makes a integer value of the first two bytes in scratchpad'''''''''''''
'Works on DS18 B 20 , observe "B". The R0 and R1 in Sc(5) tells you how many bits are accurate
Function Decigrades(byval Sc(9) As Byte , Byval Family As Byte)
Dim Tmp As Byte , T As Integer , T1 As Integer
If Family = &H28 Then '18B20
Decigrades = 0
Decigrades = Makeint(sc(1) , Sc(2))
Decigrades = Decigrades * 10
Decigrades = Decigrades / 16
End If
If Family = &H10 Then '1820/1820S
Tmp = Sc(1) And 1 ' 0.1C precision
If Tmp = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
'Print Hex(t)
'Print T
T = T * 50 'here we calculate the 1/10 precision like
T = T - 25 'DS18S20 data sheet
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
Decigrades = T / 10
'As integer, this routine gives T*10, with 1/10 degree precision
End If
End FunctionAdott egy D18B20-as sensor.
Atmega8 prociban fut az alábbi program.
CRC rendben de mindig csak 85,0C olvas ki mi lehet az oka.
Ugyanez a sensor egy másik mega8-al aminek sajnos nem ismerem a programját fut szépen.
Atmega8 prociban fut az alábbi program.
CRC rendben de mindig csak 85,0C olvas ki mi lehet az oka.
Ugyanez a sensor egy másik mega8-al aminek sajnos nem ismerem a programját fut szépen.
Kód: Egész kijelölése
$crystal = 4000000 'Sebesseg
$regfile = "m8def.dat" 'Chip
$baud = 9600
$swstack = 10
$hwstack = 32
$framesize = 40
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , Rs = Portb.2
Config Lcdmode = Port
Deflcdchar 3 , 2 , 4 , 14 , 17 , 30 , 16 , 14 , 32
Deflcdchar 2 , 10 , 10 , 14 , 17 , 17 , 17 , 14 , 32
Deflcdchar 5 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32
Deflcdchar 6 , 10 , 32 , 17 , 17 , 17 , 17 , 17 , 14
Deflcdchar 0 , 10 , 17 , 17 , 17 , 17 , 17 , 14 , 32
Initlcd
Cursor Off Noblink
Cls
Config 1wire = Portc.5
Declare Sub Convallt ' Konvertálás
Declare Function Decigrades(byval Sc(9) As Byte) As Integer
Dim B As Byte
Dim W As Word
Dim Dg As Integer
Dim Dsid1(8) As Byte 'DS18B20 sensor
Dim Sc(9) As Byte
Dim Ho As Single
Dim Hok As String * 5
W = 1wirecount()
Dsid1(1) = 1wsearchfirst()
Waitus 100
Cls
If Dsid1(8) = Crc8(dsid1(1) , 7) Then ' A beolvasott CRC egyeztetés
Locate 2 , 5
Lcd "Szenzor 1 OK"
End If
Wait 1
Cls
Do
Convallt ' Konvertálás
Waitus 750
1wverify Dsid1(1)
If Err = 1 Then
Cls
Locate 1 , 5
Lcd "Szenzor Hiba"
Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))
Cls
Locate 1 , 5
Lcd "H" ; Chr(002) ; "m" ; Chr(003) ; "rs" ; Chr(003) ; "klet"
Locate 2 , 8
Lcd Hok ; Chr(5) ; "C"
End If
End If
Wait 1
Loop
End 'end program
Sub Convallt
1wreset
1wwrite &HCC
1wwrite &H44
End Sub
Function Decigrades(byval Sc(9) As Byte)
Decigrades = 0
Decigrades = Makeint(sc(1) , Sc(2))
Decigrades = Decigrades * 10
Decigrades = Decigrades / 16
If Sc(9) = 1 Then
Decigrades = 0 - Decigrades
End If
Ho = 0
Ho = Dg / 10
Hok = Fusing(ho , "00.0")
Ho = Val(hok)
End FunctionMegtaláltam a hibát!
A convertálás után egy kicsit alulméreteztem a várakozást.
Igy már tökéletesen működik.
A convertálás után egy kicsit alulméreteztem a várakozást.
Igy már tökéletesen működik.
Kód: Egész kijelölése
$crystal = 4000000 'Sebesseg
$regfile = "m8def.dat" 'Chip
'$baud = 9600
$swstack = 10
$hwstack = 32
$framesize = 40
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , Rs = Portb.2
Config Lcdmode = Port
Deflcdchar 3 , 2 , 4 , 14 , 17 , 30 , 16 , 14 , 32
Deflcdchar 2 , 10 , 10 , 14 , 17 , 17 , 17 , 14 , 32
Deflcdchar 5 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32
Deflcdchar 6 , 10 , 32 , 17 , 17 , 17 , 17 , 17 , 14
Deflcdchar 0 , 10 , 17 , 17 , 17 , 17 , 17 , 14 , 32
Initlcd
Cursor Off Noblink
Cls
Config 1wire = Portc.5
Declare Sub Convallt ' Konvertálás
Declare Function Decigrades(byval Sc(9) As Byte) As Integer
Dim B As Byte
Dim W As Word
Dim Dg As Integer
Dim Dsid1(8) As Byte 'DS18B20 sensor
Dim Sc(9) As Byte
Dim Ho As Single
Dim Hok As String * 5
W = 1wirecount()
Dsid1(1) = 1wsearchfirst()
Waitms 100
Cls
If Dsid1(8) = Crc8(dsid1(1) , 7) Then ' A beolvasott CRC egyeztetés
Locate 2 , 5
Lcd "Szenzor 1 OK"
End If
Wait 1
Cls
Do
Convallt ' Konvertálás
Waitms 750 'Itt volt a hiba
1wverify Dsid1(1)
If Err = 1 Then
Cls
Locate 1 , 5
Lcd "Szenzor Hiba"
Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))
Cls
Locate 1 , 5
Lcd "H" ; Chr(002) ; "m" ; Chr(003) ; "rs" ; Chr(003) ; "klet"
Locate 2 , 8
Lcd Hok ; Chr(5) ; "C"
End If
End If
Wait 1
Loop
End 'end program
Sub Convallt
1wreset
1wwrite &HCC
1wwrite &H44
End Sub
Function Decigrades(byval Sc(9) As Byte)
Decigrades = 0
Decigrades = Makeint(sc(1) , Sc(2))
Decigrades = Decigrades * 10
Decigrades = Decigrades / 16
If Sc(9) = 1 Then
Decigrades = 0 - Decigrades
End If
Ho = 0
Ho = Dg / 10
Hok = Fusing(ho , "00.0")
Ho = Val(hok)
End FunctionSziasztok! Következő lenne a kérdésem.Az itt lévő minta programok ami 4 db ds18b20-as szenzorra lett írva.Az a gondom ,hogyan lehetne megcsinálni
hogyha 1db szenzort (vagy akár 2 db szenzort) akkor csak a rajta lévő szenzorokat mutassa?Ha megint rárakok négyet akkor megint mutassa mind a négyet.Mert olyan zavaró ha csak kettő rakok rá akkor mutatja mind a négyet.
hogyha 1db szenzort (vagy akár 2 db szenzort) akkor csak a rajta lévő szenzorokat mutassa?Ha megint rárakok négyet akkor megint mutassa mind a négyet.Mert olyan zavaró ha csak kettő rakok rá akkor mutatja mind a négyet.
Ha arra a kódra gondolsz amit 2007 körül raktam össze, ahol a dsid(x) változókba tölti az azonosítókat, akkor egyszerű. Ki írás előtt vizsgálod a "hiba(x) = 11 " változó értékét ha nincs hiba tehát látja a szenzort akkor írja ki ha nem látja tehát hibát ad vissza akkor ne írja ki. Azt hiszem abban benne kellett legyen a hibakezelés is ha nem akkor felteszem a komplett kódot.
- ampervadasz
- Bitmanipulátor
- Hozzászólások: 119
- Csatlakozott: 2008. január 19. szombat, 7:00
Szervusztok!
Építettem énis egy 3 szenzorból álló hőmérőt. Tulajdonsága, hogy mindegyik szenzort ID alapján azonosít és kezel. Ha leválasztasz egy szenzort, vagy meghibásodik, akkor az LCD-n egyszerűen kihúzza a digiteket (--°C). Ha ez kell, bemásolom ide a megfelelő kódot, a visszafejtést és a körítést rád bízom.
Építettem énis egy 3 szenzorból álló hőmérőt. Tulajdonsága, hogy mindegyik szenzort ID alapján azonosít és kezel. Ha leválasztasz egy szenzort, vagy meghibásodik, akkor az LCD-n egyszerűen kihúzza a digiteket (--°C). Ha ez kell, bemásolom ide a megfelelő kódot, a visszafejtést és a körítést rád bízom.