Ahoj, když už jsem si myslel, že umím ovládat DS18B20 a začal si trochu více hrát s jinými programy a kusy kódu, než jsem měl dřív - tam jsem využíval převod na int tt = (scratchpad[1] << 8 ) | scratchpad[0] s tím, že je teplota 16x vyšší. Jenže…
S a B řada se liší. Dle DS je B následníkem 1820 a S má jen 9bitový převod. Ale už jsem se totálně ztratil, když načtu scratchpad, zda je zpracování:
tt = (scratchpad[1] << 8 ) | scratchpad[0];
určené pro DS18B20 nebo DS18S20… Můžete mi to, prosím, někdo osvětlit? Díky.
Zpracování je pro oba stejné. V obou případech je ve scratchpadu přímo INT (signed). Rozdíl je pouze v interpretaci. Zatímco B20 vrací 16ti násobek, S20 pouze dvounásobek.
Rozlišení:
18S20=> lsb = 2^-1 = 1/2, tedy 0.5°C
18B20=> lsb = 2^-4 = 1/16, tedy 0.0625°C
Všechno je v datasheetu.
Je tam dokonce popsáno zvýšení rozlišení pomocí dalších 2 registrů u S20.
já se v tom fakt ztrácím, datasheet snad znám z paměti:( (což nevylučuje, že jsem něco přehlédl). Pro kladné teploty a 12bits u DS18b20 to snad chápu. Ale jsem mimo se zápornými. Konkrétně příklad z DS (datasheets.maxim-ic.com/en/ds/DS18B20.pdf):
1111 1100 1001 0000 má být -55 stupňů
nejvyšších pět bitů jsou znaménka, zůstává:
100 1001 0000
nejnižší 4 jsou desetiny, ignorujme, zůstává:
100 1001, tj. 12^6+12^3+1, tj. 64+8+1 = 73
kde se tedy vezme -55? Díky. Je jasné, že něco dělám blbě, ale fakt nevidím co:(
To je velice jednoduché. Nevíš, co je dvojkový doplněk(způsob uložení celých čísel se znaménkem, ty popisuješ přímý kód), tudíž nemůžeš to číslo spočítat správně. To naštěstí překladač C s procesorem umí a ty nemusíš dělat vůbec nic, prostě máš v proměnné přímo celé číslo se znaménkem, se kterým navíc umějí pracovat funkce jako itoa() - převede číslo na text včetně znaménka.
ááha, to mne nenapadlo, že to je v doplňku, v DS je “The sign bits (S) indicate if the temperature is positive or negative: for positive numbers S = 0 and for negative numbers S = 1.”, čili mne nenapadlo uvažovat o doplňku, když znaménkových bitů je 5 - chápal jsem to jako proprietární zápis dle tabulky v DS. To dává smysl, díky.
Toto bude i můj případ, neumím správně převádět zápornou teplotu. piityy můžeš sem prosím napsat vzoreček pro převod mínusových teplot z DS18B20 12bit převod. Děkuji.
Pokud je číslo záporné( (cislo&1<<msb)==true ), absolutní hodnotu získáš jeho negací a přičtením 1 ( abs = (~cislo)+1 ). To, že je výstupem teploměru 16tinásobek na postupu nic nemění.
Co používáš na převod kladné hodnoty na string? Funkce jako printf() (kterou určitě má i překladač microchipu) musejí umět i záporná čísla.
Překladač C18 mimochodem funkci itoa() má - viz. str.126.
Na AVR je ta funkce vymakanější - člověk si může zvolit soustavu, ve který bude výslednej řetězec .
Tvoje funkce nemá s tou, která je zabudovaná v každém překladači, nic společného a opravdu prakticky nic neumí (nehledě na to, že lze napsat jednodušeji).
Tvůj překladač má jak sprintf (verze printf), tak itoa. Stačí si projít obsah manuálu a už je tam vidíš. sourceboost.com/Products/Boo … boostc.pdf
Ano, ten přepočet je stále potřeba, jinak bys získal jen tu absolutní hodnotu, která přijde z teploměru 16x větší. Po provedení přepočtu budeš mít ovšem stále desetinásobek teploty, což jistě víš (násobení 10ti v přepočtu).
Dej pak vědět, jesli jsi to rozchodil a jakým způsobem.
administrator: přiloženy externí soubory boostc.pdf (593 KB)
Tak po delším laborování to konečně chodí. Zjistil jsem, že DS18B20 posílá při jakékoli mínusové teplotě v obou bytech samé jedničky, proto po jejich negaci byla hodnota na displeji nulová. Po výměně čidla za jiné je vše v pořádku, asi to byl nějaký zmetek.
Děkuji všem za užitečné rady a pomoc…
casovanie ti sedi… nieje ten chip prepnuty do ineho rezimu ako 12b. Teoreticky pri nizzsej teplote sa moze rozhodit casovanie a ked to mas v programe na hrane tak to moze blbnut. Alebo mas dfakt zly IO
Vše co popisuješ jsem zkoušel a kontroloval snad stokrát, ale možné je všechno…
Ze čtyřiceti čidel, které mám připravené na jinou aplikaci to dělá jen to jedno.