Rev 1387 Rev 1389
1 // Infracervene tykadlo IRFEE01A 1 // Infracervene tykadlo IRFEE01A
2 // ----------------------------- 2 // -----------------------------
3 // 3 //
4 // (c)miho@mlab.cz 4 // (c)miho@mlab.cz
5 // 5 //
6 // 1.00 - zakladni funkcni verze 6 // 1.00 - zakladni funkcni verze
-   7 // 1.01 - doplnena moznost s externim nastavenim parametru
7   8  
8 // Prirazeni portu 9 // Prirazeni portu
9 // --------------- 10 // ---------------
10 // 11 //
11 // Procesor: 12 // Procesor:
12 // 13 //
13 // ATtiny13 @ 9.6MHz (interni RC oscilator, vypnuty preddelic 1:8) 14 // ATtiny13 @ 9.6MHz (interni RC oscilator, vypnuty preddelic 1:8)
-   15 // (brown-out reset 2.7V)
-   16 // HIGH 0xFB
-   17 // LOW 0x7A
14 // 18 //
15 // Porty: 19 // Porty:
16 // 20 //
17 // PB1 - Ir LED Anoda proti zemi (svetlo=H) 21 // PB1 - Ir LED Anoda proti zemi (svetlo=H)
18 // PB3 - Vstup od prijimace Ir signalu (tma=H) 22 // PB3 - Vstup od prijimace Ir signalu (tma=H)
19 // PB4 - Indikacni LED a vystup (odraz=H) 23 // PB4 - Indikacni LED a vystup (odraz=H)
20 // 24 //
21 // Princip funkce: 25 // Princip funkce:
22 // 26 //
23 // Pomoci casovace v rezimu CTC se na vystupu PB1 generuje signal 27 // Pomoci casovace v rezimu CTC se na vystupu PB1 generuje signal
24 // o prislusnem kmitoctu (napr 34kHz). Stridavy signal se zapina 28 // o prislusnem kmitoctu (napr 34kHz). Stridavy signal se zapina
25 // a vypina (vysilaji se jednotky a nuly) a na prijimacim portu 29 // a vypina (vysilaji se jednotky a nuly) a na prijimacim portu
26 // se testuje, zda pri vysilani signalu je signal prijat a zda bez 30 // se testuje, zda pri vysilani signalu je signal prijat a zda bez
27 // vysilani signalu signal prijat neni. Pokud je splnena tato podminka, 31 // vysilani signalu signal prijat neni. Pokud je splnena tato podminka,
28 // zvysi se citac prubezne hodnoty, jinak se naopak tento citac snizi. 32 // zvysi se citac prubezne hodnoty, jinak se naopak tento citac snizi.
29 // Trvani jednoho symbolu je dano konstantnou SYMBOL_LENGTH. 33 // Trvani jednoho symbolu je dano konstantnou SYMBOL_LENGTH.
30 // 34 //
31 // Je-li dosazeno maximalni/minimalni hodnoty prubezneho citace, 35 // Je-li dosazeno maximalni/minimalni hodnoty prubezneho citace,
32 // hodnota se dale nezvysuje/nesnizuje. Pri prekroceni (velke kladne) 36 // hodnota se dale nezvysuje/nesnizuje. Pri prekroceni (velke kladne)
33 // hodnoty pro zapnuti se aktivuje vystup, pri poklesu hodnoty pod 37 // hodnoty pro zapnuti se aktivuje vystup, pri poklesu hodnoty pod
34 // spodni (mensi kladnou) mez se vystup deaktivuje. Meze jsou definovany 38 // spodni (mensi kladnou) mez se vystup deaktivuje. Meze jsou definovany
35 // konstantami SUMA_xxx. 39 // konstantami SUMA_xxx.
36 // 40 //
37 // Cilem tohoto opatreni je docilit odolnosti proti ruseni a zavedeni 41 // Cilem tohoto opatreni je docilit odolnosti proti ruseni a zavedeni
38 // hystereze tak, aby vystupni signal byl stabilni a spolehlivy. 42 // hystereze tak, aby vystupni signal byl stabilni a spolehlivy.
39 // 43 //
40   44  
-   45 #ifndef F_CPU
41 #define F_CPU 9600000UL // 9.6MHz je maximální frekvence pro ATtiny 46 #define F_CPU 9600000UL // 9.6MHz je maximální interní frekvence pro ATtiny
-   47 #endif
-   48  
-   49 #ifndef IR_FREQUENCY
42 #define IR_FREQUENCY 36000UL // Frekvece IR signalu 50 #define IR_FREQUENCY 36000UL // Frekvece IR signalu
-   51 #endif
-   52  
-   53 #ifndef CALIBRATION
43 #define CALIBRATION -2 // Zpresneni kalibrace na 9.6MHz 0=nekompenzovat 54 #define CALIBRATION 0 // Zpresneni kalibrace na 9.6MHz 0=nekompenzovat
-   55 #endif
44   56  
45 #include <avr/io.h> 57 #include <avr/io.h>
46 #include <util/delay.h> 58 #include <util/delay.h>
47 #include <avr/interrupt.h> 59 #include <avr/interrupt.h>
48   60  
49 #define SYMBOL_LENGTH 10 // Pocet period jednoho symbolu 61 #define SYMBOL_LENGTH 10 // Pocet period jednoho symbolu
50 #define SUMA_MAX 40 // Maximalni (a minimalni) pocet 62 #define SUMA_MAX 40 // Maximalni (a minimalni) pocet
51 #define SUMA_ON 30 // Pocet pro zapnuti 63 #define SUMA_ON 30 // Pocet pro zapnuti
52 #define SUMA_OFF 0 // Pocet pro vypnuti 64 #define SUMA_OFF 0 // Pocet pro vypnuti
53   65  
54   66  
55 // Zpracovani preruseni od dosazeni horni hranice citace 67 // Zpracovani preruseni od dosazeni horni hranice citace
56 // ----------------------------------------------------- 68 // -----------------------------------------------------
57 // Citac cita (automaticky a opakovane) od 0 do hodnoty v registru OCR0A 69 // Citac cita (automaticky a opakovane) od 0 do hodnoty v registru OCR0A
58 // Pri dosazeni horni meze se neguje vystupni signal na kanalu B 70 // Pri dosazeni horni meze se neguje vystupni signal na kanalu B
59 // Ma-li se vysilat tma, signal na kanalu B se neotaci ale nuluje 71 // Ma-li se vysilat tma, signal na kanalu B se neotaci ale nuluje
60 ISR(TIM0_COMPA_vect) 72 ISR(TIM0_COMPA_vect)
61 { 73 {
62 static unsigned char SymbolLen; // Citac pulperiod symbolu 74 static unsigned char SymbolLen; // Citac pulperiod symbolu
63 static unsigned char SymbolState; // Stridame 0 a 1 symboly 75 static unsigned char SymbolState; // Stridame 0 a 1 symboly
64   76  
65 static signed char InData; // Zde se strada pocet shod od dvojice symbolu 77 static signed char InData; // Zde se strada pocet shod od dvojice symbolu
66 static signed char InSuma; // Zde se prumeruji shody 78 static signed char InSuma; // Zde se prumeruji shody
67   79  
68 // Citac pulperiod symbolu 80 // Citac pulperiod symbolu
69 if(++SymbolLen>=(SYMBOL_LENGTH*2)) 81 if(++SymbolLen>=(SYMBOL_LENGTH*2))
70 { 82 {
71   83  
72 // Konec symbolu - zaciname citat pocet pulperiod od zacatku 84 // Konec symbolu - zaciname citat pocet pulperiod od zacatku
73 SymbolLen=0; 85 SymbolLen=0;
74   86  
75 // Cteme stav vstupu a porovnavame s ocekavanou hodnotou 87 // Cteme stav vstupu a porovnavame s ocekavanou hodnotou
76 // (1 na portu znamena tmu) 88 // (1 na portu znamena tmu)
77 if(((PINB & 0x10)>>4) ^ (SymbolState&1) ^ 1) 89 if(((PINB & 0x10)>>4) ^ (SymbolState&1) ^ 1)
78 InData++; 90 InData++;
79 else 91 else
80 InData--; 92 InData--;
81   93  
82 // Symboly 0 1 vyhodnocujeme po dvojicich 94 // Symboly 0 1 vyhodnocujeme po dvojicich
83 if(!SymbolState) 95 if(!SymbolState)
84 { 96 {
85 // Add Result 97 // Add Result
86 if (InData==2) 98 if (InData==2)
87 { 99 {
88 InSuma++; // Byla shoda u obou symbolu, zapocteme 100 InSuma++; // Byla shoda u obou symbolu, zapocteme
89 } 101 }
90 else 102 else
91 { 103 {
92 InSuma--; // Nebyla shoda u obou symbolu, odpocteme 104 InSuma--; // Nebyla shoda u obou symbolu, odpocteme
93 } 105 }
94   106  
95 // Jdeme na dalsi dvojici symbolu 107 // Jdeme na dalsi dvojici symbolu
96 InData=0; 108 InData=0;
97 } 109 }
98   110  
99 // Osetrime prubezny soucet tak, aby nepretekl 111 // Osetrime prubezny soucet tak, aby nepretekl
100 if(InSuma>SUMA_MAX) 112 if(InSuma>SUMA_MAX)
101 { 113 {
102 InSuma=SUMA_MAX; 114 InSuma=SUMA_MAX;
103 } 115 }
104 if(InSuma<-SUMA_MAX) 116 if(InSuma<-SUMA_MAX)
105 { 117 {
106 InSuma=-SUMA_MAX; 118 InSuma=-SUMA_MAX;
107 } 119 }
108   120  
109 // Vyhodnoceni prubezneho souctu 121 // Vyhodnoceni prubezneho souctu
110 if(InSuma>SUMA_ON) 122 if(InSuma>SUMA_ON)
111 { 123 {
112 PORTB |= 0x08; // Zapni vystup (je signal) 124 PORTB |= 0x08; // Zapni vystup (je signal)
113 } 125 }
114 if(InSuma<SUMA_OFF) 126 if(InSuma<SUMA_OFF)
115 { 127 {
116 PORTB &= ~0x08; // Vypni vystup (neni signal) 128 PORTB &= ~0x08; // Vypni vystup (neni signal)
117 } 129 }
118   130  
119 // Dalsi symbol 131 // Dalsi symbol
120 // Stridame 0 a 1 (tma a svetlo) 132 // Stridame 0 a 1 (tma a svetlo)
121 if(++SymbolState>=2) 133 if(++SymbolState>=2)
122 { 134 {
123 SymbolState=0; 135 SymbolState=0;
124 } 136 }
125   137  
126 // Generujeme svetlo a tmu (nastavenim casovace) 138 // Generujeme svetlo a tmu (nastavenim casovace)
127 if(SymbolState==0) 139 if(SymbolState==0)
128 { 140 {
129 TCCR0A = 0x12; // Blikej (svetlo) 141 TCCR0A = 0x12; // Blikej (svetlo)
130 } 142 }
131 else 143 else
132 { 144 {
133 TCCR0A = 0x22; // Tma (vystup casovace se jen nuluje) 145 TCCR0A = 0x22; // Tma (vystup casovace se jen nuluje)
134 } 146 }
135 } 147 }
136 } 148 }
137   149  
138 // Hlavni program 150 // Hlavni program
139 int main() 151 int main()
140 { 152 {
141 // Nastaveni prostredi behu 153 // Nastaveni prostredi behu
142 // ------------------------ 154 // ------------------------
143   155  
144 // Kompenzace vnitrniho RC oscilatoru 156 // Kompenzace vnitrniho RC oscilatoru
145 OSCCAL += CALIBRATION; 157 OSCCAL += CALIBRATION;
146   158  
147 // Nastav rezim casovace 159 // Nastav rezim casovace
148 // CTC Mod 160 // CTC Mod
149 // Toogle B 161 // Toogle B
150 // CLK x 1 162 // CLK x 1
151 TCCR0A = 0x12; 163 TCCR0A = 0x12;
152 TCCR0B = 0x01; 164 TCCR0B = 0x01;
153   165  
154 // Set frequency 166 // Set frequency
155 OCR0A = (F_CPU / IR_FREQUENCY) / 2 - 1; 167 OCR0A = (F_CPU / IR_FREQUENCY) / 2 - 1;
156 //OCR0B = 0; 168 //OCR0B = 0;
157   169  
158 // Nastav preruseni 170 // Nastav preruseni
159 TIMSK0 = 4; // Preruseni od kompare na A (citac proti registru OCR0A) 171 TIMSK0 = 4; // Preruseni od kompare na A (citac proti registru OCR0A)
160 //TIFR0 = 0; // Priznak preruseni se nuluje automaticky (HW) 172 //TIFR0 = 0; // Priznak preruseni se nuluje automaticky (HW)
161 sei(); // Povol globalni preruseni 173 sei(); // Povol globalni preruseni
162   174  
163 // Nastaveni vyvodu PB1 PB3 jako vystup 175 // Nastaveni vyvodu PB1 PB3 jako vystup
164 DDRB |=0x02; // PB1 vystup pro IR Led 176 DDRB |=0x02; // PB1 vystup pro IR Led
165 DDRB |=0x08; // PB3 vystup pro indikacni Led 177 DDRB |=0x08; // PB3 vystup pro indikacni Led
166   178  
167 // Hlavni program 179 // Hlavni program
168 // -------------- 180 // --------------
169 // Nedela nic, vsechno se dela v obsluze preruseni 181 // Nedela nic, vsechno se dela v obsluze preruseni
170 // od casovace. 182 // od casovace.
171   183  
172 for(;;); 184 for(;;);
173 } 185 }