PIC16F877 + DHT22

Tak jsem to zpravil podle posledních rad. Bohužel mám asi podezdření, že to špatně vyčítá, jelikož to vyčte a zobrazí následující:

Byte 1: 1
Byte 2: 1
Vlhkost: 257

a nebo

Byte 1: 1
Byte 2: 0
Vlhkost: 256

což ten výpočet funguje dobře, ale to vyčítání asi ne.
První byt by měl být 1, ale druhý něco okolo 105.

Asi to teď dám k ledu, nějak mi nejde rozchodit datalogger, počkám na ten profesionálnější alespoň budou pořádný průběhy.

Tak ještě zkus prodloužit ten delay třeba na 40 us. Teoreticky můžeš až na 60, ale musíš se stihnout vrátit na začátek smyčky ještě před náběžnou hranou bitu …

Teď si tedy hrajujes tím delay. Zkusil jsem ho zakomentovat a stejně mi to píše:
Byte 1: 1
Byte 2: 1
Vlhkost: 257

ale předpokládal bych, že by to mělo vypsat maximální hodnotu když budou všechny bity v jedničce 1111111111111111 = 65535.
Nemůže být chyba v

       i|= (1 << (7 - j));  //Nastaví bit do 1 

já tomu řádku teda vůbec radši nerozumím :slight_smile:

No možní rozumím, on jedničku vepíše do pozice (7 - j) a pak to jako přepíše i? Pochopil jsem to správně

Delay musíš nechat, ten je tam k tomu abys vzorkoval ten vstupující bit na správným místě, ale zkus ho prodloužit na těch 50, 60 cca (klidně i postupně nadvakrát).

Ten řádek je bitovej posun, nasouváš jedničku na určený místo, akorát mě tak dochází že to by vlastně mohl bejt ten problém. Jednak podle poslední verze programu nenasouváš nuly (neposouváš prázdné pozice bitů), takže nebudou vycházet pozice těch bitů oproti podobě vstupujícího signálu, a druhak se nemusí v každým průchodu cyklem posouvat o ‘i’, ale jen o jednu.

o ‘j’, pardon (resp. o 7 - j), ale věřím že víte co chci říct.

Ne - chyba je ve funkci ReadData v řádku i = 0; uvnitř smyčky for ( j … ). V každý smyčce nuluješ i, tak se nemůžeš divit, že na výstupu dostáváš jenom poslední bit. Tam to nemá co dělat. To musí zůstat jenom před smyčkou.

Ten řádek i|= (1 << (7 - j)); //Nastaví bit do 1 dělá následující :

vezme jedničku a posune ji na pozici (7 - j) - tedy 7,6,5,…,0 (0x80,0x40,0x20, … ,0x01) a pokaždé ji logicky přičte do i. Jenže na začátku cyklu si vždy i vynuluješ, což je chyba …

Není tam i=(1<<(7-j));, ale i|=(1<<(7-j)); totéž jako i := i or 2^(7-j)
Snad jsem ten Pascalovskej zápis nezpackal.

Když s Cčkem začínáš, tak :

A+=2; odpovídá A = A + 2;
A<<=1; odpovídá A = A << 1;
A=7;* odpovídá A = A * 7;

atd.

No ale to i = 0; mám před začátkem smyčky for

int ReadData() { int i=0, j; for(j = 0; j < 8; j++) { i = 0; while(RA0 == 0); //Čeká dokud je RA0 v 0 __delay_us(35);//30 hranice mezi log 0 a log 1 RC6 = ~RC6; if(RA0 == 1) //Zkouší, zda je RA0 po uplynulé době v 1 čí 0 { i|= (1 << (7 - j)); //Nastaví bit do 1 while(RA0 == 1); //Čeká dokud je RA0 v 1 } } return i; }

Právě že jsem to delay zakomentoval, aby to muselo vyčíst 1, což mi neudělalo

Pardón, teď na to čumím a ono tam fakt je :smiley:

A FUNGUJE TO!!!

Díky chlapci :slight_smile:

A když už jsme u Cčka, tak je rozdíl mezi A++; a ++A;. Na první pohled je to stejné - k A se přičte 1. Rozdíl je však “v načasování” :

[code]A = 2;
B = ++A;

Výsledek : B=3, A=3[/code]

A = 2; B = A++; Výsledek : B=2, A=3

Je to proto, že u B = ++A; se nejdříve provede inkrementace a pak teprve přiřazení.
U B = A++; je to opačně - nejdříve se provede přiřazení a pak teprve inkrementace.

Ovšem POZOR ! Ne vždycky inkrementace znamená zvětšení o 1. Pokud máš třeba pointer na int, pak inkrementace pointeru znamená, že se zvětší o sizeof(int), ale tím se zatím nazatěžuj.

Gratuluju k vítězství. A teď můžeš pokračovat dál … Přeju hodně programátorských úspěchů.

Aji teplota funguje!!! Teplota 26 °C a Vlhkost 36 % :slight_smile:

Kluci, nejste z Brna?

Ne - Jižní Čechy - okolí ČB.

No tak to na pivo nevypadá :-/

Tak až půjdeš s kámošema, tak si dej jedno za mně.

Jedno? To aspoň 10, ale budou mě asi muset táhnout :slight_smile:

Já jsem z olomoucka, ale do Brna občas jezdím (jezdím :confused: s volantem v rukou)

a poblíž Prachatic mám šváru

Zase to moc nepřeháněj, ať nejsem moc nalitej …

Tak to je taky na prd :-/

no ten pocit byl lepší jak Vánoce :slight_smile: