Subversion Repositories svnkaklik

Rev

Rev 302 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log

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