Subversion Repositories svnkaklik

Rev

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

Rev Author Line No. Line
297 kaklik 1
//----------------------------------------------------------------------------------
2
//	Prevodnik RS232 <--> RS485 s prodlevou pri prevodu smerem do RS485
298 kaklik 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.
297 kaklik 5
//----------------------------------------------------------------------------------
6
 
7
#include <avr/io.h>
8
#include <avr/interrupt.h>
9
#include <stdlib.h>
10
#include <ctype.h>
11
#include <avr/eeprom.h>
12
#include <avr/pgmspace.h>
13
 
14
 
15
#define F_CPU 3686400UL
16
#include <util/delay.h>
17
 
18
void delay_ms(unsigned int ms)
19
{
20
  while(ms)
21
  {
22
    _delay_ms(0.96);
23
	ms--;
24
  }
25
}
26
 
27
 
28
// ------------------------------------------------------------------
29
//	Main
30
// ------------------------------------------------------------------
31
int main(void)
32
{
298 kaklik 33
int delay;
34
int bit;
35
int spozdeni;
297 kaklik 36
 
37
  DDRD |= (1<<DDD5);
298 kaklik 38
//  DDRB |= (1<<DDB3);
297 kaklik 39
 
298 kaklik 40
  TCCR1B |= (1 << CS10);  // Set up timer 
297 kaklik 41
 
298 kaklik 42
//  PORTB |= (1<<PB3);
297 kaklik 43
 
44
  while(1)
45
  {
298 kaklik 46
	if(!(PIND & (1<<PD1)))   // kdyz je 0 na datech 
297 kaklik 47
	{ 
298 kaklik 48
	  PORTD &= ~(1<<PD5);    // zapni vysilani
49
	  TCNT1 = 0;				// zacni merit cas 
297 kaklik 50
 
298 kaklik 51
      while (!(PIND & (1<<PD1)));  // cekej na 1			
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
 
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 ++)
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  
65
		  else break;
66
        }
67
	  }
297 kaklik 68
    }
298 kaklik 69
    else  PORTD |= (1<<PD5);  	// kdyz je 1 prepni na prijem 
297 kaklik 70
  }
298 kaklik 71
  return(0);
297 kaklik 72
}