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.
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,
V pohodě, tak hlavně že jsme se nakonec domluvili 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
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)
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.
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
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?