Problém s DS18B20, simuláciou v Proteus 8.6 a ATMEGA88PA-PU

První rada zní - začni postupně po částech a nesnaž se rozchodit všechno najednou. Nejdřív začni displejem nebo UARTem, abys byl schopný si nějak zobrazit, co se vlastně v procesoru děje. A teďka ke Tvým dotazům :

  1. Pokud se čidla chovají tak, jak jsi popsal, pak jsou obě DS18B20 v křemíkovém nebi. Oba typy čidel mají shodné zapojení a i shodnou komunikaci. V programu se jenom různě dekódují data.

  2. Buď jsi ponechal naprogramovanou pojistku CKDIV8 nebo (a to je pravděpodobnější) Proteus nestíhá. Proteus je šikovná věcička a ladím na něm spoustu věcí ještě před vlastní stavbou prototypu, ale nespoléhej na něj slepě a sleduj, co to píše za hlášky. Při krystalu 14,75 MHz už asi nebude simulovat v reálém čase (napíše Ti, že kvůli vysokému vytížení procesoru simulace neběží v reálném čase) a pak se Ti klidně může stát, že LEDka bliká 10x pomaleji, ale na funkčnost programu jako takovou (ani na výsledek simulace) to vliv nemá - jen na její rychlost. Při simulacích v Proteu do procesorů vkládám přímo přeložený .hex soubor, abych měl jistotu, že v mcu simuluju to, co mi přeloží překladač (dám vložit zdrojový soubor a místo *.c tam dám . a vyberu můj přeložený .hex soubor). Při úprave programu pak jenom zastavíš simulaci a spustíš ji znovu, aby se Ti .hex soubor v paměti aktualizoval. Jinak 1-wire Proteus umí, takže se dá předpokládat, že pokud to nechodí v Proteu, nebude to chodit ani v reálu. Na druhou stranu, co Ti brání zapíchnout procesor do kontaktního pole, přidat k němu čidlo a testovat zároveň v reálu …

  3. Co se knihovny týká, tak tam bych Ti poradil jenom “začni postupně”. Nastav procesor na IntRC 1 nebo 8 MHz a rozhýbej komunikaci displeje, UARTem a nakonec i s čidlem (klidně použij nějakou knihovnu, kterou jsi někde stahnul). Pokud budeš po UARTu posílat jenom přečtenou teploty (2 byty co přečteš z čisla), tak ani pro UART nemusíš používat krystal. Pak přehoď procesor na ten Tvůj krystal a postupně rozběhni displej a UART. Jakmile budeš schopný zobrazovat, co potřebuješ, můžeš upravit knihovnu (případně napsat svojí). Pokud by ses rozhodl napsat si knihovnu sám, doporučil bych Ti oddělit od sebe teploměry a samotnou 1-wire komunikaci.

V případě 1-wire komunikace jde hlavně o to, vyladit funkci delay tak, aby čekala, jak dlouho má. Navíc je potřeba, aby během zápisu nebo čtení jednoho bitu bylo zakázáno přerušení (je to max. 120us). Já jsem si knihovnu pro 1-wire psal sám (v assembleru) a umí i prohledat sběrnici a udělat seznam připojených 1-wire zařízení a následně s nimi komunikovat. Vlastní komunikace už pak používá tuto knihovnu k zápisu/čtení dat do/z 1-wire sběrnice, takže teploměry jsou vlastně knihovna, používající 1-wire knihovnu. Používám i vlastní Wait knihovnu a změnu kmitočtu procesoru řeším úpravou 3 ze 4 delay funkcí Wait1us, Wait2us, Wait10us a Wait100us tak, aby trvaly požadovanou dobu s co nejmenší odchylkou. Wait100us se už pak skládá z 10 volání Wait10us.