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 |
|