Line 1... |
Line 1... |
1 |
#include "main.h" |
1 |
#include "main.h" |
2 |
|
2 |
|
3 |
// NEPOUZIVAT PINY B6 A B7, JSOU VYHRAZENY PRO SERIOVOU KOMUNIKACI |
3 |
// NEPOUZIVAT PINY B6 A B7, JSOU VYHRAZENY PRO SERIOVOU KOMUNIKACI |
4 |
// BAUD RATE = 9600 |
4 |
// BAUD RATE = 9600 |
5 |
|
- |
|
- |
|
5 |
// ========================== PRIPRAVA DAT A VYSTUPU =========================== |
6 |
// pomocne promenne |
6 |
// pomocne promenne |
7 |
#define LEFT 0 |
7 |
#define LEFT 0 |
8 |
#define RIGHT 1 |
8 |
#define RIGHT 1 |
9 |
// univerzalni LED diody |
9 |
// univerzalni LED diody |
10 |
#define LED1 PIN_E0 |
10 |
#define LED1 PIN_E0 |
Line 45... |
Line 45... |
45 |
int olsa_rseg[51]={0}; // prava cast radky (pixely 51 - 101) |
45 |
int olsa_rseg[51]={0}; // prava cast radky (pixely 51 - 101) |
46 |
int8 *lp; // ukazatel pro levou polovinu radky |
46 |
int8 *lp; // ukazatel pro levou polovinu radky |
47 |
int8 *rp; // ukazatel pro levou polovinu radky |
47 |
int8 *rp; // ukazatel pro levou polovinu radky |
48 |
|
48 |
|
49 |
int8 position; // ulozeni pozice cary |
49 |
int8 position; // ulozeni pozice cary |
- |
|
50 |
int8 old_position; // ulozeni predchozi pozice cary |
- |
|
51 |
int1 line_sector; // cara je vlevo/vpravo |
- |
|
52 |
int8 change; // zmena oproti predchozi poloze |
- |
|
53 |
int8 gap; // pocita, jak dlouho neni videt cara |
50 |
|
54 |
|
51 |
//naraznik |
- |
|
- |
|
55 |
// ================================= NARAZNIK ================================== |
52 |
#define BUMPL input(PIN_D6) |
56 |
#define BUMPL input(PIN_D6) |
53 |
#define BUMPR input(PIN_D7) |
57 |
#define BUMPR input(PIN_D7) |
54 |
|
58 |
|
55 |
//nouzove senzory |
59 |
// ============================= NOUZOVE SENZORY =============================== |
56 |
#define LINEL 0 |
60 |
#define LINEL 0 |
57 |
#define LINER 1 |
61 |
#define LINER 1 |
58 |
#define BLUE_LEV 200 // rozhodovaci uroven (zmereno 0 - cerna, 255 cerna) |
62 |
#define BLUE_LEV 200 // rozhodovaci uroven (zmereno 0 - cerna, 255 cerna) |
59 |
int8 line_l; |
63 |
int8 line_l; |
60 |
int8 line_r; |
64 |
int8 line_r; |
61 |
int1 line_sector; |
- |
|
62 |
|
65 |
|
63 |
// motory |
- |
|
- |
|
66 |
// ================================== MOTORY =================================== |
64 |
#define LMF PIN_D0 |
67 |
#define LMF PIN_D0 |
65 |
#define LMB PIN_D1 |
68 |
#define LMB PIN_D1 |
66 |
#define RMF PIN_D2 |
69 |
#define RMF PIN_D2 |
67 |
#define RMB PIN_D3 |
70 |
#define RMB PIN_D3 |
68 |
|
71 |
|
69 |
int8 lm_speed; |
72 |
int8 lm_speed; |
70 |
int8 rm_speed; |
73 |
int8 rm_speed; |
71 |
|
74 |
|
72 |
//PODPROGRAMY |
75 |
// =============================== PODPROGRAMY ================================= |
73 |
//SENZORY |
76 |
|
- |
|
77 |
// ================================= OLSA01A =================================== |
74 |
//OLSA01A |
78 |
|
75 |
void olsa_pulses(int count) // vytvori impulzy pro ridici logiku |
79 |
void olsa_pulses(int count) // vytvori impulzy pro ridici logiku |
76 |
{ |
80 |
{ |
77 |
int8 ct; |
81 |
int8 ct; |
78 |
for(ct=0;ct<=count;ct++) |
82 |
for(ct=0;ct<=count;ct++) |
79 |
{ |
83 |
{ |
Line 215... |
Line 219... |
215 |
protect_count=0; // pokud nasleduje bila, pocet cernych pixelu vynuluje |
219 |
protect_count=0; // pokud nasleduje bila, pocet cernych pixelu vynuluje |
216 |
} |
220 |
} |
217 |
if(protect_count>LINE_PX) // vidim caru |
221 |
if(protect_count>LINE_PX) // vidim caru |
218 |
{ |
222 |
{ |
219 |
position=searchp; // zapis presnou pozici |
223 |
position=searchp; // zapis presnou pozici |
220 |
line_sector=RIGHT; // cara je v leve polovine |
224 |
line_sector=LEFT; // cara je v leve polovine |
221 |
searchp=55; // ukonci hledani |
225 |
searchp=55; // ukonci hledani |
222 |
} |
226 |
} |
223 |
} |
227 |
} |
224 |
for(searchp=0;searchp<52;searchp++) // prohlizi pravou cast cary |
228 |
for(searchp=0;searchp<52;searchp++) // prohlizi pravou cast cary |
225 |
{ |
229 |
{ |
Line 239... |
Line 243... |
239 |
searchp=55; // ukonci hledani |
243 |
searchp=55; // ukonci hledani |
240 |
} |
244 |
} |
241 |
} |
245 |
} |
242 |
} |
246 |
} |
243 |
|
247 |
|
244 |
//ZACHRANNE SENZORY |
248 |
// ============================ ZACHRANNE SENZORY ============================== |
- |
|
249 |
|
245 |
void read_blue_sensors() // cteni nouzovych senzoru |
250 |
void read_blue_sensors() // cteni nouzovych senzoru |
246 |
{ |
251 |
{ |
247 |
set_adc_channel(LINEL); // cti levy nouzovy senzor |
252 |
set_adc_channel(LINEL); // cti levy nouzovy senzor |
248 |
delay_us(10); |
253 |
delay_us(10); |
249 |
line_l=read_adc(); |
254 |
line_l=read_adc(); |
250 |
set_adc_channel(LINER); // cti pravy nouzovy senzor |
255 |
set_adc_channel(LINER); // cti pravy nouzovy senzor |
251 |
delay_us(10); |
256 |
delay_us(10); |
252 |
line_r=read_adc(); |
257 |
line_r=read_adc(); |
253 |
} |
258 |
} |
254 |
|
259 |
|
- |
|
260 |
// ================================== PIPAK ==================================== |
255 |
//PIPAK |
261 |
|
256 |
void beep(int16 period,int16 length) |
262 |
void beep(int16 period,int16 length) |
257 |
{ |
263 |
{ |
258 |
int16 bp; // promenna pro nastaveni delky |
264 |
int16 bp; // promenna pro nastaveni delky |
259 |
for(bp=length;bp>0;bp--) // prepina vystupy tolikrat, jakou jsme zadali delku |
265 |
for(bp=length;bp>0;bp--) // prepina vystupy tolikrat, jakou jsme zadali delku |
260 |
{ |
266 |
{ |
Line 264... |
Line 270... |
264 |
output_high(SOUND_LO); |
270 |
output_high(SOUND_LO); |
265 |
output_low(SOUND_HI); |
271 |
output_low(SOUND_HI); |
266 |
delay_us(period); |
272 |
delay_us(period); |
267 |
} |
273 |
} |
268 |
} |
274 |
} |
- |
|
275 |
|
- |
|
276 |
// ================================== MOTORY =================================== |
269 |
//MOTORY |
277 |
|
270 |
void l_motor_fwd(int8 speedl) // levy motor dopredu |
278 |
void l_motor_fwd(int8 speedl) // levy motor dopredu |
271 |
{ |
279 |
{ |
272 |
output_high(LMF); |
280 |
output_high(LMF); |
273 |
output_low(LMB); |
281 |
output_low(LMB); |
274 |
set_pwm2_duty(speedl); |
282 |
set_pwm2_duty(speedl); |
Line 375... |
Line 383... |
375 |
r_motor_off(); |
383 |
r_motor_off(); |
376 |
printf("KONEC TESTU MOTORU\r\n"); |
384 |
printf("KONEC TESTU MOTORU\r\n"); |
377 |
delay_ms(1000); |
385 |
delay_ms(1000); |
378 |
} |
386 |
} |
379 |
|
387 |
|
- |
|
388 |
// ================================ DIAGNOSTIKA ================================ |
- |
|
389 |
|
380 |
void diag() // diagnostika - vypis senzoru s moznosti prepnuti na test motoru |
390 |
void diag() // diagnostika - vypis senzoru s moznosti prepnuti na test motoru |
381 |
{ |
391 |
{ |
382 |
read_blue_sensors(); |
392 |
read_blue_sensors(); |
383 |
read_olsa(); |
393 |
read_olsa(); |
384 |
olsa_position(); |
394 |
olsa_position(); |
Line 424... |
Line 434... |
424 |
} |
434 |
} |
425 |
} |
435 |
} |
426 |
} |
436 |
} |
427 |
} |
437 |
} |
428 |
|
438 |
|
429 |
// HLAVNI SMYCKA |
439 |
// ============================== HLAVNI SMYCKA ================================ |
- |
|
440 |
|
430 |
void main() |
441 |
void main() |
431 |
{ |
442 |
{ |
432 |
printf("POWER ON \r\n"); |
443 |
printf("POWER ON \r\n"); |
433 |
// NASTAVENI > provede se pouze pri zapnuti |
444 |
// NASTAVENI > provede se pouze pri zapnuti |
434 |
setup_adc_ports(sAN0-sAN1-sAN2); // aktivní analogové vstupy RA0, RA1 a RA2 |
445 |
setup_adc_ports(sAN0-sAN1-sAN2); // aktivní analogové vstupy RA0, RA1 a RA2 |
435 |
setup_adc(ADC_CLOCK_INTERNAL); // interni hodniny pro AD prevodnik |
446 |
setup_adc(ADC_CLOCK_INTERNAL); // interni hodniny pro AD prevodnik |
436 |
setup_spi(SPI_SS_DISABLED); |
447 |
setup_spi(SPI_SS_DISABLED); |
437 |
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); |
448 |
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); |
438 |
setup_timer_1(T1_DISABLED); |
449 |
setup_timer_1(T1_DISABLED); |
439 |
setup_timer_2(T2_DIV_BY_16,255,1); // casovac pro PWM |
450 |
setup_timer_2(T2_DIV_BY_16,255,1); // casovac pro PWM |
440 |
setup_ccp1(CCP_PWM); // povoli PWM na pinu RC2 |
451 |
setup_ccp1(CCP_PWM); // povoli PWM na pinu RC2 |
441 |
setup_ccp2(CCP_PWM); // povolí PWM na pinu RC1 |
452 |
setup_ccp2(CCP_PWM); // povolí PWM na pinu RC1 |
442 |
setup_comparator(NC_NC_NC_NC); |
453 |
setup_comparator(NC_NC_NC_NC); |
443 |
setup_vref(FALSE); |
454 |
setup_vref(FALSE); |
444 |
l_motor_off(); // vypne levy motor |
455 |
l_motor_off(); // vypne levy motor |
445 |
r_motor_off(); // vypne pravy motor |
456 |
r_motor_off(); // vypne pravy motor |
446 |
output_high(LED1); // zhasne LED1 |
457 |
output_high(LED1); // zhasne LED1 |
447 |
output_high(LED2); // zhasne LED2 |
458 |
output_high(LED2); // zhasne LED2 |
448 |
olsa_reset(); |
459 |
olsa_reset(); |
449 |
olsa_setup(); |
460 |
olsa_setup(); |
450 |
beep(100,500); // pipni pri startu |
461 |
beep(100,500); // pipni pri startu |
451 |
printf("OK! \r\n"); |
462 |
printf("OK! \r\n"); |
452 |
delay_ms(500); |
463 |
delay_ms(500); |
453 |
printf("VYBRAT MOD... \r\n"); |
464 |
printf("VYBRAT MOD... \r\n"); |
454 |
while(true) |
465 |
while(true) |
455 |
{ |
466 |
{ |
- |
|
467 |
// ============================ HLAVNI CAST PROGRAMU =========================== |
- |
|
468 |
if(true) // spusteni hledani pravym naraznikem |
- |
|
469 |
{ |
- |
|
470 |
beep(100,500); |
- |
|
471 |
while(true) |
- |
|
472 |
{ |
- |
|
473 |
// =============================== SLEDOVANI CARY ============================== |
- |
|
474 |
old_position=position; // zaznamena predhozi polohu cary |
456 |
read_olsa(); // precte a ulozi hodnoty z olsa |
475 |
read_olsa(); // precte a ulozi hodnoty z olsa |
457 |
olsa_position(); // vyhodnoti pozici cary |
476 |
olsa_position(); // vyhodnoti pozici cary |
458 |
read_blue_sensors(); // cte nouzove senzory |
477 |
read_blue_sensors(); // cte nouzove senzory |
- |
|
478 |
if(line_l==0) // robot najede na levy nouzovy senzor |
- |
|
479 |
{ |
- |
|
480 |
l_motor_bwd(255); // prudce zatoc doleva |
- |
|
481 |
r_motor_fwd(255); |
- |
|
482 |
line_sector=LEFT; // pamatuj, kde je cara |
- |
|
483 |
delay_ms(20); |
- |
|
484 |
} |
- |
|
485 |
if(line_r==0) // robot najede na pravy nouzovy senzor |
- |
|
486 |
{ |
- |
|
487 |
l_motor_fwd(255); // prudce zatoc doprava |
- |
|
488 |
r_motor_bwd(255); |
- |
|
489 |
line_sector=RIGHT; // pamatuj, kde je cara |
- |
|
490 |
delay_ms(20); |
- |
|
491 |
} |
- |
|
492 |
if(position>old_position) // pocita absolutni rozdil mezi soucasnou a predchozi pozici |
- |
|
493 |
{ |
- |
|
494 |
change=(position-old_position); // pozice ma vyssi cislo nez predchozi pozice |
- |
|
495 |
} |
- |
|
496 |
else |
- |
|
497 |
{ |
- |
|
498 |
change=(old_position-position); // pozice ma vyssi cislo nez predchozi pozice |
- |
|
499 |
} |
- |
|
500 |
if(position==0) // pokud neni videt cara |
- |
|
501 |
{ |
459 |
//printf("poloha: %u\r\n",position); // tiskne pozici - zakomentovat pro hledani |
502 |
position=old_position; // nastav predchozi pozici |
- |
|
503 |
gap++; // pocita, jak dlouho neni videt cara |
- |
|
504 |
} |
- |
|
505 |
else // pokud je videt cara |
- |
|
506 |
{ |
- |
|
507 |
gap=0; // vynuluje citani |
- |
|
508 |
} |
- |
|
509 |
} |
- |
|
510 |
} |
460 |
} |
511 |
} |
461 |
} |
512 |
} |
462 |
|
513 |
|
463 |
|
514 |
|