PIC16F877 + DHT22

Anonym: Tak to jsi asi nečetl datasheet toho DHT22.

Tam je jasně napsáno, že :
Host start signal min. 0,8ms, max. 200ms
Bus master release min. 20us, max. 200us
Response low je dlouhý min. 75us, max. 85us
Response high je dlouhý min. 75us, max. 85us
0 má pulz dlouhý min. 22us, max. 30us
1 má pulz dlouhý min. 68us, max. 75us.
Odstup mezi bitama (low) min. 48us, max. 55us.
Senzor release (low) min. 48us, max. 55us.

Tudíž po 35us od náběžné hrany je na drátu buď log. 0 = bit 0 nebo log. 1 = bit 1. Nikde jsem nepsal o tom, že je to stejné jako DS18B20 a nevím, kde jsi na tuhle pitomost přišel. Není potřeba nic měřit - prostě najít náběžnou hranu, počkat 35-60us a přečíst pin => mám bit. Pokud je v datasheetu nějaká maximální hodnota, tak jí musí splňovat (toleranci tam má). Pokud ne, je to zmetek a nemá cenu se s ním zabývat. Pokud čidlo nedodrží parametry v čase, není důvod se domnívat, že bude měřit v tolerancích napsaných v datasheetu.

A to, že četl jenom 2 byty jsem si všimnul, nicméně je to celkem jedno - prostě přečetl vlhkost a na zbytek se vykašlal - to ještě neznamená, že mu to nechodí.

B0sc0: Měřit délku pulzu nemusíš. Stačí dát _delay_us(35) … Co bych ale udělal, to jsou timeouty při čekání na nějakou hranu - a to nejenom při čtení dat, ale i při kontrole response pulzu. Může se Ti stát, že ztratíš bit (jak jsi viděl, tak na 2 MHz jsi je ztrácel běžně), zlomí se drátek k čidlu nebo ho odpojíš a pak ti to tu zamrzne. Je potřeba, abys třeba po 1 ms ukončil čekání a vrátit zpátky chybu …