Subversion Repositories svnkaklik

Rev

Rev 306 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log

Rev 306 Rev 307
Line 7... Line 7...
7
//  Princip je zalozen na mereni nejkratsiho casoveho useku v osmi vzorcich, delka vzorku 
7
//  Princip je zalozen na mereni nejkratsiho casoveho useku v osmi vzorcich, delka vzorku 
8
//  se odviji od velikosti prave nejmensiho zmereneho vzorku.
8
//  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
9
//  delka vzorku 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, 
10
//  proti pretekani (pocet preteceni se uklada, do promenne s ktere se zpetne vypocita 16bitove cislo, 
11
//  casovac se tedy virtualne chova jako 16ti bitovy.)
11
//  casovac se tedy virtualne chova jako 16ti bitovy.)
-
 
12
//  
-
 
13
//  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 
-
 
15
//  mensi, nez skutecna. Dusledkem je, ze pokud se jeste pred stopbitem neobjevi samostatny bit s jinou hodnotou, 
-
 
16
//  nez predchozi sekvence. 
12
//
17
//
-
 
18
//Vlastnosti:
-
 
19
//  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.
-
 
21
//  Tato vlastnost ale pøíliš nevadí, protože chování algoritmu lze upravit tak, že bude predpokládat dva nebo tøi stopbity.
-
 
22
//  V takovém pøípadì se packet pøenese korektnì i když parita bude jedna, i nula.
-
 
23
//   
13
// Tento zpusob detekce neni imuni proti nahodnym chybovim spickam vzniklych v dusledku ruseni. 
24
// Tento zpusob detekce neni imuni proti nahodnym chybovim spickam vzniklych v dusledku ruseni. 
14
// Proto je nutene napajeni kvalitne stbilizovat, pouzivat blokovaci kondenzatory a 
25
// Proto je nutene napajeni kvalitne stbilizovat, pouzivat blokovaci kondenzatory a 
15
// zabezpecit, aby nedochazelo ke zvedani zeme.
26
// zabezpecit, aby nedochazelo ke zvedani zeme.
16
/////////////////////////////////////////////////////////////////////////////////////
27
/////////////////////////////////////////////////////////////////////////////////////
17
//
28
//
Line 20... Line 31...
20
//  Bylo bydobre zavest uspavani pred prijetim bajtu.
31
//  Bylo bydobre zavest uspavani pred prijetim bajtu.
21
//  Vykouset program na ATtiny13
32
//  Vykouset program na ATtiny13
22
//  Program neni vyzkousen pri extremne nizkych rychlostech, kdy by teoreticky 
33
//  Program neni vyzkousen pri extremne nizkych rychlostech, kdy by teoreticky 
23
//  mohlo dochazet k preteceni promenne cas.
34
//  mohlo dochazet k preteceni promenne cas.
24
//  Neni vyzkousen break, byly testovany pouze ASCII znaky vysilane pres terminal z klavesnice.  
35
//  Neni vyzkousen break, byly testovany pouze ASCII znaky vysilane pres terminal z klavesnice.  
-
 
36
//  Aktivovat WatchDog timer.
-
 
37
//  Neni vyzkouseno na vyssím taktu CPU jak 3,7MHz
25
//////////////////////////////////////////////////////////////////////////////////////
38
//////////////////////////////////////////////////////////////////////////////////////
26
//
39
//
27
 
40
 
28
 
41
 
29
#include <avr/io.h>
42
#include <avr/io.h>
Line 59... Line 72...
59
//	Main
72
//	Main
60
// ------------------------------------------------------------------
73
// ------------------------------------------------------------------
61
int main(void)
74
int main(void)
62
{
75
{
63
int stopbit;
76
int stopbit;
-
 
77
int ctvrtbit;
-
 
78
 
-
 
79
/*typedef struct {		// struktura pro celoèíselné dìlení 
-
 
80
int quot;
-
 
81
int rem;
-
 
82
} div_t;*/
64
 
83
 
65
//  DDRD |= (1<<DDD5);     // povoleni vystupu pro blikani ledkou (mozno odebrat)
-
 
66
 
84
 
67
  DDRB |= (1<<DDB3);     // povoleni vystupu na povolovak 
85
  DDRB |= (1<<DDB3);     // povoleni vystupu na povolovak 
68
 
86
 
69
  TIMSK |= (1 << TOIE0); // Enable timer overflow interrupt
87
  TIMSK |= (1 << TOIE0); // Enable timer overflow interrupt
70
 
88
 
Line 86... Line 104...
86
      preteceni=0;
104
      preteceni=0;
87
	  cas = 0xFFFF;    // nastav cas delky bitu na nejvetsi mozny
105
	  cas = 0xFFFF;    // nastav cas delky bitu na nejvetsi mozny
88
	  	  	  	  
106
	  	  	  	  
89
	  while (bit <= 8)  // odpocitej dobu 8mi bitu
107
	  while (bit <= 8)  // odpocitej dobu 8mi bitu
90
	  {
108
	  {
91
	    if ((100+TCNT0+preteceni*0x0100) >= cas) // zkontroluj jestli necekame na dalsi bit dele nez je nekratsi znema delka bitu
109
	    if ((TCNT0+preteceni*0x0100) >= (cas + (ctvrtbit = cas >> 2))) // zkontroluj jestli necekame na dalsi bit dele nez je nekratsi znema delka bitu
-
 
110
// v kontrole je rezerva delky ctvrt bitu
92
		{
111
		{
93
          TCNT0 = 0;					// zacni znova merit cas do dalsiho mozneho bitu
-
 
94
          preteceni=0;
-
 
95
		  bit++;						// pokud jsme cekali dele, tak bit uz ubehl, to znamena, ze muzeme pocitadlo bitu posunout o jednicku
112
		  bit++;						// pokud jsme cekali dele, tak bit uz ubehl, to znamena, ze muzeme pocitadlo bitu posunout o jednicku
-
 
113
//		  div(ctvrtbit,0x0100);			// funkce pro implementaci celociselneho deleni zustava ale nepouzita kvuli nutnosti zavest datove struktury, bude ji nutno pouzit pro vetsi rychlosti   
-
 
114
          TCNT0 = ctvrtbit % 0x0100; //reminder; 					// zacni znova merit cas do dalsiho mozneho bitu 
-
 
115
          preteceni = ctvrtbit/0x0100; //quota;
96
		} 
116
		} 
97
	  }
117
	  }
98
 
118
 
99
/*	  while (!DATA);				// cekani na stop bit (detekce pripadneho paritniho bitu)
119
	  while (!DATA);				// cekani na stop bit (detekce pripadneho paritniho bitu)
100
 
120
 
101
	  for (stopbit=2;stopbit >= 0;stopbit--)    // odpocitej dva stopbity
121
	  for (stopbit=2;stopbit >= 0;stopbit--)    // odpocitej dva stopbity
102
	  {
122
	  {
103
	    while ((TCNT0+preteceni*0x0100) <= cas) 
123
	    while ((TCNT0+preteceni*0x0100) <= cas) 
104
		{
124
		{
105
		  if(!DATA) break;
125
		  if(!DATA) break;
106
        }
126
        }
107
	  }*/
127
	  }
108
    }
128
    }
109
    else  POVOLOVAK_LOW;  	// kdyz je 1 prepni na prijem 
129
    else  POVOLOVAK_LOW;  	// kdyz je 1 prepni na prijem 
110
  }
130
  }
111
  return(0);
131
  return(0);
112
}
132
}