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".