Rev Author Line No. Line
504 kaklik 1 #include ".\main.h"
2  
3 #define KOLMO1 225 // predni kolecko sroubem dopredu
4 #define KOLMO2 30 // predni kolecko je hlavou sroubu dozadu
5 #define STRED 128 // sredni poloha zataceciho kolecka
6 #define BEAR1 10//10 // 3 stupne zataceni
7 #define BEAR2 25//25
8 #define BEAR3 45//45
9 #define R 100 // Rozumna rychlost
10 #define R17 200 // X nasobek rozumne rychlosti
11 #define PRED_CIHLOU 100 // rychlost pri dalkove detekci cihly
12 //#define L1 1 // cara vlevo
13 #define L2 2 // cara vlevo
14 #define L3 3 // cara vlevo
15 #define S 0 // cara mezi sensory
16 //#define R1 -1 // cara vpravo
17 #define R2 -2 // cara vpravo
18 #define R3 -3 // cara vpravo
19  
20 // servo
21 #define SERVO PIN_B5
22  
23 // kroutitka
24 #define CERVENA 4 // AN4
25 //#define CERNA 5 // AN5
26 //#define ZELENA 6 // AN6
27 #define MODRA 2 // AN2
28  
29 // IR
30 #define IRTX PIN_B2
31 #define CIHLA PIN_A3
32  
33 //motory
34 #define FR output_low(PIN_A7); output_high(PIN_A6) // Vpred
35 #define FL output_low(PIN_A1); output_high(PIN_A0)
36 #define BR output_low(PIN_A6); output_high(PIN_A7) // Vzad
37 #define BL output_low(PIN_A0); output_high(PIN_A1)
38 #define STOPR output_low(PIN_A6);output_low(PIN_A7)
39 #define STOPL output_low(PIN_A0);output_low(PIN_A1)
40  
41 //HID
42 #define LED1 PIN_B1 //oranzova
43 #define LED2 PIN_B2 //zluta
44  
45 #define STROBE PIN_B0
46 //#define SW1 PIN_A2 // Motory On/off
47  
48 unsigned int8 sensors; // pomocna promenna pro cteni cidel na caru
49 signed int8 line = S; // na ktere strane byla detekovana cara
50 //unsigned int8 dira; // pocita dobu po kterou je ztracena cara
51 unsigned int8 uhel; // urcuje aktualni uhel zataceni
52 unsigned int8 speed; // maximalni povolena rychlost
53 unsigned int8 turn; // rychlost toceni
54 unsigned int8 rovinka; // pocitadlo na zjisteni rovinky
55  
56 signed int16 Lmotor; // promene, ktere urcuji velikost vykonu na levem
57 signed int16 Rmotor; // a pravem motoru
58  
59 // makro pro PWM pro motory
60 #define GO(motor, direction, power) if(get_timer0()<=power) \
61 {direction##motor;} else {stop##motor;}
62 ////////////////////////////////////////////////////////////////////////////////
63 #int_TIMER2
64 TIMER2_isr() // ovladani serva
65 {
66 unsigned int8 n;
67  
68 output_high(SERVO);
69 delay_us(1000);
70 for(n=uhel; n>0; n--) Delay_us(2);
71 output_low(SERVO);
72 }
73  
74 ////////////////////////////////////////////////////////////////////////////////
75 int8 IRcheck() // potvrdi detekci cihly
76 {
77 output_high(IRTX); // vypne vysilac IR
78 delay_ms(10);
79  
80 output_low(STROBE);
81 sensors = spi_read(0); // cteni senzoru
82 sensors=~sensors;
83 output_high(STROBE);
84  
85 if(bit_test(sensors,7)) // otestuje, jestli je stale detekovan IR signal
86 {
87 output_low(IRTX); // zapne vysilac IR
88 delay_ms(10);
89  
90 output_low(STROBE);
91 sensors = spi_read(0); // cteni senzoru
92 sensors=~sensors;
93 output_high(STROBE);
94  
95 if(!bit_test(sensors,7)) // otestuje, jestli je detekovana cihla
96 {
97 output_high(IRTX); // vypne vysilac IR
98 delay_ms(10);
99  
100 output_low(STROBE);
101 sensors = spi_read(0); // cteni senzoru
102 sensors=~sensors;
103 output_high(STROBE);
104  
105 output_low(IRTX); // zapne vysilac IR
106  
107 if(bit_test(sensors,7)) return 1; // vrat 1, kdyz je stale cihla
108 }
109 };
110 output_low(IRTX); // zapne vysilac IR
111 return 0; // vrat 0, kdyz je detekovano ruseni
112 }
113 ////////////////////////////////////////////////////////////////////////////////
114 #include ".\objizdka_centrovani.c"
115 ////////////////////////////////////////////////////////////////////////////////
116 void main()
117 {
118  
119 unsigned int8 n;
120 unsigned int8 i,j;
121 unsigned int8 last_sensors;
122 unsigned int8 RozumnaRychlost;
123  
124 setup_adc_ports(sAN5|sAN2|sAN4|sAN6|VSS_VDD); // AD pro kroutitka
125 setup_adc(ADC_CLOCK_INTERNAL);
126 setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_XMIT_L_TO_H|SPI_CLK_DIV_16);
127 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
128 setup_timer_1(T1_DISABLED|T1_DIV_BY_8);
129 setup_timer_2(T2_DIV_BY_16,140,16);
130 setup_oscillator(OSC_8MHZ|OSC_INTRC);
131  
132 STOPR; STOPL; // zastav motory
133 Lmotor=0;Rmotor=0;
134  
135 uhel = STRED; // nastav zadni kolecko na stred
136 rovinka = 0;
137  
138 enable_interrupts(INT_TIMER2);
139 enable_interrupts(GLOBAL);
140  
141 output_low(IRTX); // zapni IR vysilac
142  
143 delay_ms(2000); // musime pockat na diagnostiku slave CPU
144  
145 //nastaveni rychlosti
146 set_adc_channel(CERVENA);
147  
148 Delay_ms(1);
149 RozumnaRychlost=R+(read_adc()>>2); // rychlost rovne +63; kroutitko dava 0-63
150 set_adc_channel(MODRA);
151 Delay_ms(1);
152 turn=speed-32+(read_adc()>>2); // rychlost toceni +-32; kroutitko dava 0-63
153  
154 speed=R17;
155  
156 while(true)
157 {
158  
159 GO(L,F,Lmotor);GO(R,F,Rmotor); // zapni motory PWM podle promenych Lmotor a Rmotor
160  
161 delay_us(2000); // cekani na SLAVE, nez pripravi data od cidel
162  
163 last_sensors=sensors;
164  
165 output_low(STROBE); // vypni zobrazovani na posuvnem registru
166 sensors = spi_read(0); // cteni senzoru
167 sensors=~sensors; // neguj prijata data
168 output_high(STROBE); // zobraz data na posuvnem registru
169  
170 i=0; // havarijni kod
171 for (n=0; n<=6; n++)
172 {
173 if(bit_test(sensors,n)) i++;
174 }
175 if (i>4) // zastavi, kdyz je cerno pod vice nez tremi cidly
176 {
177 BL; BR;
178 delay_ms(300);
179 STOPR; STOPL;
180 While(true);
181 };
182  
183 /*
184 if (!input(CIHLA)) // dalkova detekce cihly
185 {
186 speed=PRED_CIHLOU;
187 }
188 else
189 {
190 speed=RozumnaRychlost;
191 }
192 */
193 if (bit_test(sensors,7)) // detekce cihly
194 {
195 BR;BL;
196 Delay_ms(400);
197 STOPR;STOPL;
198 // if (1==IRcheck()) // kontrola, jestli nebylo rusene cidlo
199 {
200 Delay_ms(100);
201 cikcak();
202 delay_ms(100);
203 objizdka(); // objede cihlu
204 }
205 }
206  
207 if (speed > RozumnaRychlost) speed--; // postupne zpomaleni na Roz. Rychl.
208  
209 if(bit_test(sensors,3)) //...|...//
210 {
211 uhel=STRED;
212 Lmotor=speed;
213 Rmotor=speed;
214 line=S;
215 if (rovinka < 255) rovinka++;
216 continue;
217 }
218  
219 if(bit_test(sensors,0)) //|......// // z duvodu zkraceni doby reakce se cidla nevyhodnocuji poporade ale od krajnich k prostrednimu
220 {
221 uhel=STRED - BEAR3;
222 Lmotor=0;
223 Rmotor=turn;
224 line=L3;
225 continue;
226 }
227  
228 if(bit_test(sensors,6)) //......|//
229 {
230 uhel=STRED + BEAR3;
231 Rmotor=0;
232 Lmotor=turn;
233 line=R3;
234 continue;
235 }
236  
237 if(bit_test(sensors,1)) //.|.....//
238 {
239 uhel=STRED - BEAR2;
240 Lmotor=speed-70;
241 Rmotor=speed;
242 line=L2;
243 continue;
244 }
245  
246 if(bit_test(sensors,5)) //.....|.//
247 {
248 uhel=STRED + BEAR2;
249 Rmotor=speed-70;
250 Lmotor=speed;
251 line=R2;
252 continue;
253 }
254  
255 if (bit_test(sensors,2)) //..|....//
256 {
257 uhel=STRED - BEAR1;
258 Lmotor=speed-20;
259 Rmotor=speed;
260 line=L2;
261 if (rovinka<255) rovinka++;
262 continue;
263 }
264  
265 if (bit_test(sensors,4)) //....|..//
266 {
267 uhel=STRED + BEAR1;
268 Rmotor=speed-20;
269 Lmotor=speed;
270 line=L2;
271 if (rovinka<255) rovinka++;
272 continue;
273 }
274  
275  
276 if ((L3==line) || (R3==line)) // Brzdeni pri vyjeti z trate
277 {
278 if (rovinka>50)
279 {
280 BL; BR;
281 Delay_ms(100);
282 if (rovinka > 250 || speed > 170) delay_ms(50);
283 };
284 rovinka=0;
285 speed=R17;
286 };
287 }
288 }