Rev 843 Rev 865
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