DS18s20, DS18b20 ... rozdíly

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 :smiley:.

Ta moje to asi neumí,

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.

:arrow_right: administrator: přiloženy externí soubory
boostc.pdf (593 KB)

Tak jsem to zatím nerozchodil, stále to zobrazuje při jakékoli mínusové teplotě nuly, pracuji na tom dál…

Kdyžtak potom přihoď kódy (čtení z čidla a převod na text) a mrknem na to.

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… :slight_smile:
Ze čtyřiceti čidel, které mám připravené na jinou aplikaci to dělá jen to jedno.