1-Wire komunikace s použitím DS2482

MiK

1-Wire komunikace s použitím DS2482
« kdy: 20. 10. 2012, 11:13:04 »
Zdravím.

Zkouším zprovoznit 1-Wire komunikaci pomocí obvodu DS2482-800, ale pořád se mi to nedaří.

Podrobný popis problému:

Mám na sběrnici I2C připojený obvod DS2482-800 s adresou 0x18 (katalogový list - http://datasheets.maximintegrated.com/en/ds/DS2482-800.pdf ).
Na jeho nultém kanálu mám čidlo vlhkosti DHT11 (katalogový list - www.micropik.com/PDF/dht11.pdf ).

Sběrnici I2C ovládám pomocí Pythonu přes rozšíření SMBUS.
S tímto ovládáním problém nemám - mám to vyzkoušeno na i jiných perifériích (GPIO expander, D/A převodník, RTC ...) a funguje to dobře.

Jedná se pouze o dva jednoduché příkazy, které čtou, nebo zapisují hodnoty do registrů periférie.
První příkaz je pro čtení:
  bus.read_byte_data(adresa zařízení , číslo registru)

Druhý příkaz je pro zápis:
  bus.write_byte_data(adresa zařízení , číslo registru, hodnota)


Samotné čidlo vlhkosti DHT11 by se mělo chovat tak, že po resetu 1-W sběrnice po ní odešle 40 bitů (5 bajtů), které obsahují informace o vlhkosti (2 bajty), teplotě (2 bajty) a kontrolní součet (1 bajt).

Jenže ať dělám, co dělám, pořád se mi nedaří sběrnici 1-W zresetovat a pak z ní číst.

Asi nechápu ten systém registrů a příkazů obvodu DS2482.

Zkoušel jsem toto:

bus.write_byte_data(0x18, 0xC3, 0xF0)  #pokus o celkovy reset obvodu DS2482
time.sleep(0.1)
bus.write_byte_data(0x18, 0xC3, 0xB4)  #pokus o reset nulteho kanalu 1-W sbernice

print bus.read_byte_data(0x18, 0xF0)   # cteni status registru

V programu jsem ten status registr chtěl číst opakovaně a zpracovávat získaná data tak dlouho, dokud probíhá komunikace (dokud je nejnižší bit toho status registru v jedničce). Jenže hodnota celého status registru je pořád 24 (takže nejnižší bit je "0"). Předpokládám tedy, že nedošlo k resetu a čidlo vlhkosti nezačalo komunikovat.

Zkoušel jsem toho i víc, ale pořád z toho nemůžu dostat nějaké rozumné hodnoty.

Asi mám zmatek v těch číslech registrů a příkazů.
Například F0 je příkaz pro reset, ale zároveň je to status registr.
Není mi jasné, do kterého registru mám ty příkazy zapisovat.


Můžete mi prosím někdo poradit, případně napsat kousek kódu s příkladem, jak nějaká data z čidla získat?
Alespoň konkrétní příkaz pro reset. Pak už bych se snad chytnul.



RDa

  • *****
  • 2 480
    • Zobrazit profil
    • E-mail
Re:1-Wire komunikace s použitím DS2482
« Odpověď #1 kdy: 21. 10. 2012, 11:19:09 »
Odporucuji toto reseni:
1) zvladnout komunikaci s cidle z mikrokontroleru (kde dodrzet protokol neni problem)
2) pripoj tam osciloskop a porovnavej odezvu - pri rizeni z mcu a z pc

Re:1-Wire komunikace s použitím DS2482
« Odpověď #2 kdy: 21. 10. 2012, 13:35:01 »
Zkoušel jsem toto:

bus.write_byte_data(0x18, 0xC3, 0xF0)  #pokus o celkovy reset obvodu DS2482
time.sleep(0.1)
bus.write_byte_data(0x18, 0xC3, 0xB4)  #pokus o reset nulteho kanalu 1-W sbernice

print bus.read_byte_data(0x18, 0xF0)   # cteni status registru

A když čteš status registr, vidíš v něm správně nastavený presence detect bit po resetu kanálu 0?

Dávají ostatní bity ve status registru smysl?

Zkoušel jsi číst i data (READ 0x96) ? S jakým výsledkem?

Dělal jsi už nějakou aplikaci s 1-W sběrnicí a nebo je to tvůj první pokus?

MiK

Re:1-Wire komunikace s použitím DS2482
« Odpověď #3 kdy: 21. 10. 2012, 15:54:30 »
Dělal jsi už nějakou aplikaci s 1-W sběrnicí a nebo je to tvůj první pokus?


Je to můj první vlastní pokus se sběrnicí 1-W. Právě kvůli tomu jsem pro začátek volil jednodušší čidlo, u kterého by mělo stačit zresetovat sběrnici a pak už jen načíst 40 bitů.
Taky mám teploměr DS18B20, ale tam to bude složitější, protože se bude muset navíc volit i unikátní kód čidla.

Do teďka jsem využíval jen hotové programy, které komunikovaly s čidly přímo, ale ty mají občas problémy.
Mám k dispozici zdroják v "céčku", který sice umí to čidlo vlhkosti obsloužit - ale jak jsem psal, občas se ta komunikace nezdaří.
Koukal jsem na něj jen tak zběžně a i když jsem v "C" nikdy nedělal, tak to vypadá, že tam jde jen o nastavování nějakých kombinací logické 1 a 0 na tom komunikačním drátě s přesným časováním (funkce nanosleep(1)).

