Analyzátor je na cestě, donde cca do měsíce. Takže pak už to bude trošku víc profi. Na to moje domácí bastlení mi zatím stačil ten PICkit. Jinak díky za moře rad. Ty poslední zkusím dneska večer
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 …
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.
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;
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
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.