Subversion Repositories svnkaklik

Rev

Rev 300 | 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
 
302 kaklik 17
 
297 kaklik 18
// ------------------------------------------------------------------
19
//	Main
20
// ------------------------------------------------------------------
21
int main(void)
22
{
302 kaklik 23
int bit;
299 kaklik 24
int last;
302 kaklik 25
int preteceni;
26
long int cas;
297 kaklik 27
 
28
  DDRD |= (1<<DDD5);
300 kaklik 29
  DDRB |= (1<<DDB3);
297 kaklik 30
 
302 kaklik 31
  TCCR0B |= (1 << CS10);  // Set up timer 
297 kaklik 32
 
33
  while(1)
34
  {
300 kaklik 35
	if(!DATA)   // kdyz je 0 na datech 
297 kaklik 36
	{ 
300 kaklik 37
	  POVOLOVAK_HIGH;    // zapni vysilani
38
 
302 kaklik 39
	  for (bit=7;bit>=0;bit--) // odpocitej dobu 8mi bitu 
299 kaklik 40
	  {
300 kaklik 41
		last = DATA;
302 kaklik 42
	    TCNT0 = 0;					// zacni znova merit cas
43
		preteceni =0;
44
	    while ((TCNT0+preteceni*0xFF) <= cas) // bit poznas tak, ze je to nejmensi nalezena delka trvaleho stavu
299 kaklik 45
		{
302 kaklik 46
		  if (!(TIFR << TOV0))		// protoze mame jenom 8mi bitovy casovac, zjisti, jestli nepreteka
299 kaklik 47
		  {
302 kaklik 48
		    preteceni++;			// kdyz pretece, poznamenej to.
49
			TIFR = 1 << TOV0;		// vynuluj flag preteceni
50
		  }
51
 
52
		  if(DATA != last)			// zkontroluj, jestli se nezmenil stav dat.
53
		  {
54
		    if ((TCNT0+preteceni*0xFF) < cas) cas = TCNT0+preteceni*0xFF; //kdyz se zmenil a trvalo to kratsi dobu nez pred tim poznemenej, jak dlouho to trvalo 
299 kaklik 55
			break;
56
		  }
298 kaklik 57
        }
58
	  }
300 kaklik 59
	  while (!DATA);				// cekani na stop bit
60
 
302 kaklik 61
//	  for (spozdeni=2;spozdeni >= 0;spozdeni --)
62
//	  {
63
//	    TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
64
//	    while (TCNT0 <= delay) if(!DATA) break;
65
//	  }
297 kaklik 66
    }
300 kaklik 67
    else  POVOLOVAK_LOW;  	// kdyz je 1 prepni na prijem 
302 kaklik 68
	cas = 0xFFFF;
297 kaklik 69
  }
298 kaklik 70
  return(0);
297 kaklik 71
}