DS18B20 , MSB teploty po převodu vždy 1

Zdravím,
rád bych Vás zkušenější poprosil o pár rad s výše zmíněným teplotním čidlem.
Dnes jsem jej oživoval s pomocí Atmegy8 a Bascomu. Vše se na první pohled chová dobře, ale jen na ten první… V datasheetu 18B20 je uvedenou, jak jsou rozložené informace o teplotě v bytech, které dostanu po převodu z čidla.
To, co z něj však leze mě tomu neodpovídá, LSB má složení 2^7 až 2^0, přičemž když tento byte převedu na decimální číslo a vydělím 16 (algoritmus jsem objevil někde na netu), dostanu celkem odpovídající teplotu, ale bez desetinných míst.
Další částí problému je, že MSB výstupu teploty je stále roven 1, ať dělám, co dělám. Zkoušel jsem upravit hodnoty konfiguračního registru, ale nic se nezměnilo.

Zkoušel jsem jiné zdrojáky pro tento senzor, ale ukazují úplné nesmysly.

Nemá s tímto někdo zkušenost?
Předem díky.

Ako prve si vyskusaj ci mas s cidla odpoved tzv. presence pulse. Tym si vlastne overis ci je cidlo ok. Ja na to pouzivam tuto funkciu.

[code]unsigned char reset_pulse(void){

			char presence_pulse=1;
	
			pin_low(); //vypni pull-up odpor na pine
			pin_out(); //nastav pin ako vystup

			_delay_us(480); //cakaj (hodnota podla datasheetu)
			
			pin_high();	//zapni pull-up odpor na pine
			pin_in();	//nastav pin ako vstup

			_delay_us(60); //cakaj (hodnota podla datasheetu)

    			presence_pulse=(PIND&(1<<PD4));
			 
			_delay_us(420);//cakaj (hodnota podla datasheetu)

			return presence_pulse;
									}[/code]

Je to overene fungovat to musi

Diky za info, zda se, ze ty cidla jsou nejaky fake, jinak uz vazne nevim.
Vytahnu z nej data (9 bytu) , toho prvni 2 byty maji obsahovat udaje o teplote (viz datasheet), ale me z toho vypadne prvni byte např. 01010001 , což po převodu do decimálky a vydělení 16 dá naprosto odpovídající teplotu… (což by ale podle datasheetu rozhodně platit nemělo), jenže pouze celočíselnou. Ten druhý byte je stále roven “00000001” , ať se děje cokoliv.

Jinak vse funguje, nacteni ROM kodu, provoz vice cidel na jedne lince taktez bezproblemu…

Nekoupil jsi náhodou to čidlo v TME?

Nerozumiem preco si nacitane byty v ktorom je ulozena teplota prevadzal do decimalky a potom delil 16timi.
Ked si pozries do datasheetu tak udaj o teplote celeho cisla mas ulozeny v LSB(byte0 v schratchpad) bit4 az bit7 a pokracuje v MSB bit8 az bit10. Desatinne cislo k tomu celemu je ulozene v LSB(byte0 v schratchpad) bit0 az bit3. Zvysne bity v MSB to jest bit11 az bit15 je info ci je teplota kladna alebo zaporna. Neviem ci si ma pochopil ked pozries datasheet bude hned vsetko jasne. Ja to spracovavam takto cely schratchpad si nacitam do pola. A uz len na byte 0 a 1 robim bitove operacie:

[code] unsigned char[8]teplota;
unsigned char cele_cislo;
unsigned int desatiny;

       cele_cislo=teplota[0]>>4; 
    cele_cislo|=(teplota[1]&0x07)<<4;		
    desatiny=teplota[0]&0x0F;[/code]

Spíš to nějak blbě načítá, proto má ten druhej byte furt stejnej nesmysl. S čidlama z TME to nemá co dělat, já je mám taky z TME a fungujou normálně. Ať si k tomu pořídí nějakej logickej analyzér, bez toho se to dost blbě ladí.

