Subversion Repositories svnkaklik

Compare Revisions

Ignore whitespace Rev 297 → Rev 298

/programy/Atmel_C/RS232toRS485/P232.c
1,6 → 1,7
//----------------------------------------------------------------------------------
// Prevodnik RS232 <--> RS485 s prodlevou pri prevodu smerem do RS485
// pri startbitu na RS232 zapne okamzite vysilac pokud nejsou detekovana data z RS485. pak ceka definovanou dobu, nez opet prepne kanal na prijem.
// pri startbitu na RS232 zapne okamzite vysilac. ceka nez prestanou prichazet data a vysilac vypne.
// je implementovany jednoduchy algoritmus na rozpoznani rychlosti, ktery vsak nefunkuje na veskery mozny obsah bajtu.
//----------------------------------------------------------------------------------
 
#include <avr/io.h>
29,27 → 30,43
// ------------------------------------------------------------------
int main(void)
{
int delay;
int bit;
int spozdeni;
 
DDRD |= (1<<DDD5);
DDRB |= (1<<DDB3);
// DDRB |= (1<<DDB3);
 
TCCR1B |= ((1 << CS10) | (1 << CS11)); // Set up timer
TCCR1B |= (1 << CS10); // Set up timer
 
PORTB |= (1<<PB3);
// PORTB |= (1<<PB3);
 
while(1)
{
if(!(PIND & (1<<PD1)))
if(!(PIND & (1<<PD1))) // kdyz je 0 na datech
{
TCNT1 = 0;
PORTD &= ~(1<<PD5);
}
PORTD &= ~(1<<PD5); // zapni vysilani
TCNT1 = 0; // zacni merit cas
 
if ((TCNT1 >= 1000) && ((PIND & (1<<PD1))))
{
PORTD |= (1<<PD5);
TCNT1 = 0;
while (!(PIND & (1<<PD1))); // cekej na 1
 
delay = TCNT1; // hned jak narazis na 1, poznamenej si jak dlouho to trvalo
TCNT1 = 0; // zacni znova merit cas
bit = (delay >> 3); // cas ktery jsme pred tim zmerili videl 8mi aby jsme se dostali maximalne na delku bitu
while (TCNT1 <= delay); // pockej zmerenou dobu
if((PIND & (1<<PD1))) // kdyz je 1 na datech, pockej jeste
{
for (spozdeni=0;spozdeni<=16;spozdeni ++)
{
TCNT1 = 0; // zacni znova merit cas
if((PIND & (1<<PD1))) while (TCNT1 <= bit); // kdyz je porad 1 tak pockej jeste delku bitu
else break;
}
}
}
else PORTD |= (1<<PD5); // kdyz je 1 prepni na prijem
}
return( 0 );
return(0);
}