Subversion Repositories svnkaklik

Rev

Rev 304 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log

Rev 304 Rev 305
Line 1... Line 1...
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
//
-
 
6
//Algoritmus:
-
 
7
//  Princip je zalozen na mereni nejkratsiho casoveho useku v osmi vzorcich, delka vzorku 
-
 
8
//  se odviji od velikosti prave nejmensiho zmereneho vzorku.
-
 
9
//
-
 
10
//
-
 
11
// Tento zpusob detekce neni imuni proti nahodnym chybovim sickam vzniklych v dusledku ruseni. 
-
 
12
// Proto je nutene napajeni kvalitne stbilizovat, pouzivat blokovaci kondenzatory a 
-
 
13
// zabezpecit, aby nedochazelo ke zvedani zeme.
-
 
14
/////////////////////////////////////////////////////////////////////////////////////
-
 
15
//
-
 
16
//TODO:
-
 
17
//  Optimalizovat kod, (hlavne najit casove vyhodnejsi umisteni pro nastavovani defaultnich hodnot promennych)
-
 
18
//  Bylo bydobre zavest uspavani pred prijetim bajtu.
-
 
19
//  Vykouset program na ATtiny13
-
 
20
//  program neni vyzkousen pri extremne nizkych rychlostech, kdy by teoreticky 
-
 
21
//  mohlo dochazet k preteceni promenne cas.
-
 
22
//////////////////////////////////////////////////////////////////////////////////////
-
 
23
//
-
 
24
 
5
 
25
 
6
#include <avr/io.h>
26
#include <avr/io.h>
7
#include <avr/interrupt.h>
27
#include <avr/interrupt.h>
8
#include <stdlib.h>
28
#include <stdlib.h>
9
#include <ctype.h>
29
#include <ctype.h>
10
#include <avr/eeprom.h>
30
#include <avr/eeprom.h>
11
#include <avr/pgmspace.h>
31
#include <avr/pgmspace.h>
12
 
32
 
13
#define POVOLOVAK_LOW	PORTB &= ~(1<<PB3)
33
#define POVOLOVAK_LOW	PORTB &= ~(1<<PB3)
14
#define POVOLOVAK_HIGH  PORTB |= (1<<PB3)
34
#define POVOLOVAK_HIGH  PORTB |= (1<<PB3)
15
#define DATA	(PIND & (1<<PD1))
35
#define DATA	(PIND & (1<<PD3))
16
 
36
 
17
volatile unsigned int preteceni;
37
volatile unsigned int preteceni;
18
unsigned int bit;
38
volatile unsigned int bit;
19
unsigned int bitdelay;
39
volatile unsigned int bitdelay;
20
unsigned int last;
-
 
21
unsigned int cas;
40
volatile unsigned int cas;
22
 
41
 
23
ISR(TIMER0_OVF_vect)   // interrupt od preteceni casovace
42
ISR(TIMER0_OVF_vect)   // interrupt od preteceni casovace
24
{
43
{
25
  preteceni++;			// kdyz pretece, poznamenej to.
44
  preteceni++;			// kdyz pretece, poznamenej to.
26
}
45
}
27
 
46
 
-
 
47
ISR(INT1_vect)
-
 
48
{
-
 
49
  if ((bitdelay=TCNT0+preteceni*0x0100) < cas) cas = bitdelay; //   
-
 
50
  TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
-
 
51
  preteceni=0;
-
 
52
  bit++;
-
 
53
}
28
 
54
 
29
// ------------------------------------------------------------------
55
// ------------------------------------------------------------------
30
//	Main
56
//	Main
31
// ------------------------------------------------------------------
57
// ------------------------------------------------------------------
32
int main(void)
58
int main(void)
33
{
59
{
34
 
60
 
-
 
61
  DDRD |= (1<<DDD5);     // povoleni vystupu pro blikani ledkou (mozno odebrat)
-
 
62
 
35
  DDRD |= (1<<DDD5);
63
  DDRB |= (1<<DDB3);     // povoleni vystupu na povolovak 
-
 
64
 
-
 
65
  TIMSK |= (1 << TOIE0); // Enable timer overflow interrupt
-
 
66
 
-
 
67
  MCUCR |= (1 << ISC10); // nastaveni preruseni od zmeny vstupu pro interrupt INT0
-
 
68
  GIMSK |= (1 << INT1);  // povoleni interruptu INT0
-
 
69
   
36
  DDRB |= (1<<DDB3);
70
  TCCR0B |= (1 << CS00);  // Set up timer 
37
 
71
 
38
  TIMSK |= (1 << TOIE0); // Enable timer overflow interrupt 
-
 
39
  TCCR0B |= (1 << CS10);  // Set up timer 
-
 
40
  sei();   // enable interrupts
72
  sei();   // enable interrupts
41
 
73
 
42
  while(1)
74
  while(1)
43
  {
75
  {
44
	if(!DATA)   // kdyz je 0 na datech 
76
	if(!DATA)   // kdyz je 0 na datech 
45
	{ 
77
	{ 
46
	  POVOLOVAK_HIGH;    // zapni vysilani
78
	  POVOLOVAK_HIGH;    // zapni vysilani
47
 
79
 
48
	  cas = 0xFFFF;
-
 
49
	  bitdelay = 0;
80
	  bitdelay = 0;
-
 
81
	  bit=0;
-
 
82
      TCNT0=0;
-
 
83
      preteceni=0;
-
 
84
	  cas = 0xFFFF;
50
	  	  	  
85
	  	  	  	  
51
	  for (bit=0;bit<=7;bit++) // odpocitej dobu 8mi bitu 
86
	  while (bit <= 10)  // odpocitej dobu 8mi bitu
52
	  {
87
	  {
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
-
 
55
	    preteceni = 0;
88
	    if ((TCNT0+preteceni*0x0100) > cas)
56
 
-
 
57
	    while ((TCNT0+preteceni*0x0100) <= cas) // bit poznas tak, ze je to nejmensi nalezena delka trvaleho stavu
-
 
58
		{
89
		{
59
		  bitdelay=TCNT0+preteceni*0x0100;
-
 
60
		  if(DATA != last)			// zkontroluj, jestli se nezmenil stav dat.
90
          TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
61
		  {
91
          preteceni=0;
62
		    if (bitdelay < cas) cas = bitdelay; //kdyz se zmenil a trvalo to kratsi dobu nez pred tim poznemenej, jak dlouho to trvalo 
-
 
63
			break;
92
		  bit++;
64
		  }
93
		} 
65
        }
-
 
66
	  }
94
	  }
67
	  while (!DATA);				// cekani na stop bit
95
	  while (!DATA);				// cekani na stop bit (detekce pripadneho paritniho bitu)
68
 
96
 
69
/*	  for (bit=2;bit >= 0;bit--)    // odpocitej dva stopbity
97
/*	  for (bit=2;bit >= 0;bit--)    // odpocitej dva stopbity
70
	  {
98
	  {
71
	    TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
-
 
72
		preteceni=0;
-
 
73
 
-
 
74
	    while ((TCNT0+preteceni*0x0100) <= cas) 
99
	    while ((TCNT0+preteceni*0x0100) <= cas) 
75
		{
100
		{
76
		  if(!DATA) break;
101
		  if(!DATA) break;
77
        }
102
        }
78
	  }*/
103
	  }*/