Subversion Repositories svnkaklik

Rev

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

Rev 303 Rev 304
1
//----------------------------------------------------------------------------------
1
//----------------------------------------------------------------------------------
2
//	Prevodnik RS232 <--> RS485
2
//	Prevodnik RS232 <--> RS485
3
//	pri startbitu na RS232 zapne okamzite vysilac pokud nejsou detekovana data z RS485.
3
//	pri startbitu na RS232 zapne okamzite vysilac pokud nejsou detekovana data z RS485.
4
//----------------------------------------------------------------------------------
4
//----------------------------------------------------------------------------------
5
 
5
 
6
#include <avr/io.h>
6
#include <avr/io.h>
7
#include <avr/interrupt.h>
7
#include <avr/interrupt.h>
8
#include <stdlib.h>
8
#include <stdlib.h>
9
#include <ctype.h>
9
#include <ctype.h>
10
#include <avr/eeprom.h>
10
#include <avr/eeprom.h>
11
#include <avr/pgmspace.h>
11
#include <avr/pgmspace.h>
12
 
12
 
13
#define POVOLOVAK_LOW	PORTB &= ~(1<<PB3)
13
#define POVOLOVAK_LOW	PORTB &= ~(1<<PB3)
14
#define POVOLOVAK_HIGH  PORTB |= (1<<PB3)
14
#define POVOLOVAK_HIGH  PORTB |= (1<<PB3)
15
#define DATA	(PIND & (1<<PD1))
15
#define DATA	(PIND & (1<<PD1))
16
 
16
 
17
volatile unsigned int preteceni;
17
volatile unsigned int preteceni;
18
unsigned int bit;
18
unsigned int bit;
19
unsigned int bitdelay;
19
unsigned int bitdelay;
20
unsigned int last;
20
unsigned int last;
21
unsigned int cas;
21
unsigned int cas;
22
 
22
 
23
ISR(TIMER0_OVF_vect)   // interrupt od preteceni casovace
23
ISR(TIMER0_OVF_vect)   // interrupt od preteceni casovace
24
{
24
{
25
  preteceni++;			// kdyz pretece, poznamenej to.
25
  preteceni++;			// kdyz pretece, poznamenej to.
26
}
26
}
27
 
27
 
28
 
28
 
29
// ------------------------------------------------------------------
29
// ------------------------------------------------------------------
30
//	Main
30
//	Main
31
// ------------------------------------------------------------------
31
// ------------------------------------------------------------------
32
int main(void)
32
int main(void)
33
{
33
{
34
 
34
 
35
  DDRD |= (1<<DDD5);
35
  DDRD |= (1<<DDD5);
36
  DDRB |= (1<<DDB3);
36
  DDRB |= (1<<DDB3);
37
 
37
 
38
  TIMSK |= (1 << TOIE0); // Enable timer overflow interrupt 
38
  TIMSK |= (1 << TOIE0); // Enable timer overflow interrupt 
39
  TCCR0B |= (1 << CS10);  // Set up timer 
39
  TCCR0B |= (1 << CS10);  // Set up timer 
40
  sei();   // enable interrupts
40
  sei();   // enable interrupts
41
 
41
 
42
  while(1)
42
  while(1)
43
  {
43
  {
44
	if(!DATA)   // kdyz je 0 na datech 
44
	if(!DATA)   // kdyz je 0 na datech 
45
	{ 
45
	{ 
46
	  POVOLOVAK_HIGH;    // zapni vysilani
46
	  POVOLOVAK_HIGH;    // zapni vysilani
47
 
47
 
48
	  cas = 0xFFFF;
48
	  cas = 0xFFFF;
49
	  bitdelay = 0;
49
	  bitdelay = 0;
50
	  	  	  
50
	  	  	  
51
	  for (bit=0;bit<=7;bit++) // odpocitej dobu 8mi bitu 
51
	  for (bit=0;bit<=7;bit++) // odpocitej dobu 8mi bitu 
52
	  {
52
	  {
53
		last = DATA;
53
		last = DATA;
54
	    TCNT0 = 0;					// vynuluj citac pred tim, než smazes preteceni, protoze jinak by se mohlo stat, ze se nastavi preteceni driv, nez ma
54
	    TCNT0 = 0;					// vynuluj citac pred tim, než smazes preteceni, protoze jinak by se mohlo stat, ze se nastavi preteceni driv, nez ma
55
	    preteceni = 0;
55
	    preteceni = 0;
56
 
56
 
57
	    while ((TCNT0+preteceni*0x0100) <= cas) // bit poznas tak, ze je to nejmensi nalezena delka trvaleho stavu
57
	    while ((TCNT0+preteceni*0x0100) <= cas) // bit poznas tak, ze je to nejmensi nalezena delka trvaleho stavu
58
		{
58
		{
59
		  bitdelay=TCNT0+preteceni*0x0100;
59
		  bitdelay=TCNT0+preteceni*0x0100;
60
		  if(DATA != last)			// zkontroluj, jestli se nezmenil stav dat.
60
		  if(DATA != last)			// zkontroluj, jestli se nezmenil stav dat.
61
		  {
61
		  {
62
		    if (bitdelay < cas) cas = bitdelay; //kdyz se zmenil a trvalo to kratsi dobu nez pred tim poznemenej, jak dlouho to trvalo 
62
		    if (bitdelay < cas) cas = bitdelay; //kdyz se zmenil a trvalo to kratsi dobu nez pred tim poznemenej, jak dlouho to trvalo 
63
			break;
63
			break;
64
		  }
64
		  }
65
        }
65
        }
66
	  }
66
	  }
67
//	  while (!DATA);				// cekani na stop bit
67
	  while (!DATA);				// cekani na stop bit
68
 
68
 
69
/*	  for (bit=2;bit >= 0;bit--)    // odpocitej dva stopbity
69
/*	  for (bit=2;bit >= 0;bit--)    // odpocitej dva stopbity
70
	  {
70
	  {
71
	    TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
71
	    TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
72
		preteceni=0;
72
		preteceni=0;
73
 
73
 
74
	    while ((TCNT0+preteceni*0x0100) <= cas) 
74
	    while ((TCNT0+preteceni*0x0100) <= cas) 
75
		{
75
		{
76
		  if(!DATA) break;
76
		  if(!DATA) break;
77
        }
77
        }
78
	  }*/
78
	  }*/
79
    }
79
    }
80
    else  POVOLOVAK_LOW;  	// kdyz je 1 prepni na prijem 
80
    else  POVOLOVAK_LOW;  	// kdyz je 1 prepni na prijem 
81
  }
81
  }
82
  return(0);
82
  return(0);
83
}
83
}