JedlaTech

Elektronika, programování AVR a jedna bílá Felicie

 

Komunikace s více teplotními čidly DS18B20 na společné sběrnici 1wire

Teplotní čidla Dallas DS18B20 jsou poměrně oblíbené snímače teploty s digitálním výstupem. Jako spousta výrobků firmy Dallas umožňuje připojení více snímačů na jeden společný pin s možností adresovat libovolné zařízení na sběrnici.

S tímto teplotním čidlem jsem pracoval již dříve avšak vždy jsem každý snímač připojoval ke svému vlastnímu pinu, což je zbytečné plýtvání vývody mikroprocesoru když to jde i jinak :-) Bohužel stále se mi nedařilo rozchodit komunikaci na 1-wire sběrnici. Teď se tedy podařilo takže dalším zájemcům předkládám funkční projekt pro připojení několik teplotních čidel DS18B20 (při minimálních úpravá bude možno použít i jiné snímače).

Pro práci s čidly na sběrnici 1-wire jsou potřebné dvě sady příkazů (2knihovny):

a) 1-wire rozhraní

O 1-wire rozhraní je toho všude popsána spousta, takže se na něj podíváme spíše zpohledu co pro nás znamená prakticky.

Na sběrnici 1-wire je každému zařízení přiřazeno jednoznačné 64bitové identifikační číslo - ROM Registration Number. Pro správnou práci je potřeba znát z čeho se toto číslo skládá:

Podrobnosti celého procesu vyhledávání ROM kódů zde nebudu popisovat, jedná se složitý algoritmus, který v každém svém cyklu nalezne 1zařízení. Načtení více ROM kódů tedy může být časově velice náročné a bude výhodné již načtené kódy ukládat do EEPROM paměti procesoru aby je nebylo potřeba při každém spuštění znovu vyhledávat. Podrobnosti o vyhledávacím algoritmu je možno nastudovat z AN187.

b) Dallas DS18B20

Základní vlastnosti:

Po načtení identifikačního ROM čísla všech snímačů na sběrnici, je možno vyčíst teplotu naměřenou konkrétním čidlem jednoduše zasláním dotazu na danou ROM adresu. Připojený snímač pak odpoví 9B velkou zprávou s následujícím obsahem:

Z diagramu je patrné že pokud nám stačí vyčíst teplotu bez nutnosti provést kontrolní součet, je z časových důvodů výhodné přečíst pouze dva první Byty udávající teplotu. Červeně vyznačený úsek je EEPROM paměť čidla, do které je možno zapsat hodnotu teploty pro alarm a nastavení konfiguračního registru (tedy rozlišení 9,10,11 nebo 12bit).

c) Praktická ukázka práce s čidlem

Pro názornou ukázku je v přílohách uložen kompletní projekt pro AVRStudio4 s funkčním hledáním 2čidel a postupného čtení teploty z obou z nich. Pro práci s čidlem DS18B20 je pro jednoduchost použita jen jediná funkce a to čtení teploty - tato je také v knihovně pro 1-wire. Jednotlivé kroky pro použití knihovny tedy jsou:

1. Nastavení knihovny

V projektu načíst přiloženou knihovnu 1wire.c (1wire.h bude načten automaticky s ní):

#include "1wire.c"

Nastavení pinu pro 1wire sběrnici - může se jednat o libovolný pin ke kterému jsou připojeny snímače (v našem případě pin PA5):

#define OWIREOUTPORT PORTA
#define OWIREOUTPIN 5
#define OWIREINPORT PINA
#define OWIREDDR DDRA

2. Inicializace sběrnice a nalezení všech snímačů:

Pro hledání snímačů existují dvě funkce:

  1. Funkce pro hledání prvního snímače - liší se pouze nulováním nkěterých proměnných
  2. Funkce pro hledání dalších snímačů

Hledání prvního snímače:

cidla = OWFirst(ROM1[0],1,0);
Do podle ROM kódů na první pozici (nultou )bude uložen nalezený kód, návratová hodnota funkce bude rovna 1 v případě, že bylo nalezeno čidlo. V opačném případě je návratová hodnota číslo chyby (viz. seznam v 1wire.h)

Hledání dalších snímačů:

do                                    // hledani dalsich cidel
    {
     cidla = OWNext(ROM1[pocet_cidel],1,0);     // hledej dalsi cidlo
     if(cidla)                        // pokud bylo nalezeno
     pocet_cidel++;                   // zvetsi pocet o jedno
    }while(cidla);                    // dokud byla nalezena dalsi cidla
Uvedený kód bude vyhledávat čidla tak dlouho dokud návatová hodnota funkce pro hledání ROM kódu bude rovna 1 - tedy bylo nalezeno čidlo. Velikost pole ROM[] je nutno nastavit na počet předpokládaných připojených čidel.

3. Čtení hodnoty teploty z určitého čidla:

Pro čtení hodnoty z konkrétního čidla, existuje jednoduchá funkce:

teplota1=DS18B20_read_temp(ROM1[0]);
Vstupním parametrem funkce je ROM kód požadovaného čidla.
Návratová hodnota funkce odpovídá hodnotě teplota * 10 pro lepší manipulaci s desetinnou čárkou.

 

Download

Funkční projekt pro práci se dvěmi čidly pro AVRStudio4