Data načítám úplně jednoduše, řekl bych, že ten postup zcela odpovídá datasheetu:

1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750

1wreset
1wwrite &HCC
1wwrite &HBE
Tempdata(1) = 1wread(9)

Všechny byty až na ten jediný se načtou vpohodě, do Ts Th a config registru můžu normálně zapisovat a pak bezproblému načtu vložený obsah, jen ten jediny byte je porad stejny. Mam 3ks cidel, vsechny se projevuji stejne.

Ten algoritmus sem nasel na nejakem webu, jsem si vedom jeho nespravnosti, resp. odlisnosti od datasheetu, ale jak potom vysvetlit, ze ta teplota opravdu odpovida?

Ale neresme to, skoda energie, zda se to byt marne. Zkusim cidla z jineho koutu Asie, treba budou povedenejsi, nez tyhle…


Z TME ich mám za tie roky stovky a ani s jednym nebol problem. S cim problem je, ale je jedno kto cidla dodava (mam odskusane), ze skoro ziadne nepracuje s 4k7 pull-up ani na vzidalenost 2-3cm od MCU priamo na plosnom spoji a nic ine na tom pine zapojene nebolo. Nacitavanie som mal tak casto nespolahlive, ze s tym bolo treba nieco robit. A to nieco znamenalo miesto 4k7 dat odpor s hodnotou 2k2. Od vtedy emam s tymito cisdlami sebemensi problem a to su nasadene po stovkach kde kade, vonku cio vnutri.

100vky kusov? Klobuk dole Martin tebe sa musi aj snivat s tymi cidlami :slight_smile:

To nie je ani tak veľa

Ak je to vyše 80ks ročne, a trva to 3-4 roky, tak tie počty naskáču jen taká rozkoš :slight_smile:

Práve na základe skúseností s týmito čidlami viem povedať, že použiť pre bežné rozsahy teplôt nejaké analógové čidlo typu dióda, alebo KTY, odporové čidlá (pre bežné teploty, nehovorím o vysokých teplotách, kde treba PtXXX alebo termočlánok) alebo analógové čidlá typu LM334 je kvôli zdĺhavej a problematickej kalibrácii sado-maso.

Kalibrácia na stole s referenčným teplomerom je iluzórna, lebo sám som sa presvedčil od kedy mám termovíznu kameru, že teplotné podmienky na stole sa môžu líšiť i v malej vzdialenosti o viac ako 1,5-2°C pričom tieto rozdiely nie sú často čisto pocitovo odhaliteľné. Kalibrácia pre presnosť +/-1°C si pomaly vyžaduje tepelnú komoru ak nie priam už premiešavanú olejovú vaňu.

Takto výrobca niečo deklaruje, pohrá sa pri výrobe s kalibráciou a ja si za primeraný peniaz užívam usporeného času. Za celú tú dobu sa mi nestalo, aby zákazník spochybnil hodnotu teploty vinou čidla. Ak aj nejaké rozdiely boli, ukázalo sa že sa jedná o nevhodné umiestnenie teplomera buď hlavného alebo referenčného. A ja nemám ani prachy a ani čas lietať cez pol republiky preto, že niekde uhlo čidlo o pár stupnňov. Čidlá 18B20 kupujem iba v TME, lebo zatiaľ mali bezkonkurenčnú cenu v niektorých obdobiach aj tretinovú oproti iným dodávateľom.

Tak jsem asi narazil na nějakou vadnou sérii. Pro jeden projekt jsem jich koupil z TME dvacet kusů, protože jak jsi psal jsou skoro za třetinovou cenu. Při testování jsem zjistil že ani jedno nechodí do minusové teploty, prostě jakmile teplota padla pod nulu, čidlo posílalo samé nuly.
Po výměně za čidla z GME bylo vše v pořádku. Zdvihací odpory dávám 2k4 a čidla jsou 10cm od MCU.
Taková je má zkušenost, proto jsem se ptal jestli je nekoupil v TME.
To jen pro info …

