1-wire sběrnice a teploměr DS18B20
Popis 1-wire komunikácie s MCU 8051
František Pospíšil, 30.11.2009-00:00
Časovací smyčky v uvedených programech jsou počítány pro krystal 11,0592 MHz a procesor potřebuje 12 kmitů krystalu na jeden strojový cyklus.Stručný popis sběrnicePro komunikaci obvodů vybavených sběrnicí 1-wire s řídícím procesorem stačí jediný vodič a zem. Při komunikaci je dodržováno master/slave schéma. Přitom zařízení typu slave může být připojeno velké množství a komunikace s konkrétním obvodem je zabezpečena pomocí unikátní, 64 bitové adresy kterou má každý obvod uložen ve své paměti ROM.
V klidu je sběrnice ve stavu log.1, který je udržován za pomoci pull-up rezistoru. Stav log.0 může být dosažen každým zařízením připojeným na sběrnici pomocí jeho výstupu s otevřeným kolektorem. Impulsem tedy rozumíme uzemnění sběrnice na stanovenou dobu.
Pro komunikaci s obvody připojenými na sběrnici je nutno umět provést reset sběrnice, zápis a čtení bajtu na sběrnici:Reset 1-wire sběrniceV první části operace řídící procesor uzemní sběrnici na minimálně 480ms. V druhé části zařízení odpovídají pulsem dlouhým 60-240ms. Program měří dobu po ukončení prvního pulsu i dobu trvání pulsu. Pokud je doba příliš dlouhá, program je ukončen chybovým hlášením.
DSxRES:clr DS_18 ;nuluje bit
mov a,#079h
DSxR11:nop
nop
nop
djnz ACC,DSxR11 ;600us puls
setb DS_18 ;nastavi bit
clr a
DSxR12:jnb DS_18,DSxR14 ;ceka na log.0
inc a
jz DSxR13
sjmp DSxR12
DSxR14:jb DS_18,DSxR15 ;ceka na log.1
inc a
jz DSxR13
sjmp DSxR14
DSxR13:... ... ;konec ERROR
...
DSxR15:ret ;konec OK
Zápis bajtu na 1-wire sběrniciŘídící procesor vysílá bajt jako sekvenci osmi impulsů, kdy pro log.1 je puls kratší než 15ms a pro log.0 je puls delší než 30ms. Bajt je vysílán od bitu s nejnižší váhou po nejvyšší.
mov R7,#008h ;pocet bitu
DSxW01: rrc a
jnc DSxW02
mov R6,#002h ;delka pro log.1
sjmp DSxW03
DSxW02: mov R6,#018h ;delka pro log.0
DSxW03: clr DS_18 ;zacina puls
djnz R6,$
setb DS_18 ;konec pulsu
mov R6,#040h
djnz R6,$ ;cekani mezi bity
djnz R7,DSxW01
lcall WAITx0 ;zotaveni
Čtení bajtu z 1-wire sběrniceŘídící procesor vysílá osm impulsů délky 1-15ms. Na každý puls mu podřízené zařízení odpovídá pulsem délky do 15ms, když má být vyslána log.1, nebo odpovídá pulsem délky 15-45ms, když má být vyslána log.0. Pro přečtení bitu stačí sejmout stav sběrnice někdy po 15ms od řídícího pulsu. Když je vysílána log.0, bude sběrnice ještě v nízké úrovni a když log.1, bude v té době už ve vysoké úrovni. Bajt je vysílán od bitu s nejnižší váhou po nejvyšší.
DSxR01: mov R7,#008h ;pocet bitu
clr DS_18 ;uvodni puls
nop
nop
nop
setb DS_18 ;konec pulsu
mov R6,#008h ;ceka na stred log.0
djnz R6,$
mov C,DS_18 ;prenos stavu bitu
rrc a
mov R6,#040h ;cekani mezi bity
djnz R6,$
djnz R7,DSxR01
lcall WAITx0 ;zotaveni
Napájení obvodů po 1-wire sběrniciObvody s 1-wire rozhraním mohou být po svém datovém vodiči také napájeny. Zde je nutno pull-up rezistor sběrnice přemostit tranzistorem. Ten potom řídící program otevírá v době, kdy neprobíhá komunikace. Přes otevřený tranzistor se nabíjí kondenzátor integrovaný v obvodu. Z tohoto kondenzátoru je potom obvod napájen v době, kdy komunikuje s masterem.
Tady je nutno dát pozor, aby komunikace neprobíhala zbytečně pomalu a také aby tranzistor nebyl otevřen v době komunikace.
Pro dobrou práci teploměru DS18B20 je nutno podržet tranzistor otevřený po celou dobu měření, napájení přes pull-up rezistor nezajistí dostatek energie
Popis obvodu DS18B20(překlad části datového listu)- unikátní rozhraní tvořené jedním vodičem
- každý obvod má 64 bitový kód, uložený ve vnitřní paměti ROM
- nevyžaduje žádné vnější komponenty
- napájení může být odebíráno z datové linky
- napájení je 3,0V – 5,5V
- měří teplotu od –55°C do +125°C (-67°F do +257°F)
- přesnost 0,5°C v rozmezí –10°C do +85°C
- rozlišení teploměru je volitelné v rozsahu 9 až 12 bitů
- naměření teploty s rozlišením 12 bitů trvá 750ms
- ovládací program je kompatibilní s obvodem DS1822
Na obrázku testovacie zapojenie MCU `51, DS18B20 a MAX232 pre sériovú linku.
Jádro obvodu DS18B20 umožňuje nastavit vlastnosti digitálního teploměru. Rozlišení převodníku je uživatelsky nastavitelné na 9, 10, 11, 12 bitů, to odpovídá velikosti dílku 0,5°C, 0,25°C, 0,125°C, 0,0625°C. Základní rozlišení po připojení napájení je 12 bitů. Obvod je po připojení napájení v nečinném stavu, měření teploty a AD převod může být spuštěno příkazem (44h).
Výstupní data jsou ve stupních Celsia, pro aplikace s Fahrenheitovou stupnicí je nutno použít rutinu pro převod. Naměřená data jsou uložena do 16-bitového registru dle obrázku 2. Teplota je kladná, když je bit znaménka S=0 a záporná, když je S=1. Když je převodník nastaven na 12-bitů, všechny bity v registru budou obsahovat platná data. Při nastavení nižších rozlišení nejsou definovány nízké bity. Například při rozlišení převodníku 9-bitů nejsou použity bity 0, 1, 2. Tabulka ukazuje vzory výstupních dat při různých teplotách, převodník je nastaven na 12-bitové rozlišení.
Několik základních příkazů nutných pro práci s teploměrem DS18B20- 0CCh
Procesor může použít tento příkaz těsně po resetu k tomu, aby dalším příkazem oslovil všechna zařízení na sběrnici, bez nutnosti používat nějaké další kódovací informace. Například je možné přikázat všem obvodům, aby provedly teplotní konverzi pomocí sekvence příkazů 0CCh, 044h. Příkaz šetří čas při komunikaci, ale nesmí být použit v souvislosti s příkazy pro čtení, když je na sběrnici víc obvodů. Odpověděly by všechny najednou a došlo by ke kolizi dat.
- 044h
Tento příkaz spustí jeden převod teploty. Po převedení je výsledná teplota uložena do dvou bajtů paměti RAM a obvod se vrátí do nízkoodběrového režimu. Když je obvod napájen parazitně, musí procesor držet sběrnici v log.1 po celou dobu trvání převodu. V případě, že je použito externí napájení, může probíhat další komunikace s obvodem. Obvod bude odpovídat log.0 až do ukončení převodu.
- 0BEh
Umožní čtení paměti obvodu. Přesun dat začíná nejnižším bitem bajtu 0 a pokračuje přes celou paměť až k bajtu 9, kde je uložen CRC kód. Čtení lze ukončit sekvencí reset, když další data nejsou potřebná. Mnohdy stačí přečíst pouze první dvě hodnoty, kde je uložena naměřená teplota.
- 033h
Tento příkaz lze použít tam, kde je pouze jeden obvod na sběrnici. Dovoluje řídícímu obvodu číst 64-bitový kód obvodu. Když tento příkaz použijeme na sběrnici kde je víc obvodů, dojde ke kolizi dat, protože se všechny obvody pokusí odpovědět najednou.
- 055h
Tento příkaz, následovaný 64-bitovým kódem umožní procesoru zvolit jedno z několika zařízení připojených na sběrnici. Bude komunikovat pouze ten obvod, kterému odpovídá 64-bitový kód. Ostatní obvody budou čekat na resetovací impuls vyslaný procesorem.
Příklad sekvence pro změření teploty obvodem DS18B20, obvod je na sběrnici jenom jeden:1. Reset sběrnice.
2. Příkaz 0CCh, příkaz 044h - zahájí měření.
3. Prodleva 0,75 sekund nutná pro převod napětí na data.
4. Příkaz 0CCh, příkaz 0BEh - obvod je připraven vyslat obsah své paměti na sběrnici.
5. Čtení bajtu ze sběrnice, bajt obsahuje spodních osm bitů naměřené teploty.
6. Čtení bajtu ze sběrnice, bajt obsahuje horní čtyři bity naměřené teploty.
Základní rozlišení teploměru je 0,0625°C, přitom nejvyšší z dvanácti bitů je znaménko.
Odkazy:
Zverejnené so súhlasom autora.
Zdroj:
http://www.ok2jnj.wz.cz/ds18b20.htm
tento článok je z mikroZONE
( https://www.mikrozone.sk/pluginy/content/content.php?content.30 )