Subversion Repositories svnkaklik

Rev

Rev 297 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log

Rev 297 Rev 298
Line 1... Line 1...
1
//----------------------------------------------------------------------------------
1
//----------------------------------------------------------------------------------
2
//	Prevodnik RS232 <--> RS485 s prodlevou pri prevodu smerem do RS485
2
//	Prevodnik RS232 <--> RS485 s prodlevou pri prevodu smerem do RS485
3
//	pri startbitu na RS232 zapne okamzite vysilac pokud nejsou detekovana data z RS485. pak ceka definovanou dobu, nez opet prepne kanal na prijem.
3
//	pri startbitu na RS232 zapne okamzite vysilac. ceka nez prestanou prichazet data a vysilac vypne.
-
 
4
//  je implementovany jednoduchy algoritmus na rozpoznani rychlosti, ktery vsak nefunkuje na veskery mozny obsah bajtu.
4
//----------------------------------------------------------------------------------
5
//----------------------------------------------------------------------------------
5
 
6
 
6
#include <avr/io.h>
7
#include <avr/io.h>
7
#include <avr/interrupt.h>
8
#include <avr/interrupt.h>
8
#include <stdlib.h>
9
#include <stdlib.h>
Line 27... Line 28...
27
// ------------------------------------------------------------------
28
// ------------------------------------------------------------------
28
//	Main
29
//	Main
29
// ------------------------------------------------------------------
30
// ------------------------------------------------------------------
30
int main(void)
31
int main(void)
31
{
32
{
-
 
33
int delay;
-
 
34
int bit;
-
 
35
int spozdeni;
32
 
36
 
33
  DDRD |= (1<<DDD5);
37
  DDRD |= (1<<DDD5);
34
  DDRB |= (1<<DDB3);
38
//  DDRB |= (1<<DDB3);
35
 
39
 
36
  TCCR1B |= ((1 << CS10) | (1 << CS11));  // Set up timer 
40
  TCCR1B |= (1 << CS10);  // Set up timer 
37
 
41
 
38
  PORTB |= (1<<PB3);
42
//  PORTB |= (1<<PB3);
39
 
43
 
40
  while(1)
44
  while(1)
41
  {
45
  {
42
	if(!(PIND & (1<<PD1)))
46
	if(!(PIND & (1<<PD1)))   // kdyz je 0 na datech 
43
	{ 
47
	{ 
44
	  TCNT1 = 0;
48
	  PORTD &= ~(1<<PD5);    // zapni vysilani
45
	  PORTD &= ~(1<<PD5);
49
	  TCNT1 = 0;				// zacni merit cas 
46
    }
50
 
-
 
51
      while (!(PIND & (1<<PD1)));  // cekej na 1			
47
 
52
 
-
 
53
	  delay = TCNT1;				// hned jak narazis na 1, poznamenej si jak dlouho to trvalo
-
 
54
	  TCNT1 = 0;					// zacni znova merit cas
-
 
55
	  bit = (delay >> 3);			// cas ktery jsme pred tim zmerili videl 8mi aby jsme se dostali maximalne na delku bitu
-
 
56
	  
-
 
57
	  
48
    if ((TCNT1 >= 1000) && ((PIND & (1<<PD1)))) 
58
	  while (TCNT1 <= delay);  // pockej zmerenou dobu 
-
 
59
	  if((PIND & (1<<PD1)))   // kdyz je 1 na datech, pockej jeste
-
 
60
	  { 
-
 
61
	    for (spozdeni=0;spozdeni<=16;spozdeni ++)
49
    {  
62
	    {
-
 
63
	      TCNT1 = 0;					// zacni znova merit cas
-
 
64
		  if((PIND & (1<<PD1))) while (TCNT1 <= bit);			// kdyz je porad 1 tak pockej jeste delku bitu  
50
	  PORTD |= (1<<PD5);
65
		  else break;
51
	  TCNT1 = 0;
66
        }
-
 
67
	  }
52
    }
68
    }
-
 
69
    else  PORTD |= (1<<PD5);  	// kdyz je 1 prepni na prijem 
53
  }
70
  }
54
  return( 0 );
71
  return(0);
55
}
72
}