Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

 

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