| 799 | 
        cizelu | 
        1 | 
        #include "main.h" | 
      
      
        | 842 | 
        cizelu | 
        2 | 
          | 
      
      
        | 708 | 
        cizelu | 
        3 | 
        // NEPOUZIVAT PINY B6 A B7, JSOU VYHRAZENY PRO SERIOVOU KOMUNIKACI | 
      
      
        | 842 | 
        cizelu | 
        4 | 
        // BAUD RATE = 9600 | 
      
      
        | 873 | 
        cizelu | 
        5 | 
        // ========================== PRIPRAVA DAT A VYSTUPU =========================== | 
      
      
        | 874 | 
        cizelu | 
        6 | 
        // pomocne konstanty | 
      
      
        | 865 | 
        cizelu | 
        7 | 
        #define  LEFT  0 | 
      
      
         | 
         | 
        8 | 
        #define  RIGHT 1 | 
      
      
        | 874 | 
        cizelu | 
        9 | 
          | 
      
      
        | 901 | 
        cizelu | 
        10 | 
        // regulator | 
      
      
        | 919 | 
        cizelu | 
        11 | 
        #define  CONP  2                          // konstanta pro proporcionalni regulator (2) | 
      
      
         | 
         | 
        12 | 
        #define  CONI  45                         // konstanta pro integracni regulator *0,01  (45) | 
      
      
         | 
         | 
        13 | 
        #define  COND  20                         // konstanta pro derivacni regulator *0,01   (20) | 
      
      
        | 874 | 
        cizelu | 
        14 | 
          | 
      
      
        | 919 | 
        cizelu | 
        15 | 
        #define  SPD_LO   130                     // zaklad pro vypocet rychlosti pomalejsiho motoru (130) | 
      
      
         | 
         | 
        16 | 
        #define  SPD_HI   155                     // zaklad pro vypocetrychlosti rychlejsiho motoru  (155) | 
      
      
         | 
         | 
        17 | 
        #define  SPD_MAX  240                     // rychlost po rovince  (240) | 
      
      
        | 912 | 
        cizelu | 
        18 | 
          | 
      
      
        | 901 | 
        cizelu | 
        19 | 
        int8 reg_out; | 
      
      
         | 
         | 
        20 | 
        int8 err1;                                // odchylka prvni hodnoty | 
      
      
         | 
         | 
        21 | 
        int8 err2;                                 | 
      
      
         | 
         | 
        22 | 
        int8 err3; | 
      
      
         | 
         | 
        23 | 
        int8 err4; | 
      
      
         | 
         | 
        24 | 
        int8 err5;                                // odchylka posledni hodnoty | 
      
      
         | 
         | 
        25 | 
        int8 errp;                                // prumer chyb | 
      
      
        | 874 | 
        cizelu | 
        26 | 
          | 
      
      
        | 901 | 
        cizelu | 
        27 | 
        // mezera | 
      
      
        | 919 | 
        cizelu | 
        28 | 
        #define SPACE  8                          // jak dlouho robot smi nic nevidet (8) | 
      
      
        | 901 | 
        cizelu | 
        29 | 
          | 
      
      
        | 842 | 
        cizelu | 
        30 | 
        // univerzalni LED diody | 
      
      
        | 912 | 
        cizelu | 
        31 | 
        #define  LED1     PIN_E1 | 
      
      
         | 
         | 
        32 | 
        #define  LED2     PIN_E0 | 
      
      
        | 700 | 
        cizelu | 
        33 | 
          | 
      
      
        | 912 | 
        cizelu | 
        34 | 
        int16 blink; | 
      
      
         | 
         | 
        35 | 
          | 
      
      
        | 842 | 
        cizelu | 
        36 | 
        // piezo pipak | 
      
      
        | 716 | 
        cizelu | 
        37 | 
        #DEFINE SOUND_HI   PIN_B4 | 
      
      
         | 
         | 
        38 | 
        #DEFINE SOUND_LO   PIN_B5 | 
      
      
        | 700 | 
        cizelu | 
        39 | 
          | 
      
      
        | 842 | 
        cizelu | 
        40 | 
        // radkovy senzor | 
      
      
        | 745 | 
        cizelu | 
        41 | 
        #define  SDIN     PIN_D4                  // seriovy vstup | 
      
      
        | 830 | 
        cizelu | 
        42 | 
        #define  SDOUT    input(PIN_C5)           // seriovy vystup | 
      
      
        | 745 | 
        cizelu | 
        43 | 
        #define  SCLK     PIN_D5                  // takt | 
      
      
        | 727 | 
        cizelu | 
        44 | 
          | 
      
      
        | 919 | 
        cizelu | 
        45 | 
        #define  LINE_PX  4                       // pocet pixelu pro jiste urceni cary  (4) | 
      
      
         | 
         | 
        46 | 
        #define  OLSA_LEV 0x10                    // rozhodovaci uroven (cca 10 odpovida cerne)   (0x10 nebo 0x60) | 
      
      
        | 840 | 
        cizelu | 
        47 | 
          | 
      
      
        | 842 | 
        cizelu | 
        48 | 
        // pro komunikaci s OLSA, prvni se posila LSB | 
      
      
        | 919 | 
        cizelu | 
        49 | 
        int MAIN_RESET[8]={1,1,0,1,1,0,0,0};      // hlavni reset 0x1B | 
      
      
         | 
         | 
        50 | 
        int SET_MODE_RG[8]={1,1,1,1,1,0,1,0};     // zapis do MODE registru 0x5F | 
      
      
         | 
         | 
        51 | 
        int CLEAR_MODE_RG[8]={0,0,0,0,0,0,0,0};   // nulovani MODE registru 0x00 | 
      
      
        | 730 | 
        cizelu | 
        52 | 
          | 
      
      
        | 919 | 
        cizelu | 
        53 | 
        int LEFT_OFFSET[8]={0,0,0,0,0,0,1,0};     // offset leveho segmentu senzoru 0x40 | 
      
      
         | 
         | 
        54 | 
        int MID_OFFSET[8]={0,1,0,0,0,0,1,0};      // offset prostredniho segmentu senzoru 0x42 | 
      
      
         | 
         | 
        55 | 
        int RIGHT_OFFSET[8]={0,0,1,0,0,0,1,0};    // offset praveho segmentu senzoru 0x44 | 
      
      
         | 
         | 
        56 | 
        int OFFSET[8]={1,0,0,0,0,0,0,1};          // minus jedna - pouzit pro vsechny segmenty 0x81 | 
      
      
        | 741 | 
        cizelu | 
        57 | 
          | 
      
      
        | 919 | 
        cizelu | 
        58 | 
        int LEFT_GAIN[8]={1,0,0,0,0,0,1,0};       // zisk leveho segmentu 0x41 | 
      
      
         | 
         | 
        59 | 
        int MID_GAIN[8]={1,1,0,0,0,0,1,0};        // zisk leveho segmentu 0x43 | 
      
      
         | 
         | 
        60 | 
        int RIGHT_GAIN[8]={1,0,1,0,0,0,1,0};      // zisk leveho segmentu 0x45 | 
      
      
         | 
         | 
        61 | 
        int GAIN[8]={1,0,1,0,0,0,0,0};            // zisk = 5 - pouzit pro vsechny segmenty 0x5 | 
      
      
        | 771 | 
        kaklik | 
        62 | 
          | 
      
      
        | 919 | 
        cizelu | 
        63 | 
        int START_INT[8]={0,0,0,1,0,0,0,0};       // zacatek integrace 0x08 | 
      
      
         | 
         | 
        64 | 
        int STOP_INT[8]={0,0,0,0,1,0,0,0};        // konec integrace 0x10 | 
      
      
         | 
         | 
        65 | 
        int READOUT[8]={0,1,0,0,0,0,0,0};         // cteni senzoru 0x02 | 
      
      
        | 789 | 
        cizelu | 
        66 | 
          | 
      
      
        | 829 | 
        cizelu | 
        67 | 
        int olsa_lseg[51]={0};                    // leva cast radky (pixely 0 - 50) | 
      
      
         | 
         | 
        68 | 
        int olsa_rseg[51]={0};                    // prava cast radky (pixely 51 - 101) | 
      
      
        | 837 | 
        cizelu | 
        69 | 
        int8  *lp;                                // ukazatel pro levou polovinu radky | 
      
      
         | 
         | 
        70 | 
        int8  *rp;                                // ukazatel pro levou polovinu radky | 
      
      
        | 812 | 
        cizelu | 
        71 | 
          | 
      
      
        | 870 | 
        cizelu | 
        72 | 
        int8  position;                           // ulozeni pozice cary | 
      
      
        | 873 | 
        cizelu | 
        73 | 
        int8  old_position;                       // ulozeni predchozi pozice cary | 
      
      
         | 
         | 
        74 | 
        int1  line_sector;                        // cara je vlevo/vpravo | 
      
      
         | 
         | 
        75 | 
        int8  gap;                                // pocita, jak dlouho neni videt cara | 
      
      
        | 870 | 
        cizelu | 
        76 | 
          | 
      
      
        | 873 | 
        cizelu | 
        77 | 
        // ================================= NARAZNIK ================================== | 
      
      
        | 708 | 
        cizelu | 
        78 | 
        #define  BUMPL    input(PIN_D6) | 
      
      
         | 
         | 
        79 | 
        #define  BUMPR    input(PIN_D7) | 
      
      
        | 700 | 
        cizelu | 
        80 | 
          | 
      
      
        | 873 | 
        cizelu | 
        81 | 
        // ============================= NOUZOVE SENZORY =============================== | 
      
      
        | 919 | 
        cizelu | 
        82 | 
        #define  LINEL    0                       // analogovy kanal pro levy senzor | 
      
      
         | 
         | 
        83 | 
        #define  LINER    1                       // analogovy kanal pro pravy senzor | 
      
      
        | 920 | 
        cizelu | 
        84 | 
        #define  WHITE 100                        // rozhodovaci uroven pro nouzove senzory | 
      
      
         | 
         | 
        85 | 
          | 
      
      
        | 919 | 
        cizelu | 
        86 | 
        int8  line_l;                             // uklada hodnotu leveho senzoru | 
      
      
         | 
         | 
        87 | 
        int8  line_r;                             // uklada hodnotu praveho senzoru | 
      
      
        | 700 | 
        cizelu | 
        88 | 
          | 
      
      
        | 919 | 
        cizelu | 
        89 | 
        // ================================ DALKOMER =================================== | 
      
      
         | 
         | 
        90 | 
        #define  SHARP    2                       // analogovy kanal pro SHARP | 
      
      
        | 920 | 
        cizelu | 
        91 | 
        #define  PROBLEM  40                      // rozhodovaci uroven, kdy hrozi prekazka | 
      
      
         | 
         | 
        92 | 
        #define  BLOCK    70                      // rozhodovaci uroven, kdy je jiste prekazka | 
      
      
         | 
         | 
        93 | 
        #define  DANGER   200                     // je urcite prekazka? | 
      
      
        | 919 | 
        cizelu | 
        94 | 
          | 
      
      
        | 920 | 
        cizelu | 
        95 | 
        int8  p_count; | 
      
      
        | 919 | 
        cizelu | 
        96 | 
        int8  sharp_lev;                          // uklada hodnotu sharp | 
      
      
         | 
         | 
        97 | 
          | 
      
      
        | 873 | 
        cizelu | 
        98 | 
        // ================================== MOTORY =================================== | 
      
      
        | 708 | 
        cizelu | 
        99 | 
        #define  LMF   PIN_D0 | 
      
      
         | 
         | 
        100 | 
        #define  LMB   PIN_D1 | 
      
      
         | 
         | 
        101 | 
        #define  RMF   PIN_D2 | 
      
      
         | 
         | 
        102 | 
        #define  RMB   PIN_D3 | 
      
      
        | 842 | 
        cizelu | 
        103 | 
          | 
      
      
        | 901 | 
        cizelu | 
        104 | 
        int8  lm_speed;                           // rychlost leveho motoru | 
      
      
         | 
         | 
        105 | 
        int8  rm_speed;                           // rychlost praveho motoru | 
      
      
        | 790 | 
        cizelu | 
        106 | 
          | 
      
      
        | 873 | 
        cizelu | 
        107 | 
        // =============================== PODPROGRAMY ================================= | 
      
      
         | 
         | 
        108 | 
          | 
      
      
         | 
         | 
        109 | 
        // ================================= OLSA01A =================================== | 
      
      
         | 
         | 
        110 | 
          | 
      
      
        | 870 | 
        cizelu | 
        111 | 
        void  olsa_pulses(int count)              // vytvori impulzy pro ridici logiku | 
      
      
        | 829 | 
        cizelu | 
        112 | 
        { | 
      
      
        | 741 | 
        cizelu | 
        113 | 
           int8 ct; | 
      
      
         | 
         | 
        114 | 
           for(ct=0;ct<=count;ct++) | 
      
      
        | 829 | 
        cizelu | 
        115 | 
           { | 
      
      
        | 730 | 
        cizelu | 
        116 | 
              output_high(SCLK); | 
      
      
         | 
         | 
        117 | 
              output_low(SCLK); | 
      
      
        | 829 | 
        cizelu | 
        118 | 
           } | 
      
      
         | 
         | 
        119 | 
        }  | 
      
      
        | 730 | 
        cizelu | 
        120 | 
          | 
      
      
        | 870 | 
        cizelu | 
        121 | 
        void olsa_pulse()                         // vytvori jeden impulz | 
      
      
        | 829 | 
        cizelu | 
        122 | 
        { | 
      
      
        | 741 | 
        cizelu | 
        123 | 
           output_high(SCLK); | 
      
      
         | 
         | 
        124 | 
           output_low(SCLK); | 
      
      
        | 829 | 
        cizelu | 
        125 | 
        } | 
      
      
        | 741 | 
        cizelu | 
        126 | 
          | 
      
      
        | 870 | 
        cizelu | 
        127 | 
        void olsa_send(int8 info[8])              // USART komunikace s modulem OLSA01A - poslani zpravy | 
      
      
        | 829 | 
        cizelu | 
        128 | 
        { | 
      
      
        | 870 | 
        cizelu | 
        129 | 
           int *ip;                               // ukazatel na pole s informaci | 
      
      
         | 
         | 
        130 | 
           int8 i;                                // pomocna promenna pro nastaveni 0 nebo 1 na SDIN | 
      
      
         | 
         | 
        131 | 
           output_low(SDIN);                      // start bit | 
      
      
        | 741 | 
        cizelu | 
        132 | 
           olsa_pulse(); | 
      
      
        | 870 | 
        cizelu | 
        133 | 
           for(ip=0;ip<8;ip++)                    // predani informace - 8 bit, LSB prvni > MSB posledni | 
      
      
        | 829 | 
        cizelu | 
        134 | 
           { | 
      
      
        | 870 | 
        cizelu | 
        135 | 
              i=info[ip];                         // ziskani hodnoty z pole | 
      
      
         | 
         | 
        136 | 
              if(i==1)                            // vyhodnoceni obsahu informace - nastav 1 | 
      
      
        | 829 | 
        cizelu | 
        137 | 
              { | 
      
      
        | 730 | 
        cizelu | 
        138 | 
                 output_high(SDIN); | 
      
      
        | 829 | 
        cizelu | 
        139 | 
              } | 
      
      
        | 870 | 
        cizelu | 
        140 | 
              else                                // vyhodnoceni obsahu informace - nastav 0 | 
      
      
        | 829 | 
        cizelu | 
        141 | 
              { | 
      
      
        | 730 | 
        cizelu | 
        142 | 
                 output_low(SDIN); | 
      
      
        | 829 | 
        cizelu | 
        143 | 
              } | 
      
      
        | 741 | 
        cizelu | 
        144 | 
              olsa_pulse();    | 
      
      
        | 829 | 
        cizelu | 
        145 | 
           } | 
      
      
        | 870 | 
        cizelu | 
        146 | 
           output_high(SDIN);                     // stop bit | 
      
      
        | 741 | 
        cizelu | 
        147 | 
           olsa_pulse(); | 
      
      
        | 829 | 
        cizelu | 
        148 | 
        } | 
      
      
        | 730 | 
        cizelu | 
        149 | 
          | 
      
      
        | 870 | 
        cizelu | 
        150 | 
        void olsa_reset()                         // hlavni RESET - provadi se po zapnuti | 
      
      
        | 829 | 
        cizelu | 
        151 | 
        { | 
      
      
        | 741 | 
        cizelu | 
        152 | 
           output_low(SDIN); | 
      
      
         | 
         | 
        153 | 
           output_low(SCLK); | 
      
      
        | 870 | 
        cizelu | 
        154 | 
           olsa_pulses(30);                       // reset radkoveho senzoru | 
      
      
        | 741 | 
        cizelu | 
        155 | 
           output_high(SDIN); | 
      
      
        | 870 | 
        cizelu | 
        156 | 
           olsa_pulses(10);                       // start bit - synchronizace | 
      
      
        | 919 | 
        cizelu | 
        157 | 
           olsa_send(MAIN_RESET); | 
      
      
        | 741 | 
        cizelu | 
        158 | 
           olsa_pulses(5); | 
      
      
        | 919 | 
        cizelu | 
        159 | 
           olsa_send(SET_MODE_RG); | 
      
      
         | 
         | 
        160 | 
           olsa_send(CLEAR_MODE_RG); | 
      
      
        | 829 | 
        cizelu | 
        161 | 
        } | 
      
      
        | 789 | 
        cizelu | 
        162 | 
          | 
      
      
        | 870 | 
        cizelu | 
        163 | 
        void olsa_setup()                         // kompletni nastaveni, provadi se po resetu | 
      
      
        | 829 | 
        cizelu | 
        164 | 
        { | 
      
      
        | 919 | 
        cizelu | 
        165 | 
           olsa_send(LEFT_OFFSET);                // nastaveni leveho segmentu (offset a zisk) | 
      
      
         | 
         | 
        166 | 
           olsa_send(OFFSET); | 
      
      
         | 
         | 
        167 | 
           olsa_send(LEFT_GAIN); | 
      
      
         | 
         | 
        168 | 
           olsa_send(GAIN); | 
      
      
         | 
         | 
        169 | 
           olsa_send(MID_OFFSET);                 // nastaveni prostredniho segmentu (offset a zisk) | 
      
      
         | 
         | 
        170 | 
           olsa_send(OFFSET); | 
      
      
         | 
         | 
        171 | 
           olsa_send(MID_GAIN); | 
      
      
         | 
         | 
        172 | 
           olsa_send(GAIN);  | 
      
      
         | 
         | 
        173 | 
           olsa_send(RIGHT_OFFSET);               // nastaveni praveho segmentu (offset a zisk) | 
      
      
         | 
         | 
        174 | 
           olsa_send(OFFSET); | 
      
      
         | 
         | 
        175 | 
           olsa_send(RIGHT_GAIN); | 
      
      
         | 
         | 
        176 | 
           olsa_send(GAIN);  | 
      
      
        | 829 | 
        cizelu | 
        177 | 
        } | 
      
      
        | 790 | 
        cizelu | 
        178 | 
          | 
      
      
        | 870 | 
        cizelu | 
        179 | 
        void olsa_integration()                   // snimani pixelu | 
      
      
        | 829 | 
        cizelu | 
        180 | 
        { | 
      
      
        | 919 | 
        cizelu | 
        181 | 
           olsa_send(START_INT);                  // zacatek integrace senzoru | 
      
      
        | 790 | 
        cizelu | 
        182 | 
           olsa_pulses(22); | 
      
      
        | 919 | 
        cizelu | 
        183 | 
           olsa_send(STOP_INT);                   // konec integrace senzoru | 
      
      
        | 790 | 
        cizelu | 
        184 | 
           olsa_pulses(5); | 
      
      
        | 829 | 
        cizelu | 
        185 | 
        } | 
      
      
        | 796 | 
        cizelu | 
        186 | 
          | 
      
      
        | 837 | 
        cizelu | 
        187 | 
        void read_olsa() | 
      
      
         | 
         | 
        188 | 
        { | 
      
      
        | 870 | 
        cizelu | 
        189 | 
           int8  cpixel;                          // pocet prectenych pixelu | 
      
      
         | 
         | 
        190 | 
           int8  cbit;                            // pocet prectenych bitu | 
      
      
         | 
         | 
        191 | 
           int8  pixel;                           // hodnota precteneho pixelu       | 
      
      
        | 837 | 
        cizelu | 
        192 | 
           cpixel=0; | 
      
      
         | 
         | 
        193 | 
           lp=0; | 
      
      
         | 
         | 
        194 | 
           rp=0; | 
      
      
         | 
         | 
        195 | 
           olsa_integration(); | 
      
      
        | 919 | 
        cizelu | 
        196 | 
           olsa_send(READOUT); | 
      
      
        | 870 | 
        cizelu | 
        197 | 
           do                                     // precte 102 pixelu | 
      
      
        | 837 | 
        cizelu | 
        198 | 
           { | 
      
      
        | 870 | 
        cizelu | 
        199 | 
              if(!SDOUT)                          // zacatek prenosu - zachycen start bit | 
      
      
        | 837 | 
        cizelu | 
        200 | 
              {   | 
      
      
         | 
         | 
        201 | 
                 pixel=0; | 
      
      
        | 870 | 
        cizelu | 
        202 | 
                 for(cbit=0;cbit<8;cbit++)        // cte jednotlive bity (8 bitu - 0 az 7)          | 
      
      
        | 837 | 
        cizelu | 
        203 | 
                 { | 
      
      
        | 870 | 
        cizelu | 
        204 | 
                    olsa_pulse();                 // impulz pro generovani dalsiho bitu | 
      
      
         | 
         | 
        205 | 
                    if(SDOUT)                     // zachycena 1                         | 
      
      
        | 837 | 
        cizelu | 
        206 | 
                    { | 
      
      
        | 870 | 
        cizelu | 
        207 | 
                       pixel|=1;                  // zapise do bitu pixelu 1 - OR | 
      
      
        | 837 | 
        cizelu | 
        208 | 
                    } | 
      
      
        | 870 | 
        cizelu | 
        209 | 
                    else                          // zachycena 0 | 
      
      
        | 837 | 
        cizelu | 
        210 | 
                    { | 
      
      
        | 870 | 
        cizelu | 
        211 | 
                       pixel|=0;                  // zapise do bitu pixelu 0 - OR | 
      
      
        | 837 | 
        cizelu | 
        212 | 
                    } | 
      
      
        | 870 | 
        cizelu | 
        213 | 
                    pixel<<=1;                    // posune pixel | 
      
      
        | 837 | 
        cizelu | 
        214 | 
                 } | 
      
      
        | 870 | 
        cizelu | 
        215 | 
                 olsa_pulse();                    // generuje stop bit | 
      
      
         | 
         | 
        216 | 
                 if(cpixel<52)                    // ulozeni do pole | 
      
      
        | 837 | 
        cizelu | 
        217 | 
                 { | 
      
      
        | 870 | 
        cizelu | 
        218 | 
                    olsa_lseg[lp]=pixel;          // leva polovina radky - leve pole | 
      
      
        | 837 | 
        cizelu | 
        219 | 
                    lp++; | 
      
      
         | 
         | 
        220 | 
                 } | 
      
      
         | 
         | 
        221 | 
                 else | 
      
      
         | 
         | 
        222 | 
                 { | 
      
      
        | 870 | 
        cizelu | 
        223 | 
                    olsa_rseg[rp]=pixel;          // prava polovina cary - prave pole | 
      
      
        | 837 | 
        cizelu | 
        224 | 
                    rp++; | 
      
      
         | 
         | 
        225 | 
                 } | 
      
      
         | 
         | 
        226 | 
                 cpixel++; | 
      
      
         | 
         | 
        227 | 
              } | 
      
      
         | 
         | 
        228 | 
              else | 
      
      
         | 
         | 
        229 | 
              { | 
      
      
        | 870 | 
        cizelu | 
        230 | 
                 olsa_pulse();                    // generuje start bit, nebyl-li poslan | 
      
      
        | 837 | 
        cizelu | 
        231 | 
              } | 
      
      
         | 
         | 
        232 | 
           } | 
      
      
        | 870 | 
        cizelu | 
        233 | 
           while(cpixel<102);                     // precte 102 pixelu | 
      
      
        | 837 | 
        cizelu | 
        234 | 
        } | 
      
      
         | 
         | 
        235 | 
          | 
      
      
        | 870 | 
        cizelu | 
        236 | 
        void olsa_position()                      // vyhodnoti pozici cary | 
      
      
        | 869 | 
        cizelu | 
        237 | 
        { | 
      
      
         | 
         | 
        238 | 
           int8  searchp;                         // ukazatel na pole | 
      
      
         | 
         | 
        239 | 
           int8  search;                          // ulozeni prectene hodnoty | 
      
      
         | 
         | 
        240 | 
           int8  protect_count;                   // opravdu vidime caru  | 
      
      
        | 870 | 
        cizelu | 
        241 | 
           position=0;                            // nuluje pozici, pokud cara neni, ulozena 0 | 
      
      
        | 869 | 
        cizelu | 
        242 | 
           for(searchp=0;searchp<52;searchp++)    // prohlizi levou cast cary | 
      
      
         | 
         | 
        243 | 
           { | 
      
      
         | 
         | 
        244 | 
              search=olsa_lseg[searchp];          // vybira pixel | 
      
      
         | 
         | 
        245 | 
              if(search==OLSA_LEV)                // cerna nebo bila? | 
      
      
         | 
         | 
        246 | 
              { | 
      
      
         | 
         | 
        247 | 
                 protect_count++;                 // pokud nasleduje cerna, pricte 1 k poctu cernych pixelu | 
      
      
         | 
         | 
        248 | 
              } | 
      
      
         | 
         | 
        249 | 
              else | 
      
      
         | 
         | 
        250 | 
              { | 
      
      
         | 
         | 
        251 | 
                 protect_count=0;                 // pokud nasleduje bila, pocet cernych pixelu vynuluje | 
      
      
         | 
         | 
        252 | 
              } | 
      
      
         | 
         | 
        253 | 
              if(protect_count>LINE_PX)           // vidim caru | 
      
      
         | 
         | 
        254 | 
              { | 
      
      
         | 
         | 
        255 | 
                 position=searchp;                // zapis presnou pozici | 
      
      
        | 873 | 
        cizelu | 
        256 | 
                 line_sector=LEFT;                // cara je v leve polovine | 
      
      
        | 870 | 
        cizelu | 
        257 | 
                 searchp=55;                      // ukonci hledani | 
      
      
        | 869 | 
        cizelu | 
        258 | 
              } | 
      
      
         | 
         | 
        259 | 
           } | 
      
      
        | 870 | 
        cizelu | 
        260 | 
           for(searchp=0;searchp<52;searchp++)    // prohlizi pravou cast cary | 
      
      
        | 869 | 
        cizelu | 
        261 | 
           { | 
      
      
        | 870 | 
        cizelu | 
        262 | 
              search=olsa_rseg[searchp];          // vybira pixel | 
      
      
        | 869 | 
        cizelu | 
        263 | 
              if(search==OLSA_LEV) | 
      
      
         | 
         | 
        264 | 
              { | 
      
      
         | 
         | 
        265 | 
                 protect_count++;                 // pokud nasleduje cerna, pricte 1 k poctu cernych pixelu | 
      
      
         | 
         | 
        266 | 
              } | 
      
      
         | 
         | 
        267 | 
              else | 
      
      
         | 
         | 
        268 | 
              { | 
      
      
         | 
         | 
        269 | 
                 protect_count=0;                 // pokud nasleduje bila, pocet cernych pixelu vynuluje | 
      
      
         | 
         | 
        270 | 
              } | 
      
      
         | 
         | 
        271 | 
              if(protect_count>LINE_PX)           // vidim caru | 
      
      
         | 
         | 
        272 | 
              { | 
      
      
         | 
         | 
        273 | 
                 position=(searchp+50);           // zapis presnou pozici | 
      
      
        | 872 | 
        cizelu | 
        274 | 
                 line_sector=RIGHT;               // cara je v prave polovine                    | 
      
      
        | 870 | 
        cizelu | 
        275 | 
                 searchp=55;                      // ukonci hledani | 
      
      
        | 869 | 
        cizelu | 
        276 | 
              } | 
      
      
         | 
         | 
        277 | 
           } | 
      
      
         | 
         | 
        278 | 
        } | 
      
      
         | 
         | 
        279 | 
          | 
      
      
        | 873 | 
        cizelu | 
        280 | 
        // ============================ ZACHRANNE SENZORY ============================== | 
      
      
         | 
         | 
        281 | 
          | 
      
      
        | 874 | 
        cizelu | 
        282 | 
        void read_blue_sensors()                        // cteni nouzovych senzoru | 
      
      
        | 829 | 
        cizelu | 
        283 | 
        { | 
      
      
        | 874 | 
        cizelu | 
        284 | 
           set_adc_channel(LINEL);                      // cti levy nouzovy senzor | 
      
      
        | 700 | 
        cizelu | 
        285 | 
           delay_us(10); | 
      
      
        | 745 | 
        cizelu | 
        286 | 
           line_l=read_adc();      | 
      
      
        | 874 | 
        cizelu | 
        287 | 
           set_adc_channel(LINER);                      // cti pravy nouzovy senzor | 
      
      
        | 700 | 
        cizelu | 
        288 | 
           delay_us(10); | 
      
      
         | 
         | 
        289 | 
           line_r=read_adc(); | 
      
      
        | 829 | 
        cizelu | 
        290 | 
        } | 
      
      
        | 920 | 
        cizelu | 
        291 | 
          | 
      
      
         | 
         | 
        292 | 
        // ================================= DALKOMER ================================= | 
      
      
         | 
         | 
        293 | 
          | 
      
      
         | 
         | 
        294 | 
        void read_sharp()                               // cteni z dalkomeru | 
      
      
         | 
         | 
        295 | 
        { | 
      
      
         | 
         | 
        296 | 
           set_adc_channel(SHARP);                      // cteni z dalkomeru                       | 
      
      
         | 
         | 
        297 | 
           delay_us(10); | 
      
      
         | 
         | 
        298 | 
           sharp_lev=read_adc();                        // ulozeni hodnoty | 
      
      
         | 
         | 
        299 | 
        } | 
      
      
        | 730 | 
        cizelu | 
        300 | 
          | 
      
      
        | 873 | 
        cizelu | 
        301 | 
        // ================================== PIPAK ==================================== | 
      
      
         | 
         | 
        302 | 
          | 
      
      
        | 716 | 
        cizelu | 
        303 | 
        void beep(int16 period,int16 length) | 
      
      
        | 829 | 
        cizelu | 
        304 | 
        { | 
      
      
        | 874 | 
        cizelu | 
        305 | 
           int16 bp;                                    // promenna pro nastaveni delky | 
      
      
         | 
         | 
        306 | 
           for(bp=length;bp>0;bp--)                     // prepina vystupy tolikrat, jakou jsme zadali delku | 
      
      
        | 829 | 
        cizelu | 
        307 | 
           { | 
      
      
        | 730 | 
        cizelu | 
        308 | 
              output_high(SOUND_HI); | 
      
      
         | 
         | 
        309 | 
              output_low(SOUND_LO); | 
      
      
         | 
         | 
        310 | 
              delay_us(period); | 
      
      
         | 
         | 
        311 | 
              output_high(SOUND_LO); | 
      
      
         | 
         | 
        312 | 
              output_low(SOUND_HI); | 
      
      
         | 
         | 
        313 | 
              delay_us(period); | 
      
      
        | 829 | 
        cizelu | 
        314 | 
           } | 
      
      
        | 901 | 
        cizelu | 
        315 | 
        } | 
      
      
        | 873 | 
        cizelu | 
        316 | 
          | 
      
      
        | 901 | 
        cizelu | 
        317 | 
        // ================================= REGULATOR ================================= | 
      
      
         | 
         | 
        318 | 
          | 
      
      
         | 
         | 
        319 | 
        void calc_error() | 
      
      
         | 
         | 
        320 | 
        { | 
      
      
         | 
         | 
        321 | 
           err1=err2;                                // ulozeni chyb | 
      
      
         | 
         | 
        322 | 
           err2=err3; | 
      
      
         | 
         | 
        323 | 
           err3=err4; | 
      
      
         | 
         | 
        324 | 
           err4=err5; | 
      
      
         | 
         | 
        325 | 
           if(position<50)                           // ulozeni a vypocet aktualni absolutni chyby | 
      
      
         | 
         | 
        326 | 
           { | 
      
      
         | 
         | 
        327 | 
              err5=(50-position);                    // pokud je cara vlevo | 
      
      
         | 
         | 
        328 | 
           } | 
      
      
         | 
         | 
        329 | 
           else | 
      
      
         | 
         | 
        330 | 
           { | 
      
      
         | 
         | 
        331 | 
              err5=(position-50);                    // pokud je cara vpravo | 
      
      
         | 
         | 
        332 | 
           } | 
      
      
         | 
         | 
        333 | 
           errp=((err1+err2+err3+err4+err5)/5);      // vypocet chyby pro integracni regulator | 
      
      
         | 
         | 
        334 | 
        } | 
      
      
         | 
         | 
        335 | 
        void calc_regulator() | 
      
      
         | 
         | 
        336 | 
        { | 
      
      
         | 
         | 
        337 | 
           int8  p_reg; | 
      
      
         | 
         | 
        338 | 
           int8  i_reg; | 
      
      
         | 
         | 
        339 | 
           int8  d_reg; | 
      
      
         | 
         | 
        340 | 
           p_reg=(CONP*err5);                           // vypocet proporcionalni slozky | 
      
      
        | 913 | 
        cizelu | 
        341 | 
           i_reg=(CONI*(errp/100));                      // vypocet integracni slozky | 
      
      
         | 
         | 
        342 | 
           if(position>old_position)                    // vypocet derivacni slozky | 
      
      
        | 901 | 
        cizelu | 
        343 | 
           { | 
      
      
        | 913 | 
        cizelu | 
        344 | 
              d_reg=(COND*((position-old_position)/100));   // pokud je aktualni pozice vetsi nez predesla | 
      
      
        | 901 | 
        cizelu | 
        345 | 
           } | 
      
      
         | 
         | 
        346 | 
           else | 
      
      
         | 
         | 
        347 | 
           { | 
      
      
        | 913 | 
        cizelu | 
        348 | 
              d_reg=(COND*((old_position-position)/100));   // pokud je aktualni pozice mensi nez predesla | 
      
      
        | 901 | 
        cizelu | 
        349 | 
           } | 
      
      
         | 
         | 
        350 | 
           reg_out=(p_reg+i_reg+d_reg);                 // vypocet celeho regulatoru | 
      
      
         | 
         | 
        351 | 
        } | 
      
      
         | 
         | 
        352 | 
          | 
      
      
        | 873 | 
        cizelu | 
        353 | 
        // ================================== MOTORY =================================== | 
      
      
         | 
         | 
        354 | 
          | 
      
      
        | 874 | 
        cizelu | 
        355 | 
        void l_motor_fwd(int8 speedl)                   // levy motor dopredu | 
      
      
        | 829 | 
        cizelu | 
        356 | 
        { | 
      
      
        | 708 | 
        cizelu | 
        357 | 
           output_high(LMF); | 
      
      
         | 
         | 
        358 | 
           output_low(LMB); | 
      
      
         | 
         | 
        359 | 
           set_pwm2_duty(speedl); | 
      
      
        | 829 | 
        cizelu | 
        360 | 
        } | 
      
      
        | 700 | 
        cizelu | 
        361 | 
          | 
      
      
        | 874 | 
        cizelu | 
        362 | 
        void l_motor_bwd(int8 speedl)                   // levy motor dozadu | 
      
      
        | 829 | 
        cizelu | 
        363 | 
        { | 
      
      
        | 708 | 
        cizelu | 
        364 | 
           output_high(LMB); | 
      
      
         | 
         | 
        365 | 
           output_low(LMF); | 
      
      
         | 
         | 
        366 | 
           set_pwm2_duty(speedl); | 
      
      
        | 829 | 
        cizelu | 
        367 | 
        } | 
      
      
        | 708 | 
        cizelu | 
        368 | 
          | 
      
      
        | 874 | 
        cizelu | 
        369 | 
        void r_motor_fwd(int8 speedr)                   // pravy motor dopredu | 
      
      
        | 829 | 
        cizelu | 
        370 | 
        { | 
      
      
        | 708 | 
        cizelu | 
        371 | 
           output_high(RMF); | 
      
      
         | 
         | 
        372 | 
           output_low(RMB); | 
      
      
         | 
         | 
        373 | 
           set_pwm1_duty(speedr); | 
      
      
        | 829 | 
        cizelu | 
        374 | 
        } | 
      
      
        | 708 | 
        cizelu | 
        375 | 
          | 
      
      
        | 874 | 
        cizelu | 
        376 | 
        void r_motor_bwd(int8 speedr)                   // pravy motor dozadu | 
      
      
        | 829 | 
        cizelu | 
        377 | 
        { | 
      
      
        | 708 | 
        cizelu | 
        378 | 
           output_high(RMB); | 
      
      
         | 
         | 
        379 | 
           output_low(RMF); | 
      
      
         | 
         | 
        380 | 
           set_pwm1_duty(speedr); | 
      
      
        | 829 | 
        cizelu | 
        381 | 
        } | 
      
      
        | 708 | 
        cizelu | 
        382 | 
          | 
      
      
        | 874 | 
        cizelu | 
        383 | 
        void l_motor_off()                              // levy motor vypnut | 
      
      
        | 829 | 
        cizelu | 
        384 | 
        { | 
      
      
        | 708 | 
        cizelu | 
        385 | 
           output_low(LMF); | 
      
      
         | 
         | 
        386 | 
           output_low(LMB); | 
      
      
         | 
         | 
        387 | 
           set_pwm2_duty(0); | 
      
      
        | 829 | 
        cizelu | 
        388 | 
        } | 
      
      
        | 730 | 
        cizelu | 
        389 | 
          | 
      
      
        | 874 | 
        cizelu | 
        390 | 
        void r_motor_off()                              // pravy motor vypnut | 
      
      
        | 829 | 
        cizelu | 
        391 | 
        {   | 
      
      
        | 708 | 
        cizelu | 
        392 | 
           output_low(RMF); | 
      
      
         | 
         | 
        393 | 
           output_low(RMB); | 
      
      
         | 
         | 
        394 | 
           set_pwm1_duty(0); | 
      
      
        | 829 | 
        cizelu | 
        395 | 
        } | 
      
      
        | 708 | 
        cizelu | 
        396 | 
          | 
      
      
        | 874 | 
        cizelu | 
        397 | 
        void motor_test()                               // TEST MOTORU | 
      
      
        | 829 | 
        cizelu | 
        398 | 
        { | 
      
      
        | 708 | 
        cizelu | 
        399 | 
           int8  i; | 
      
      
        | 716 | 
        cizelu | 
        400 | 
           beep(100,200); | 
      
      
        | 799 | 
        cizelu | 
        401 | 
           printf("TEST MOTORU\r\n"); | 
      
      
        | 708 | 
        cizelu | 
        402 | 
           delay_ms(1000); | 
      
      
        | 799 | 
        cizelu | 
        403 | 
           printf("LEVY MOTOR DOPREDU\r\n"); | 
      
      
        | 818 | 
        cizelu | 
        404 | 
           delay_ms(1000); | 
      
      
        | 874 | 
        cizelu | 
        405 | 
           for(i=0;i<255;i++)                           // levy motor dopredu - zrychluje | 
      
      
        | 829 | 
        cizelu | 
        406 | 
           { | 
      
      
        | 708 | 
        cizelu | 
        407 | 
              l_motor_fwd(i); | 
      
      
        | 799 | 
        cizelu | 
        408 | 
              printf("RYCHLOST: %u\r\n",i); | 
      
      
        | 716 | 
        cizelu | 
        409 | 
              delay_ms(5); | 
      
      
        | 829 | 
        cizelu | 
        410 | 
           } | 
      
      
        | 874 | 
        cizelu | 
        411 | 
           for(i=255;i>0;i--)                           // levy motor dopredu - zpomaluje | 
      
      
        | 829 | 
        cizelu | 
        412 | 
           { | 
      
      
        | 708 | 
        cizelu | 
        413 | 
              l_motor_fwd(i); | 
      
      
        | 799 | 
        cizelu | 
        414 | 
              printf("RYCHLOST: %u\r\n",i); | 
      
      
        | 716 | 
        cizelu | 
        415 | 
              delay_ms(5); | 
      
      
        | 829 | 
        cizelu | 
        416 | 
           }    | 
      
      
        | 874 | 
        cizelu | 
        417 | 
           printf("LEVY MOTOR DOZADU\r\n");             // levy motor dozadu - zrychluje | 
      
      
        | 818 | 
        cizelu | 
        418 | 
           delay_ms(1000); | 
      
      
        | 708 | 
        cizelu | 
        419 | 
           for(i=0;i<255;i++) | 
      
      
        | 829 | 
        cizelu | 
        420 | 
           { | 
      
      
        | 708 | 
        cizelu | 
        421 | 
              l_motor_bwd(i); | 
      
      
        | 799 | 
        cizelu | 
        422 | 
              printf("RYCHLOST: %u\r\n",i); | 
      
      
        | 716 | 
        cizelu | 
        423 | 
              delay_ms(5); | 
      
      
        | 829 | 
        cizelu | 
        424 | 
           }    | 
      
      
        | 874 | 
        cizelu | 
        425 | 
           for(i=255;i>0;i--)                           // levy motor dozadu - zpomaluje | 
      
      
        | 829 | 
        cizelu | 
        426 | 
           { | 
      
      
        | 708 | 
        cizelu | 
        427 | 
              l_motor_bwd(i); | 
      
      
        | 799 | 
        cizelu | 
        428 | 
              printf("RYCHLOST: %u\r\n",i); | 
      
      
        | 716 | 
        cizelu | 
        429 | 
              delay_ms(5); | 
      
      
        | 829 | 
        cizelu | 
        430 | 
           }    | 
      
      
        | 870 | 
        cizelu | 
        431 | 
           printf("PRAVY MOTOR DOPREDU\r\n");      | 
      
      
        | 818 | 
        cizelu | 
        432 | 
           delay_ms(1000); | 
      
      
        | 874 | 
        cizelu | 
        433 | 
           for(i=0;i<255;i++)                           // pravy motor dopredu - zrychluje | 
      
      
        | 829 | 
        cizelu | 
        434 | 
           { | 
      
      
        | 708 | 
        cizelu | 
        435 | 
              r_motor_fwd(i); | 
      
      
        | 799 | 
        cizelu | 
        436 | 
              printf("RYCHLOST: %u\r\n",i); | 
      
      
        | 716 | 
        cizelu | 
        437 | 
              delay_ms(5); | 
      
      
        | 829 | 
        cizelu | 
        438 | 
           }    | 
      
      
        | 874 | 
        cizelu | 
        439 | 
           for(i=255;i>0;i--)                           // pravy motor dopredu - zpomaluje | 
      
      
        | 829 | 
        cizelu | 
        440 | 
           { | 
      
      
        | 708 | 
        cizelu | 
        441 | 
              r_motor_fwd(i); | 
      
      
        | 799 | 
        cizelu | 
        442 | 
              printf("RYCHLOST: %u\r\n",i); | 
      
      
        | 716 | 
        cizelu | 
        443 | 
              delay_ms(5); | 
      
      
        | 829 | 
        cizelu | 
        444 | 
           }    | 
      
      
        | 799 | 
        cizelu | 
        445 | 
           printf("PRAVY MOTOR DOZADU\r\n"); | 
      
      
        | 818 | 
        cizelu | 
        446 | 
           delay_ms(1000); | 
      
      
        | 874 | 
        cizelu | 
        447 | 
           for(i=0;i<255;i++)                           // pravy motor dozadu - zrychluje | 
      
      
        | 829 | 
        cizelu | 
        448 | 
           { | 
      
      
        | 708 | 
        cizelu | 
        449 | 
              r_motor_bwd(i); | 
      
      
        | 799 | 
        cizelu | 
        450 | 
              printf("RYCHLOST: %u\r\n",i); | 
      
      
        | 716 | 
        cizelu | 
        451 | 
              delay_ms(5); | 
      
      
        | 829 | 
        cizelu | 
        452 | 
           }    | 
      
      
        | 874 | 
        cizelu | 
        453 | 
           for(i=255;i>0;i--)                           // pravy motor dozadu - zpomaluje | 
      
      
        | 829 | 
        cizelu | 
        454 | 
           { | 
      
      
        | 708 | 
        cizelu | 
        455 | 
              r_motor_bwd(i); | 
      
      
        | 799 | 
        cizelu | 
        456 | 
              printf("RYCHLOST: %u\r\n",i); | 
      
      
        | 716 | 
        cizelu | 
        457 | 
              delay_ms(5); | 
      
      
        | 829 | 
        cizelu | 
        458 | 
           } | 
      
      
        | 874 | 
        cizelu | 
        459 | 
           l_motor_off();                               // po ukonceni testu vypnout motory     | 
      
      
        | 818 | 
        cizelu | 
        460 | 
           r_motor_off(); | 
      
      
        | 870 | 
        cizelu | 
        461 | 
           printf("KONEC TESTU MOTORU\r\n");       | 
      
      
        | 818 | 
        cizelu | 
        462 | 
           delay_ms(1000); | 
      
      
        | 829 | 
        cizelu | 
        463 | 
        } | 
      
      
        | 708 | 
        cizelu | 
        464 | 
          | 
      
      
        | 873 | 
        cizelu | 
        465 | 
        // ================================ DIAGNOSTIKA ================================ | 
      
      
         | 
         | 
        466 | 
          | 
      
      
        | 874 | 
        cizelu | 
        467 | 
        void diag()                                     // diagnostika - vypis senzoru s moznosti prepnuti na test motoru | 
      
      
        | 708 | 
        cizelu | 
        468 | 
        { | 
      
      
        | 920 | 
        cizelu | 
        469 | 
           read_blue_sensors();                         // cteni nouzovych senzoru | 
      
      
         | 
         | 
        470 | 
           read_sharp();                                // cteni dalkomeru | 
      
      
         | 
         | 
        471 | 
           read_olsa();                                 // cteni z optickeho radkoveho senzoru | 
      
      
        | 870 | 
        cizelu | 
        472 | 
           olsa_position(); | 
      
      
        | 874 | 
        cizelu | 
        473 | 
           printf("LEVA: %u \t",line_l);                // tiskne z leveho senzoru | 
      
      
         | 
         | 
        474 | 
           printf("PRAVA: %u \t",line_r);               // tiskne z praveho senzoru | 
      
      
        | 920 | 
        cizelu | 
        475 | 
           printf("SHARP: %u \t",sharp_lev);            // tiskne z dalkomeru | 
      
      
        | 874 | 
        cizelu | 
        476 | 
           printf("POLOHA: %u\t",position);             // tiskne pozici OLSA  | 
      
      
         | 
         | 
        477 | 
           printf("L_NARAZ: %u \t",BUMPL);              // leve tlacitko narazniku | 
      
      
         | 
         | 
        478 | 
           printf("P_NARAZ: %u \r\n",BUMPR);            // prave tlacitko narazniku | 
      
      
         | 
         | 
        479 | 
           if(BUMPL&&BUMPR)                             // po zmacknuti stran narazniku spusti test motoru | 
      
      
        | 708 | 
        cizelu | 
        480 | 
           { | 
      
      
        | 868 | 
        cizelu | 
        481 | 
              beep(100,1000); | 
      
      
        | 865 | 
        cizelu | 
        482 | 
              printf("Levy naraznik - test OLSA\r\n"); | 
      
      
         | 
         | 
        483 | 
              printf("Pravy naraznik - test motoru\r\n"); | 
      
      
         | 
         | 
        484 | 
              delay_ms(500); | 
      
      
        | 868 | 
        cizelu | 
        485 | 
              while(true) | 
      
      
        | 865 | 
        cizelu | 
        486 | 
              { | 
      
      
        | 868 | 
        cizelu | 
        487 | 
                 if(BUMPR) | 
      
      
        | 843 | 
        cizelu | 
        488 | 
                 { | 
      
      
        | 870 | 
        cizelu | 
        489 | 
                    beep(100,500);                      // pipni pri startu | 
      
      
        | 868 | 
        cizelu | 
        490 | 
                    motor_test(); | 
      
      
         | 
         | 
        491 | 
                 } | 
      
      
         | 
         | 
        492 | 
                 if(BUMPL) | 
      
      
         | 
         | 
        493 | 
                 { | 
      
      
         | 
         | 
        494 | 
                    beep(100,500); | 
      
      
         | 
         | 
        495 | 
                    printf("TEST OLSA\r\n"); | 
      
      
         | 
         | 
        496 | 
                    while(true) | 
      
      
        | 843 | 
        cizelu | 
        497 | 
                    { | 
      
      
        | 868 | 
        cizelu | 
        498 | 
                       int8  tisk; | 
      
      
         | 
         | 
        499 | 
                       int8  *tiskp; | 
      
      
         | 
         | 
        500 | 
                       read_olsa(); | 
      
      
         | 
         | 
        501 | 
                       printf("cteni\r\n");             // po precteni vsech pixelu odradkuje | 
      
      
         | 
         | 
        502 | 
                       for(tiskp=0;tiskp<52;tiskp++)    // tisk leve casti radky | 
      
      
         | 
         | 
        503 | 
                       { | 
      
      
         | 
         | 
        504 | 
                          tisk=olsa_lseg[tiskp]; | 
      
      
         | 
         | 
        505 | 
                          printf("%x ",tisk); | 
      
      
         | 
         | 
        506 | 
                       } | 
      
      
         | 
         | 
        507 | 
                       for(tiskp=0;tiskp<52;tiskp++)    // tisk prave casti radky | 
      
      
         | 
         | 
        508 | 
                       { | 
      
      
         | 
         | 
        509 | 
                          tisk=olsa_rseg[tiskp]; | 
      
      
         | 
         | 
        510 | 
                          printf("%x ",tisk); | 
      
      
         | 
         | 
        511 | 
                       } | 
      
      
        | 865 | 
        cizelu | 
        512 | 
                    } | 
      
      
         | 
         | 
        513 | 
                 }      | 
      
      
         | 
         | 
        514 | 
              } | 
      
      
         | 
         | 
        515 | 
           }    | 
      
      
        | 708 | 
        cizelu | 
        516 | 
        } | 
      
      
         | 
         | 
        517 | 
          | 
      
      
        | 873 | 
        cizelu | 
        518 | 
        // ============================== HLAVNI SMYCKA ================================ | 
      
      
         | 
         | 
        519 | 
          | 
      
      
        | 842 | 
        cizelu | 
        520 | 
        void main() | 
      
      
        | 829 | 
        cizelu | 
        521 | 
        { | 
      
      
        | 799 | 
        cizelu | 
        522 | 
           printf("POWER ON \r\n"); | 
      
      
        | 920 | 
        cizelu | 
        523 | 
           // NASTAVENI > provede se pouze pri zapnuti        | 
      
      
        | 873 | 
        cizelu | 
        524 | 
           setup_adc(ADC_CLOCK_INTERNAL);                     // interni hodniny pro AD prevodnik | 
      
      
        | 920 | 
        cizelu | 
        525 | 
           setup_adc_ports(ALL_ANALOG);                   // aktivní analogové vstupy RA0, RA1 a RA2   | 
      
      
        | 842 | 
        cizelu | 
        526 | 
           setup_spi(SPI_SS_DISABLED); | 
      
      
         | 
         | 
        527 | 
           setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); | 
      
      
         | 
         | 
        528 | 
           setup_timer_1(T1_DISABLED); | 
      
      
        | 873 | 
        cizelu | 
        529 | 
           setup_timer_2(T2_DIV_BY_16,255,1);                 // casovac pro PWM | 
      
      
         | 
         | 
        530 | 
           setup_ccp1(CCP_PWM);                               // povoli PWM na pinu RC2 | 
      
      
         | 
         | 
        531 | 
           setup_ccp2(CCP_PWM);                               // povolí PWM na pinu RC1 | 
      
      
        | 842 | 
        cizelu | 
        532 | 
           setup_comparator(NC_NC_NC_NC); | 
      
      
         | 
         | 
        533 | 
           setup_vref(FALSE); | 
      
      
        | 873 | 
        cizelu | 
        534 | 
           l_motor_off();                                     // vypne levy motor | 
      
      
         | 
         | 
        535 | 
           r_motor_off();                                     // vypne pravy motor | 
      
      
        | 842 | 
        cizelu | 
        536 | 
           olsa_reset(); | 
      
      
         | 
         | 
        537 | 
           olsa_setup(); | 
      
      
        | 920 | 
        cizelu | 
        538 | 
           beep(350,300);                                     // pipni pri startu | 
      
      
        | 842 | 
        cizelu | 
        539 | 
           printf("OK! \r\n"); | 
      
      
         | 
         | 
        540 | 
           delay_ms(500); | 
      
      
         | 
         | 
        541 | 
           printf("VYBRAT MOD... \r\n"); | 
      
      
        | 900 | 
        cizelu | 
        542 | 
        // ============================ HLAVNI CAST PROGRAMU =========================== | 
      
      
        | 842 | 
        cizelu | 
        543 | 
           while(true) | 
      
      
        | 865 | 
        cizelu | 
        544 | 
           { | 
      
      
        | 912 | 
        cizelu | 
        545 | 
              if(blink<4000) | 
      
      
         | 
         | 
        546 | 
              { | 
      
      
         | 
         | 
        547 | 
                 output_low(LED1); | 
      
      
         | 
         | 
        548 | 
                 output_high(LED2); | 
      
      
         | 
         | 
        549 | 
              } | 
      
      
         | 
         | 
        550 | 
              else | 
      
      
         | 
         | 
        551 | 
              { | 
      
      
         | 
         | 
        552 | 
                 output_low(LED2); | 
      
      
         | 
         | 
        553 | 
                 output_high(LED1); | 
      
      
         | 
         | 
        554 | 
              } | 
      
      
         | 
         | 
        555 | 
              if (blink==8000) | 
      
      
         | 
         | 
        556 | 
              { | 
      
      
         | 
         | 
        557 | 
                 blink=0; | 
      
      
         | 
         | 
        558 | 
              } | 
      
      
         | 
         | 
        559 | 
              blink++; | 
      
      
        | 900 | 
        cizelu | 
        560 | 
        // ================================ DIAGNOSTIKA ================================   | 
      
      
         | 
         | 
        561 | 
              if(BUMPL) | 
      
      
         | 
         | 
        562 | 
              { | 
      
      
        | 912 | 
        cizelu | 
        563 | 
                 output_low(LED1); | 
      
      
         | 
         | 
        564 | 
                 output_high(LED2); | 
      
      
        | 920 | 
        cizelu | 
        565 | 
                 beep(200,500); | 
      
      
        | 900 | 
        cizelu | 
        566 | 
                 while(true) | 
      
      
         | 
         | 
        567 | 
                 { | 
      
      
         | 
         | 
        568 | 
                    diag(); | 
      
      
         | 
         | 
        569 | 
                 } | 
      
      
         | 
         | 
        570 | 
              } | 
      
      
         | 
         | 
        571 | 
        // =============================== SLEDOVANI CARY ============================== | 
      
      
        | 874 | 
        cizelu | 
        572 | 
              if(BUMPR)                                       // spusteni hledani pravym naraznikem | 
      
      
        | 873 | 
        cizelu | 
        573 | 
              {  | 
      
      
        | 912 | 
        cizelu | 
        574 | 
                 output_low(LED2); | 
      
      
         | 
         | 
        575 | 
                 output_high(LED1); | 
      
      
        | 920 | 
        cizelu | 
        576 | 
                 beep(300,500); | 
      
      
        | 873 | 
        cizelu | 
        577 | 
                 while(true) | 
      
      
         | 
         | 
        578 | 
                 { | 
      
      
         | 
         | 
        579 | 
                    old_position=position;                    // zaznamena predhozi polohu cary | 
      
      
         | 
         | 
        580 | 
                    read_olsa();                              // precte a ulozi hodnoty z olsa | 
      
      
         | 
         | 
        581 | 
                    olsa_position();                          // vyhodnoti pozici cary | 
      
      
         | 
         | 
        582 | 
                    read_blue_sensors();                      // cte nouzove senzory | 
      
      
        | 920 | 
        cizelu | 
        583 | 
                    read_sharp();                             // cte dalkomer | 
      
      
        | 873 | 
        cizelu | 
        584 | 
                    if(position==0)                           // pokud neni videt cara | 
      
      
         | 
         | 
        585 | 
                    { | 
      
      
         | 
         | 
        586 | 
                       position=old_position;                 // nastav predchozi pozici | 
      
      
         | 
         | 
        587 | 
                       gap++;                                 // pocita, jak dlouho neni videt cara | 
      
      
         | 
         | 
        588 | 
                    } | 
      
      
        | 901 | 
        cizelu | 
        589 | 
                    else                                      // pokud je videt | 
      
      
        | 874 | 
        cizelu | 
        590 | 
                    { | 
      
      
        | 901 | 
        cizelu | 
        591 | 
                       gap=0;                                 // gap je roven nule | 
      
      
        | 874 | 
        cizelu | 
        592 | 
                    } | 
      
      
        | 914 | 
        cizelu | 
        593 | 
                    if(gap>space)                             // cara neni urcite videt | 
      
      
         | 
         | 
        594 | 
                    { | 
      
      
        | 920 | 
        cizelu | 
        595 | 
                       if(line_l<WHITE)                       // cara videna levym modrym senzorem | 
      
      
        | 914 | 
        cizelu | 
        596 | 
                       { | 
      
      
         | 
         | 
        597 | 
                          position=1; | 
      
      
         | 
         | 
        598 | 
                       } | 
      
      
        | 920 | 
        cizelu | 
        599 | 
                       if(line_r<WHITE)                       // cara videna pravym modrym senzorem | 
      
      
        | 914 | 
        cizelu | 
        600 | 
                       { | 
      
      
         | 
         | 
        601 | 
                          position=99; | 
      
      
         | 
         | 
        602 | 
                       } | 
      
      
         | 
         | 
        603 | 
                    } | 
      
      
        | 919 | 
        cizelu | 
        604 | 
                    calc_error(); | 
      
      
         | 
         | 
        605 | 
                    calc_regulator(); | 
      
      
        | 912 | 
        cizelu | 
        606 | 
                    //printf("regulator: %u\r\n",reg_out); | 
      
      
        | 920 | 
        cizelu | 
        607 | 
                    if(position<50)                           // prepocet regulatoru pro motory, pokud je cara vlevo | 
      
      
        | 912 | 
        cizelu | 
        608 | 
                    { | 
      
      
         | 
         | 
        609 | 
                       lm_speed=SPD_LO-reg_out; | 
      
      
         | 
         | 
        610 | 
                       rm_speed=SPD_HI+reg_out; | 
      
      
         | 
         | 
        611 | 
                    } | 
      
      
        | 920 | 
        cizelu | 
        612 | 
                    if(position==50)                          // nastaveni rychlosti, pokud je cara uprostred | 
      
      
        | 912 | 
        cizelu | 
        613 | 
                    { | 
      
      
        | 918 | 
        cizelu | 
        614 | 
                       lm_speed=SPD_MAX; | 
      
      
         | 
         | 
        615 | 
                       rm_speed=SPD_MAX; | 
      
      
        | 912 | 
        cizelu | 
        616 | 
                    } | 
      
      
        | 920 | 
        cizelu | 
        617 | 
                    if(position>50)                           // prepocet regulatoru pro motory, pokud je cara vpravo | 
      
      
        | 912 | 
        cizelu | 
        618 | 
                    { | 
      
      
         | 
         | 
        619 | 
                       lm_speed=SPD_HI+reg_out; | 
      
      
         | 
         | 
        620 | 
                       rm_speed=SPD_LO-reg_out; | 
      
      
         | 
         | 
        621 | 
                    } | 
      
      
        | 920 | 
        cizelu | 
        622 | 
                    if(sharp_lev>PROBLEM)                     // zachycen odraz na dalkomeru | 
      
      
         | 
         | 
        623 | 
                    { | 
      
      
         | 
         | 
        624 | 
                       p_count++;                             // pocitej, jak dlouho vidis odraz | 
      
      
         | 
         | 
        625 | 
                       if(sharp_lev>BLOCK)                    // odraz je nebezpecne blizko | 
      
      
         | 
         | 
        626 | 
                       { | 
      
      
         | 
         | 
        627 | 
                          lm_speed=0; | 
      
      
         | 
         | 
        628 | 
                          rm_speed=0; | 
      
      
         | 
         | 
        629 | 
                       } | 
      
      
         | 
         | 
        630 | 
                       if(p_count>DANGER)                     // zjistuje, zda se nejedna o nahodny odraz | 
      
      
         | 
         | 
        631 | 
                       { | 
      
      
         | 
         | 
        632 | 
                          lm_speed=0; | 
      
      
         | 
         | 
        633 | 
                          rm_speed=0; | 
      
      
         | 
         | 
        634 | 
                       } | 
      
      
         | 
         | 
        635 | 
                    } | 
      
      
         | 
         | 
        636 | 
                    else                                      // pokud jiz neni detekoven odraz, vynuluj pocitadlo | 
      
      
         | 
         | 
        637 | 
                    { | 
      
      
         | 
         | 
        638 | 
                       p_count=0; | 
      
      
         | 
         | 
        639 | 
                    } | 
      
      
        | 912 | 
        cizelu | 
        640 | 
                    l_motor_fwd(lm_speed); | 
      
      
        | 920 | 
        cizelu | 
        641 | 
                    r_motor_fwd(rm_speed);             | 
      
      
        | 873 | 
        cizelu | 
        642 | 
                 } | 
      
      
         | 
         | 
        643 | 
              } | 
      
      
        | 730 | 
        cizelu | 
        644 | 
           } | 
      
      
        | 829 | 
        cizelu | 
        645 | 
        } | 
      
      
        | 865 | 
        cizelu | 
        646 | 
          | 
      
      
        | 869 | 
        cizelu | 
        647 | 
          |