| 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 |
|
| - |
|
6 |
// pomocne promenne |
| - |
|
7 |
#define LEFT 0 |
| - |
|
8 |
#define RIGHT 1 |
| 6 |
// univerzalni LED diody |
9 |
// univerzalni LED diody |
| 7 |
#define LED1 PIN_E0 |
10 |
#define LED1 PIN_E0 |
| 8 |
#define LED2 PIN_E1 |
11 |
#define LED2 PIN_E1 |
| 9 |
|
12 |
|
| 10 |
// piezo pipak |
13 |
// piezo pipak |
| Line 14... |
Line 17... |
| 14 |
// radkovy senzor |
17 |
// radkovy senzor |
| 15 |
#define SDIN PIN_D4 // seriovy vstup |
18 |
#define SDIN PIN_D4 // seriovy vstup |
| 16 |
#define SDOUT input(PIN_C5) // seriovy vystup |
19 |
#define SDOUT input(PIN_C5) // seriovy vystup |
| 17 |
#define SCLK PIN_D5 // takt |
20 |
#define SCLK PIN_D5 // takt |
| 18 |
|
21 |
|
| - |
|
22 |
#define LINE_PX 5 // pocet pixelu pro jiste urceni cary |
| 19 |
#define OLSA_LEV 10 // rozhodovaci uroven (cca 10 odpovida cerne) |
23 |
#define OLSA_LEV 100 // rozhodovaci uroven (cca 10 odpovida cerne) |
| 20 |
|
24 |
|
| 21 |
// pro komunikaci s OLSA, prvni se posila LSB |
25 |
// pro komunikaci s OLSA, prvni se posila LSB |
| 22 |
int main_reset[8]={1,1,0,1,1,0,0,0}; // hlavni reset 0x1B |
26 |
int main_reset[8]={1,1,0,1,1,0,0,0}; // hlavni reset 0x1B |
| 23 |
int set_mode_rg[8]={1,1,1,1,1,0,1,0}; // zapis do MODE registru 0x5F |
27 |
int set_mode_rg[8]={1,1,1,1,1,0,1,0}; // zapis do MODE registru 0x5F |
| 24 |
int clear_mode_rg[8]={0,0,0,0,0,0,0,0}; // nulovani MODE registru 0x00 |
28 |
int clear_mode_rg[8]={0,0,0,0,0,0,0,0}; // nulovani MODE registru 0x00 |
| Line 203... |
Line 207... |
| 203 |
} |
207 |
} |
| 204 |
|
208 |
|
| 205 |
//PIPAK |
209 |
//PIPAK |
| 206 |
void beep(int16 period,int16 length) |
210 |
void beep(int16 period,int16 length) |
| 207 |
{ |
211 |
{ |
| 208 |
int16 bp; //promenna pro nastaveni delky |
212 |
int16 bp; // promenna pro nastaveni delky |
| 209 |
for(bp=length;bp>0;bp--) |
213 |
for(bp=length;bp>0;bp--) // prepina vystupy tolikrat, jakou jsme zadali delku |
| 210 |
{ |
214 |
{ |
| 211 |
output_high(SOUND_HI); |
215 |
output_high(SOUND_HI); |
| 212 |
output_low(SOUND_LO); |
216 |
output_low(SOUND_LO); |
| 213 |
delay_us(period); |
217 |
delay_us(period); |
| 214 |
output_high(SOUND_LO); |
218 |
output_high(SOUND_LO); |
| Line 338... |
Line 342... |
| 338 |
delay_ms(10); |
342 |
delay_ms(10); |
| 339 |
printf("P_NARAZ: %u \r\n",BUMPR); |
343 |
printf("P_NARAZ: %u \r\n",BUMPR); |
| 340 |
delay_ms(10); |
344 |
delay_ms(10); |
| 341 |
if(BUMPL&&BUMPR) // po zmacknuti stran narazniku spusti test motoru |
345 |
if(BUMPL&&BUMPR) // po zmacknuti stran narazniku spusti test motoru |
| 342 |
{ |
346 |
{ |
| 343 |
beep(100,200); |
347 |
beep(100,200); |
| - |
|
348 |
delay_ms(500); |
| 344 |
printf("Levy naraznik - test OLSA\r\n"); |
349 |
printf("Levy naraznik - test OLSA\r\n"); |
| 345 |
printf("Pravy naraznik - test motoru\r\n"); |
350 |
printf("Pravy naraznik - test motoru\r\n"); |
| 346 |
while(true) |
351 |
delay_ms(500); |
| 347 |
{ |
- |
|
| 348 |
if(BUMPR) |
352 |
if(BUMPR) |
| - |
|
353 |
{ |
| - |
|
354 |
motor_test(); |
| - |
|
355 |
} |
| - |
|
356 |
if(BUMPL) |
| - |
|
357 |
{ |
| - |
|
358 |
beep(100,200); |
| - |
|
359 |
printf("TEST OLSA\r\n"); |
| - |
|
360 |
while(true) |
| 349 |
{ |
361 |
{ |
| 350 |
motor_test(); |
362 |
int8 tisk; |
| 351 |
} |
- |
|
| 352 |
if(BUMPL) |
363 |
int8 *tiskp; |
| 353 |
{ |
- |
|
| 354 |
beep(100,200); |
364 |
read_olsa(); |
| 355 |
printf("TEST OLSA\r\n"); |
365 |
printf("cteni\r\n"); // po precteni vsech pixelu odradkuje |
| 356 |
while(true) |
366 |
for(tiskp=0;tiskp<52;tiskp++) // tisk leve casti radky |
| 357 |
{ |
367 |
{ |
| 358 |
int8 tisk; |
- |
|
| 359 |
int8 *tiskp; |
- |
|
| 360 |
read_olsa(); |
- |
|
| 361 |
printf("cteni\r\n"); // po precteni vsech pixelu odradkuje |
- |
|
| 362 |
for(tiskp=0;tiskp<52;tiskp++) // tisk leve casti radky |
- |
|
| 363 |
{ |
- |
|
| 364 |
tisk=olsa_lseg[tiskp]; |
368 |
tisk=olsa_lseg[tiskp]; |
| 365 |
printf("%x ",tisk); |
369 |
printf("%x ",tisk); |
| 366 |
} |
370 |
} |
| 367 |
for(tiskp=0;tiskp<52;tiskp++) // tisk prave casti radky |
371 |
for(tiskp=0;tiskp<52;tiskp++) // tisk prave casti radky |
| 368 |
{ |
372 |
{ |
| 369 |
tisk=olsa_rseg[tiskp]; |
373 |
tisk=olsa_rseg[tiskp]; |
| 370 |
printf("%x ",tisk); |
374 |
printf("%x ",tisk); |
| 371 |
} |
375 |
} |
| 372 |
} |
376 |
} |
| 373 |
} |
377 |
} |
| 374 |
} |
378 |
} |
| 375 |
} |
- |
|
| 376 |
} |
379 |
} |
| 377 |
|
380 |
|
| 378 |
// HLAVNI SMYCKA |
381 |
// HLAVNI SMYCKA |
| 379 |
void main() |
382 |
void main() |
| 380 |
{ |
383 |
{ |
| 381 |
printf("POWER ON \r\n"); |
384 |
printf("POWER ON \r\n"); |
| 382 |
// NASTAVENI > provede se pouze pri zapnuti |
385 |
// NASTAVENI > provede se pouze pri zapnuti |
| 383 |
setup_adc_ports(sAN0-sAN1-sAN2); |
386 |
setup_adc_ports(sAN0-sAN1-sAN2); // aktivní analogové vstupy RA0, RA1 a RA2 |
| 384 |
setup_adc(ADC_CLOCK_INTERNAL); // interni hodniny pro AD prevodnik |
387 |
setup_adc(ADC_CLOCK_INTERNAL); // interni hodniny pro AD prevodnik |
| 385 |
setup_spi(SPI_SS_DISABLED); |
388 |
setup_spi(SPI_SS_DISABLED); |
| 386 |
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); |
389 |
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); |
| 387 |
setup_timer_1(T1_DISABLED); |
390 |
setup_timer_1(T1_DISABLED); |
| 388 |
setup_timer_2(T2_DIV_BY_16,255,1); // casovac pro PWM |
391 |
setup_timer_2(T2_DIV_BY_16,255,1); // casovac pro PWM |
| Line 399... |
Line 402... |
| 399 |
beep(500,200); // pipni pri startu |
402 |
beep(500,200); // pipni pri startu |
| 400 |
printf("OK! \r\n"); |
403 |
printf("OK! \r\n"); |
| 401 |
delay_ms(500); |
404 |
delay_ms(500); |
| 402 |
printf("VYBRAT MOD... \r\n"); |
405 |
printf("VYBRAT MOD... \r\n"); |
| 403 |
while(true) |
406 |
while(true) |
| 404 |
{ |
407 |
{ |
| 405 |
read_olsa(); |
408 |
read_olsa(); |
| - |
|
409 |
int8 searchp; // ukazatel na pole |
| - |
|
410 |
int8 search; // ulozeni prectene hodnoty |
| - |
|
411 |
int1 segment; // cara je vlevo nebo vpravo |
| - |
|
412 |
int8 position; // ulozeni pozice cary |
| - |
|
413 |
int8 protect_count; // opravdu vidime caru |
| - |
|
414 |
|
| - |
|
415 |
for(searchp=0;searchp<52;searchp++) // prohlizi levou cast cary |
| - |
|
416 |
{ |
| - |
|
417 |
search=olsa_lseg[searchp]; // vybira pixel |
| - |
|
418 |
if(search<=OLSA_LEV) // cerna nebo bila? |
| - |
|
419 |
{ |
| - |
|
420 |
protect_count++; // pokud nasleduje cerna, pricte 1 k poctu cernych pixelu |
| - |
|
421 |
} |
| - |
|
422 |
else |
| - |
|
423 |
{ |
| - |
|
424 |
protect_count=0; // pokud nasleduje bila, pocet cernych pixelu vynuluje |
| - |
|
425 |
} |
| - |
|
426 |
if(protect_count>LINE_PX) // vidim caru |
| - |
|
427 |
{ |
| - |
|
428 |
position=searchp; // zapis presnou pozici |
| - |
|
429 |
segment=LEFT; // cara je v leve polovine |
| - |
|
430 |
searchp=52; |
| - |
|
431 |
} |
| - |
|
432 |
} |
| - |
|
433 |
for(searchp=0;searchp<52;searchp++) // prohlizi pravou cast cary |
| - |
|
434 |
{ |
| - |
|
435 |
search=olsa_rseg[searchp]; // vybira pixel |
| - |
|
436 |
if(search<=OLSA_LEV) |
| - |
|
437 |
{ |
| - |
|
438 |
protect_count++; // pokud nasleduje cerna, pricte 1 k poctu cernych pixelu |
| - |
|
439 |
} |
| - |
|
440 |
else |
| - |
|
441 |
{ |
| - |
|
442 |
protect_count=0; // pokud nasleduje bila, pocet cernych pixelu vynuluje |
| - |
|
443 |
} |
| - |
|
444 |
if(protect_count>LINE_PX) // vidim caru |
| - |
|
445 |
{ |
| - |
|
446 |
position=(searchp+51); // zapis presnou pozici |
| - |
|
447 |
segment=RIGHT; // cara je v prave polovine |
| - |
|
448 |
searchp=52; |
| - |
|
449 |
} |
| - |
|
450 |
} |
| - |
|
451 |
printf("poloha: %u\r\n",position); |
| - |
|
452 |
position=0; |
| 406 |
} |
453 |
} |
| 407 |
} |
454 |
} |
| - |
|
455 |
|