PIC16F877 + DHT22

Toglovat : Já bych řekl, že to MiloPS3 myslel tak, že do ReadData dáš něco ve stylu

Rozsviť LEDku smyčka for Zhasni LEDku return i

Tím, že jsi vyhodil ten break se Ti

          while(RA0 == 1); //Čeká dokud je RA0 v 1

provede vždy. Proto Ti to nečte. Chybí Ti tam závorky.

Tohle by mělo fungovat :

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

Ne,pokud by dal do cteni cekaci smysku navic tak by to asi nefungovalo.
Hned za if(RA0 == 1) { das treba RAB0=toggle
Nevim jestly to tvuj prekladac zna tuhle funkci pokud ne treba nasimulovat,
Pin RB0 se bude stridave nenit 0101… udelati to jakoby hodiny,podle toho pak poznas kdy ctes ten stav toho cidla, to co prectes programem ti musi sedet s tim co odectes v LA

Myslím, že mu to fungovat bude => vyhodnotí bit (1/0) a pokud je jednička, počká na log. úroveň 0 a jde dál. Já mám čekání na log. 0 na vstupu, ale to není až tak důležité, protože 1/0 se vyhodnocuje 30us (já tam mám 50us, protože v datasheetu je pulz pro 0 v high maximálně 20-30us, pro 1 60-70us a při 30us by se to občas mohlo “potkat”) po náběžné hraně.

Já nejsem PICař, takže

 RAB0=toggle

neznám, ale čtení DHT11/22 jsem psal o víkendu pro AVRko.

„toggling” je bitové XOR, na to nemusíš být PICař, to mají všechny C kompilátory stejné, protože je to obecná specifikace Cčka

number ^= 1 << x;
number ^= 1 << x;

Tohle znám, ale “number = toggle” ne, takže jsem myslel, že je to nějaký specifikum pro Cčko pro PICy… Kromě toho RA0 je v tomto okamžiku pin vstupní, tak nevím, proč ho togglovat…

To já taky nevím, to se musíš zeptat MiloPS3 jak to myslel, já se vyjádřil jen k tomu tvaru a té funkci jako takové - konkrétně XC8 žádnou direktivu togglenezná, zná jen to co už jsem psal a to co znáš i ty. Jak to má takovej CCS C nebo Hi-Tech C compiler opravdu netuším. Navíc tak, jak ten tvar napsal, by to “toggle” byla proměnná.

nemluvil sem o RA0 viz
a za dalsi kdyz vycteni z cidla neni stejne tak bych se zameril v prvni rade na spravne precteni ty hodnoty z cidla a to tim ze porovnam hodnotu prectenou programem a odectenim z LA pomoci toho "cteciho priznaku "

edit: omlouvam se za spatny a zavadejici zapis , vyse jsem to napsal slovy takze vas to mohlo trochu kopnout,

vsechy kompilatory nemaji stejne prikazy

V pohodě, tak hlavně že jsme se nakonec domluvili :smiley: Prostě navrhuješ začít od začátku, s tím jednoznačně souhlasím a není k tomu moc co dodat… kde jinde by měl člověk začít když ne správným vyčtením

takže když chci aby mi toggloval RC6, tak to zapíšu takto?

RC6=RC6^1;

Rek bych ze asi takle
PORTC ^= 1 « RC6; (za predpokladu ze je rc6 nadefinovano jako 6 )

RC6 není bajt ale bit, takže napíšeš

RC6 = ~RC6

Do funkce na čtení jsem přidal ten toggle

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

a výsledek je v příloze, pro rychlou orientaci =horní jsou data, spodní toggle
Je z něj patrný, že čtění probíhí tak nějak jinak než bych si představoval.
22.bmp (293 KB)

zvetsi cas vzorkovani at tam jde neco vydet, staci ctvrtka
mas to na spatnym miste to toglovani viz , dej ho ale pred to vzorkovani

Lepší vzorkování bude,až dorazí LA z eBay.
Před to vzorkování myslíš sem?

[code]
int ReadData()
{
int i=0, j;
RC6 = ~RC6;
for(j = 0; j < 8; j++)
{

   while(RA0 == 0); //Čeká dokud je RA0 v 0 
   __delay_us(35);//30 hranice mezi log 0 a log 1 
   if(RA0 == 0) //Zkouší, zda je RA0 po uplynulé době v 1 čí 0 
         i&= ~(1<<(7 - j));  //Znuluje bit 
   else 
  { 
     i|= (1 << (7 - j));  //Nastaví bit do 1 
      while(RA0 == 1); //Čeká dokud je RA0 v 1 
     break; 
  } 
}[/code]

jsem myslel, že když ho dám do smyčky for, tak to změní stav pokaždy když to načte stav.

Jinak tady je zabalenej nezmenšenej obrázek průběhů, předtím jsem ho musel zmenšit ze 4000 na 1000 aby šel vložit.
222.rar (9.37 KB)

ne takle

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

edit: v simulatoru to toglovani chodi ? frekvence procesoru spravne nastavena ?
tet uz je na tom neco vydet :wink:

… a jakmile se přečte první jednička, tak se smyčka for ukončí - to dělá ten break, kterej už tam zase je …

Aha, to je tím, že zkouším 10 verzí naráz. Když dám break; pryč, tak se mi to sehne v tý funkci a nechce to projet ani jednou.

Vyhoď i to while (RA==0) a delay…

nahlídni sem, to je zdroják knihovny pro Arduino pro to čidlo, mrkni pro inspiraci co tam řeší

github.com/nethoncho/Arduino-DHT22

Abychom si rozuměli, z tohoro

int ReadData() { int i=0, j; for(j = 0; j < 8; j++) { RC6 = ~RC6; i = 0; while(RA0 == 0); //Čeká dokud je RA0 v 0 __delay_us(35);//30 hranice mezi log 0 a log 1 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; }
mám odstranit

while(RA0 == 0); //Čeká dokud je RA0 v 0 __delay_us(35);//30 hranice mezi log 0 a log 1
Toto?
Vždyť to čeká na náběžnou hranu a pak po zvolený době to vyčte 1 nebo 0.
Tím by to přece nešlo ne?