Subversion Repositories svnkaklik

Rev

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

Rev 307 Rev 308
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
//Program je urcen k rizeni toku dat v prevodniku RS232 na RS485. S cilem eliminovat jakekoliv prvky nastavovene uzivatelem 
-
 
6
//bez nutnosti pouziti hardwaroveho rizeni toku. Program tedy dokaze detekovat prenosovou rychlost, paritni bit a stopbit.  
-
 
7
//
5
//
8
//
6
//Algoritmus:
9
//Algoritmus:
7
//  Princip je zalozen na mereni nejkratsiho casoveho useku v osmi vzorcich, delka vzorku 
10
//  Princip je zalozen na mereni nejkratsiho casoveho useku v osmi vzorcich, delka vzorku 
8
//  se odviji od velikosti prave nejmensiho zmereneho vzorku.
11
//  se odviji od velikosti prave nejmensiho zmereneho vzorku.
9
//  delka vzorku se meri pomoci 8mi bitoveho casovace a interruptu od zmeny vstupu. casovac je osetren
12
//  Vzorek se meri pomoci 8mi bitoveho casovace a interruptu od zmeny vstupu. casovac je osetren
10
//  proti pretekani (pocet preteceni se uklada, do promenne s ktere se zpetne vypocita 16bitove cislo, 
13
//  proti pretekani (pocet preteceni se uklada, do promenne s ktere se zpetne vypocita 16bitove cislo, 
11
//  casovac se tedy virtualne chova jako 16ti bitovy.)
14
//  casovac se tedy virtualne chova jako 16ti bitovy.)
-
 
15
//  Mereni delky bitu 
12
//  
16
//  
13
//  Aktualni implementace teto metody se chova tak, ze pokud je vyslan bajt ktery po startbitu obsahuje N 
17
//  Aktualni implementace teto metody se chova tak, ze pokud je vyslan bajt ktery po startbitu obsahuje N 
14
//  stejnych bitu, tak je tato sekvence detekovana jako jeden bit to zpusobi ze detekovana rychlost je N krat 
18
//  stejnych bitu, tak je tato sekvence detekovana jako jeden bit to zpusobi ze detekovana rychlost je N krat 
15
//  mensi, nez skutecna. Dusledkem je, ze pokud se jeste pred stopbitem neobjevi samostatny bit s jinou hodnotou, 
19
//  mensi, nez skutecna. Dusledkem je, ze pokud se jeste pred stopbitem neobjevi samostatny bit s jinou hodnotou, 
16
//  nez predchozi sekvence. 
20
//  nez predchozi sekvence. Tak bude vysílání povoleno po dubu osminásobku zmìøené délky "bitu" plus další dva bity jako stopbity.
-
 
21
//  
17
//
22
//
18
//Vlastnosti:
23
//Vlastnosti:
19
//  Tento program je shopen detekovat pararitní bit, ale neni shopen detekovat poèet stopbitù.
24
//  Tento program je shopen detekovat pararitní bit, ale neni shopen detekovat poèet stopbitù.
20
//  To znamená že když bude parita logická jedna, tak bude rozpoznána jako stop bit.
25
//  To znamená že když bude parita logická jedna, tak bude rozpoznána jako stop bit.
21
//  Tato vlastnost ale pøíliš nevadí, protože chování algoritmu lze upravit tak, že bude predpokládat dva nebo tøi stopbity.
26
//  Tato vlastnost ale pøíliš nevadí, protože chování algoritmu lze upravit tak, že bude predpokládat dva nebo tøi stopbity.
Line 28... Line 33...
28
//
33
//
29
//TODO:
34
//TODO:
30
//  Optimalizovat kod, (hlavne najit casove vyhodnejsi umisteni pro nastavovani defaultnich hodnot promennych)
35
//  Optimalizovat kod, (hlavne najit casove vyhodnejsi umisteni pro nastavovani defaultnich hodnot promennych)
31
//  Bylo bydobre zavest uspavani pred prijetim bajtu.
36
//  Bylo bydobre zavest uspavani pred prijetim bajtu.
32
//  Vykouset program na ATtiny13
37
//  Vykouset program na ATtiny13
33
//  Program neni vyzkousen pri extremne nizkych rychlostech, kdy by teoreticky 
38
//  Pri rychlostech mensich nez 9600kbps dochazi k pretekani promennych a algoritmus se nechova korektne.
34
//  mohlo dochazet k preteceni promenne cas.
-
 
