14,19 → 14,21 |
#define POVOLOVAK_HIGH PORTB |= (1<<PB3) |
#define DATA (PIND & (1<<PD1)) |
|
|
// ------------------------------------------------------------------ |
// Main |
// ------------------------------------------------------------------ |
int main(void) |
{ |
int delay; |
int spozdeni; |
int bit; |
int last; |
int preteceni; |
long int cas; |
|
DDRD |= (1<<DDD5); |
DDRB |= (1<<DDB3); |
|
TCCR1B |= (1 << CS10); // Set up timer |
TCCR0B |= (1 << CS10); // Set up timer |
|
while(1) |
{ |
34,15 → 36,22 |
{ |
POVOLOVAK_HIGH; // zapni vysilani |
|
for (spozdeni=8;spozdeni>=0;spozdeni --) // odpocitej dobu 8mi bitu |
for (bit=7;bit>=0;bit--) // odpocitej dobu 8mi bitu |
{ |
last = DATA; |
TCNT1 = 0; // zacni znova merit cas |
while (TCNT1 <= delay) // bit poznas tak, ze je to nejmensi nalezena delka trvaleho stavu |
TCNT0 = 0; // zacni znova merit cas |
preteceni =0; |
while ((TCNT0+preteceni*0xFF) <= cas) // bit poznas tak, ze je to nejmensi nalezena delka trvaleho stavu |
{ |
if(DATA != last) |
if (!(TIFR << TOV0)) // protoze mame jenom 8mi bitovy casovac, zjisti, jestli nepreteka |
{ |
if (TCNT1 < delay) delay = TCNT1; |
preteceni++; // kdyz pretece, poznamenej to. |
TIFR = 1 << TOV0; // vynuluj flag preteceni |
} |
|
if(DATA != last) // zkontroluj, jestli se nezmenil stav dat. |
{ |
if ((TCNT0+preteceni*0xFF) < cas) cas = TCNT0+preteceni*0xFF; //kdyz se zmenil a trvalo to kratsi dobu nez pred tim poznemenej, jak dlouho to trvalo |
break; |
} |
} |
49,14 → 58,14 |
} |
while (!DATA); // cekani na stop bit |
|
for (spozdeni=2;spozdeni >= 0;spozdeni --) |
{ |
TCNT1 = 0; // zacni znova merit cas zacatku stopbitu |
while (TCNT1 <= delay) if(!DATA) break; |
// for (spozdeni=2;spozdeni >= 0;spozdeni --) |
// { |
// TCNT0 = 0; // zacni znova merit cas zacatku stopbitu |
// while (TCNT0 <= delay) if(!DATA) break; |
// } |
} |
} |
else POVOLOVAK_LOW; // kdyz je 1 prepni na prijem |
delay = 60000; |
cas = 0xFFFF; |
} |
return(0); |
} |