Priznam sa ze tiez som ich bral s TME idu bez problemov ale neskusal som ich pri minusovych teplotach. Sice ani nebudu v nizkych teplotach ale len tak zo zvedavosti skusim ze co ukaze.

Ale suhlasim je to ich velka vyhoda ze su nakalibrovane.

A casovanie sedi ?

Myslíš že čidla z TME mají jiné časování než ty z GME?
to jsem nezkoumal.

Ani nie len ci to casovanie nemas na hraniciach rozlisenia a potom by to mohlo robit. Hlavne ak vyuzivas OC mod u uP

Časování mám nastaveno dle DS, ještě jen doplním že hodnoty teploty do plusu posílá správně, ale jak padne teplota pod nulu, tak posílá samé nuly.
Tak já už fakt nevím…

Zkus si trošku pohrát s časováním. Dělal jsem snímání teploty s DS18B20 a testoval jsem ho do maxima horkovzdušnou pistolí a do -20 stupňů v mrazáku. Časy jsem měl taky podle datasheetu, ale zjistil jsem, že nahoru to šlapalo OK, jenže dolů to psalo správně až do nějakých -5 stupňů. Pak vracelo samý jedničky. Po úpravě časování jsem se dostal do cca -12 a situace se opakovala. Po ještě asi 2 nebo 3 úpravách jsem se dostal až do těch -20 (víc nedal mrazák). Otázkou je, jestli bych se dostal až do těch -55 stupňů, ale na teploměru jsem loňskou zimu -23 stupňů viděl, takže to šlapalo. Psal jsem to v asm, takže mám procesor pevně pod kontrolou. Pro přesné časování doporučuju při čtení nebo zápisu bitu (nikoliv bytu) do/z čidla (obecně 1-wire sběrnice) zakazovat přerušení.

Pokud Ti posílá samý nuly, pak zkus trošku prodloužit čas mezi start pulzem a čtením portu. Vypadá to, že čekáš na hranici mezi 1 a 0 a při teplotách nad nulou to vychází, pak už ne.

Taky mám problém s tímto čidlem - a souvisí se vzdáleností.

čidla vzdálená do 10m posílají správné hodnoty, čidlo vzdálené cca 12 - 13m
posílá hodnoty zhruba o 4 stupně vyšší - nejdřív jsem myslel, že je čidlo prostě vadné, ale chovaly se tak další tři co jsem tam dal.

Vůbec tomu nerozumím - čidlo přece neposílá analogovou hodnotu, tak proč závisí na délce vedení? Pro 1w bus by snad neměl být problém ani 100m.
A i kdyby to už na něj bylo moc daleko - tak by přece nekomunikovalo vůbec-
1w protokol není zas až tak triviální.Proč příjde v pořádku 8 byte sériového čísla ale už ne 2 byty s hodnotou? CRC žádný problém nehlásí.

čidlo není napájené parazitně - táhnu k němu 5V v kabelu. a je druhé na lince.

Vyřešil jsem to zatím sw offsetem, protože to zatím vypadá, že ta odchylka je víceméně konstantní.
Ale radši bych aby to posílalo to co má.

A ten Petrův problém - jak by mohlo souviset s časováním, jestli po lince jde v jednom z bytů FF místo 00? Proč by se měl trigger minout ausgerechnet u těch dvou bytů s hodnotou?

Pokud jsem Petrův problém pochopil správně -

tak od určité teploty posílá jenom nuly a ne jen v jednom bytu. Proto bych se zaměřil na časování.

Někdo tu psal, že mu to nechodí s pull-upem 4k7. Mě to s ním na DPS chodí v pohodě. Když jsem ale čidlo dal na cca 10m dlouhý kabel, tak jsem musel dát pull-up menší. Hodnotu si nepamatuju, ale bylo to buď 2k2 nebo dokonce 1k5. Ale myslím, že to píšou přímo v datasheetu (nebo nějaké jiné dokumentaci), že pokud je delší vedení a začíná se projevovat parazitní kapacita kabelu, jej třeba použít menší hodnotu pull-up odporu.