35
//  Neni vyzkousen break, byly testovany pouze ASCII znaky vysilane pres terminal z klavesnice.  
39
//  Neni vyzkousen break, byly testovany pouze ASCII znaky vysilane pres terminal z klavesnice.  
36
//  Aktivovat WatchDog timer.
40
//  Aktivovat WatchDog timer.
37
//  Neni vyzkouseno na vyssím taktu CPU jak 3,7MHz
41
//  Neni vyzkouseno na vyssím taktu CPU jak 3,7MHz
38
//////////////////////////////////////////////////////////////////////////////////////
42
//////////////////////////////////////////////////////////////////////////////////////
39
//
43
//
Line 50... Line 54...
50
#define POVOLOVAK_HIGH  PORTB |= (1<<PB3)    // nastaveni jednicky na tentyz vystup
54
#define POVOLOVAK_HIGH  PORTB |= (1<<PB3)    // nastaveni jednicky na tentyz vystup
51
#define DATA	(PIND & (1<<PD3))			// nastaveni vstupu, na kterem se budou detekovat data, musi byt stejny jako vstup pouziteho interruptu 
55
#define DATA	(PIND & (1<<PD3))			// nastaveni vstupu, na kterem se budou detekovat data, musi byt stejny jako vstup pouziteho interruptu 
52
 
56
 
53
volatile unsigned int preteceni;  // promenna na ukladani poctu preteceni casovace
57
volatile unsigned int preteceni;  // promenna na ukladani poctu preteceni casovace
54
volatile unsigned int bit;		// promena pro pocitani bitu v bajtu
58
volatile unsigned int bit;		// promena pro pocitani bitu v bajtu
55
volatile unsigned int bitdelay; // obsahuje aktualni zmereny cas delky bitu
59
volatile unsigned long int bitdelay; // obsahuje aktualni zmereny cas delky bitu
56
volatile unsigned int cas;		// urcuje nejkratsi nalezeny cas delky bitu
60
volatile unsigned long int cas;		// urcuje nejkratsi nalezeny cas delky bitu
57
 
61
 
58
ISR(TIMER0_OVF_vect)   // interrupt od preteceni casovace
62
ISR(TIMER0_OVF_vect)   // interrupt od preteceni casovace
59
{
63
{
60
  preteceni++;			// kdyz pretece, poznamenej to.
64
  preteceni++;			// kdyz pretece, poznamenej to.
61
}
65
}
62
 
66
 
63
ISR(INT1_vect)   // interrupt od zmeny vstupu na datech
67
ISR(INT1_vect)   // interrupt od zmeny vstupu na datech
64
{
68
{
65
  if ((bitdelay=TCNT0+preteceni*0x0100) < cas) cas = bitdelay; // provnani jestli zrovna zmereny cas je kratsi nez nejmensi znamy cas   
69
  if ((bitdelay=(TCNT0+preteceni*0x0100)) < cas) cas = bitdelay; // provnani jestli zrovna zmereny cas je kratsi nez nejmensi znamy cas   
66
  TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
70
  TCNT0 = 0;					// zacni znova merit cas zacatku stopbitu
67
  preteceni=0;				// vynuluj vsechny casove promenne
71
  preteceni=0;				// vynuluj vsechny casove promenne
68
  bit++;		// posun pocitadlo bitu o jednicku 
72
  bit++;		// posun pocitadlo bitu o jednicku 
69
}
73
}
70
 
74
 
Line 97... Line 101...
97
  {
101
  {
98
	if(!DATA)   // kdyz je 0 na datech 
102
	if(!DATA)   // kdyz je 0 na datech 
99
	{ 
103
	{ 
100
	  POVOLOVAK_HIGH;    // zapni vysilani
104
	  POVOLOVAK_HIGH;    // zapni vysilani
101
 
105
 
102
	  bit=0;			// vynuluj vsechny promenne pro mereni casu a pocitani bitu
-
 
103
      TCNT0=0;
106
      TCNT0=0;
104
      preteceni=0;
107
      preteceni=0;
-
 
108
	  bit=0;			// vynuluj vsechny promenne pro mereni casu a pocitani bitu
105
	  cas = 0xFFFF;    // nastav cas delky bitu na nejvetsi mozny
109
	  cas = 0xFFFF;    // nastav cas delky bitu na nejvetsi mozny
106
	  	  	  	  
110
	  	  	  	  
107
	  while (bit <= 8)  // odpocitej dobu 8mi bitu
111
	  while (bit <= 8)  // odpocitej dobu 8mi bitu
108
	  {
112
	  {
109
	    if ((TCNT0+preteceni*0x0100) >= (cas + (ctvrtbit = cas >> 2))) // zkontroluj jestli necekame na dalsi bit dele nez je nekratsi znema delka bitu
113
	    if ((TCNT0+preteceni*0x0100) >= (cas + (ctvrtbit = cas >> 2))) // zkontroluj jestli necekame na dalsi bit dele nez je nekratsi znema delka bitu