Subversion Repositories svnkaklik

Rev

Rev 297 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log

Rev 297 Rev 298
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>
9
#include <ctype.h>
10
#include <ctype.h>
10
#include <avr/eeprom.h>
11
#include <avr/eeprom.h>
11
#include <avr/pgmspace.h>
12
#include <avr/pgmspace.h>
12
 
13
 
13
 
14
 
14
#define F_CPU 3686400UL
15
#define F_CPU 3686400UL
15
#include <util/delay.h>
16
#include <util/delay.h>
16
 
17
 
17
void delay_ms(unsigned int ms)
18
void delay_ms(unsigned int ms)
18
{
19
{
19
  while(ms)
20
  while(ms)
20
  {
21
  {
21
    _delay_ms(0.96);
22
    _delay_ms(0.96);
22
	ms--;
23
	ms--;
23
  }
24
  }
24
}
25
}
25
 
26
 
26
 
27
 
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
}