Ve vedlejším vlákně "Raspberry Pi a logování teploměru" (http://forum.root.cz/index.php?topic=5045.0)  jsem se dozvěděl, že tam někdo používá ke komunikaci ten obvod DS2482-800, tak jsem si ho jako vzorek nechal poslat a teď se s tím zkouším naučit pracovat.

Na tom obvodu DS2482 se mi už podařilo přepínat kanály:

bus.write_byte_data(0x18 , 0xC3, 0xF0)     #nastaveni kanalu na 0
print bus.read_byte_data(0x18, 0xC3)       # precteni cisla aktivniho kanalu (184 = 0xB8 = nulty kanal)

bus.write_byte_data(0x18 , 0xC3, 0xE1)     #nastaveni kanalu na 1
print bus.read_byte_data(0x18, 0xC3)       # precteni cisla aktivniho kanalu (177 = 0xB1 = prvni kanal)

....

bus.write_byte_data(0x18 , 0xC3, 0x87)     #nastaveni kanalu na 7
print bus.read_byte_data(0x18, 0xC3)       # precteni cisla aktivniho kanalu (135 = 0x87 = sedmy kanal)


Dál tedy předpokládám, že reset zvoleného kanálu se provede zápisem kódu (0xB4) do konfiguračního registru (0xC3) - tím by se měla zahájit komunikace.



A když čteš status registr, vidíš v něm správně nastavený presence detect bit po resetu kanálu 0?
Dávají ostatní bity ve status registru smysl?

Když čtu data ze status registru (0xF0) je výsledkem neměnné číslo 24 - to je bitově 00011000 - takže význam toho stavu je (jestli tomu správně rozumím): linka je zresetovaná a na tom komunikačním drátě je logická jednička.
Ale je to tam pořád. I když před čtením status registru dám několikasekundovou pauzu, nebo i když začnu ten registr číst hned po resetu, tak je tam pořád 24.

Ale tady už si nejsem jistý, jestli jsem provedl správně reset kanálu.

Zkoušel jsi číst i data (READ 0x96) ? S jakým výsledkem?

Zkoušel. Byla to jediná věc, při které se mi podařilo přečíst alespoň nějaké měnící-se hodnoty.
Když jsem v jednoduché smyčce 40x četl ten registr 0x96, dostával jsem občas číslo 8 a občas číslo 9.
Když to zapíšu do řádky, tak to vypadá takhle: 9899999999999999898989898989898989898998
Jenže ty hodnoty nedávají smysl. A dokonce když přepnu komunikaci na nějaký nezapojený 1-W kanál, tak ty 8 a 9 dostávám taky.
Takže to spíš vypadá na nějaké náhodné stavy.

Ale zase nevím, jestli se nemá před čtením ještě někde nastavit třeba nějaký ten "Read pointer".



RDa

  • *****
  • 2 480
    • Zobrazit profil
    • E-mail
Re:1-Wire komunikace s použitím DS2482
« Odpověď #4 kdy: 21. 10. 2012, 16:02:49 »
Me to cidlo neprijde jako 1-wire kompatibilni. Je to priserna blbost ze po resetu se vycte 40 bitu. Normalni 1-wire soucastky odpovidaji maximalne na reset presence-detect stavem a pak cekaji na prikaz (1B) na ktery odpovidaji. Alternativne podporuji multi-drop protokol, aby bylo mozne pripojit vice cidel... a snad povinne maji i unikatni seriove cislo.

Ta soucastka je hodne nestandardni a pokud pouzivate nejaky high-level radic 1-wire rozhrani jakym jiste ten DS2482 je, tak se vam to nemusi podarit rozchodit nikdy.

Na zkouseni si sezente 2x DS2401 - a zapojte nejprve jen jeden, at vite jak detekovat cip. Pak zapojde 2 a detekujte v multidrop stylu (pokud planujete vyuzit 1-wire ve velkem). A pak si sezente ten teplomer, ale tam vam na slozitosti prida spis ten strong-pullup ktery je nutny pri konverzi teploty. Vycitani a zpracovani dat neni tezke.


MiK

Re:1-Wire komunikace s použitím DS2482
« Odpověď #5 kdy: 21. 10. 2012, 16:24:07 »
Ta soucastka je hodne nestandardni a pokud pouzivate nejaky high-level radic 1-wire rozhrani jakym jiste ten DS2482 je, tak se vam to nemusi podarit rozchodit nikdy.

Aha, tak to asi bude ten zásadní problém.
Zkusím tedy k obvodu DS2482 místo čidla vlhkosti DHT11 připojit ten teploměr DS18B20 - ten je určitě kompatibilní s 1-Wire komunikací.


Díky.


r23

Re:1-Wire komunikace s použitím DS2482
« Odpověď #6 kdy: 21. 10. 2012, 21:29:31 »
Nezapomněl jsi dát na tu sběrnici pull-up :) ?

Jirka

Re:1-Wire komunikace s použitím DS2482
« Odpověď #7 kdy: 07. 01. 2013, 10:28:48 »

robin martinez

  • *****
  • 1 138
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Re:1-Wire komunikace s použitím DS2482
« Odpověď #8 kdy: 07. 01. 2013, 10:44:20 »
tak 1wire nebo i2c ? To jsou dvě různý sběrnice
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript

robin martinez

  • *****
  • 1 138
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Re:1-Wire komunikace s použitím DS2482
« Odpověď #9 kdy: 07. 01. 2013, 10:45:15 »
jo takhle... blbě jsem top přečetl, sorry!!!
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript

bulmac

Re:1-Wire komunikace s použitím DS2482
« Odpověď #10 kdy: 25. 03. 2013, 20:41:17 »
DHT11 urcite neni kompatibilni s dallas 1w sbernici.
pokud zmaknes nejaky prevodnik tak sem napis...