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