14,21 → 14,30 |
#define POVOLOVAK_HIGH PORTB |= (1<<PB3) |
#define DATA (PIND & (1<<PD1)) |
|
volatile unsigned int preteceni; |
unsigned int bit; |
unsigned int bitdelay; |
unsigned int last; |
unsigned int cas; |
|
ISR(TIMER0_OVF_vect) // interrupt od preteceni casovace |
{ |
preteceni++; // kdyz pretece, poznamenej to. |
} |
|
|
// ------------------------------------------------------------------ |
// Main |
// ------------------------------------------------------------------ |
int main(void) |
{ |
int bit; |
int last; |
int preteceni; |
long int cas; |
|
DDRD |= (1<<DDD5); |
DDRB |= (1<<DDB3); |
|
TIMSK |= (1 << TOIE0); // Enable timer overflow interrupt |
TCCR0B |= (1 << CS10); // Set up timer |
sei(); // enable interrupts |
|
while(1) |
{ |
36,36 → 45,39 |
{ |
POVOLOVAK_HIGH; // zapni vysilani |
|
for (bit=7;bit>=0;bit--) // odpocitej dobu 8mi bitu |
cas = 0xFFFF; |
bitdelay = 0; |
|
for (bit=0;bit<=7;bit++) // odpocitej dobu 8mi bitu |
{ |
last = DATA; |
TCNT0 = 0; // zacni znova merit cas |
TCNT0 = 0; // vynuluj citac pred tim, ne smazes preteceni, protoze jinak by se mohlo stat, ze se nastavi preteceni driv, nez ma |
preteceni =0; |
while ((TCNT0+preteceni*0xFF) <= cas) // bit poznas tak, ze je to nejmensi nalezena delka trvaleho stavu |
|
while ((TCNT0+preteceni*0x0100) <= cas) // bit poznas tak, ze je to nejmensi nalezena delka trvaleho stavu |
{ |
if (!(TIFR << TOV0)) // protoze mame jenom 8mi bitovy casovac, zjisti, jestli nepreteka |
{ |
preteceni++; // kdyz pretece, poznamenej to. |
TIFR = 1 << TOV0; // vynuluj flag preteceni |
} |
|
bitdelay=TCNT0+preteceni*0x0100; |
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 |
if (bitdelay < cas) cas = bitdelay; //kdyz se zmenil a trvalo to kratsi dobu nez pred tim poznemenej, jak dlouho to trvalo |
break; |
} |
} |
} |
while (!DATA); // cekani na stop bit |
// while (!DATA); // cekani na stop bit |
|
// for (spozdeni=2;spozdeni >= 0;spozdeni --) |
// { |
// TCNT0 = 0; // zacni znova merit cas zacatku stopbitu |
// while (TCNT0 <= delay) if(!DATA) break; |
// } |
/* for (bit=2;bit >= 0;bit--) // odpocitej dva stopbity |
{ |
TCNT0 = 0; // zacni znova merit cas zacatku stopbitu |
preteceni=0; |
|
while ((TCNT0+preteceni*0x0100) <= cas) |
{ |
if(!DATA) break; |
} |
}*/ |
} |
else POVOLOVAK_LOW; // kdyz je 1 prepni na prijem |
cas = 0xFFFF; |
} |
return(0); |
} |