Subversion Repositories svnkaklik

Rev

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

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