Subversion Repositories svnkaklik

Rev

Details | Last modification | View Log

Rev Author Line No. Line
2 kaklik 1
#include ".\main.h"
2
 
3
#define  KOLMO1      225         // predni kolecko sroubem dopredu
4
#define  KOLMO2      30          // predni kolecko je hlavou sroubu dozadu
5
#define  STRED       128         // sredni poloha zataceciho kolecka
6
#define  BEAR1       10          // 3 stupne zataceni
7
#define  BEAR2       25
8
#define  BEAR3       45
9
#define  R           100         // Rozumna rychlost
10
#define  R17         200         // X nasobek rozumne rychlosti
11
#define  PRED_CIHLOU 100         // rychlost pri dalkove detekci cihly
12
#define  L2            2     // cara vlevo
13
#define  L3            3     // cara vlevo
14
#define  S             0     // cara mezi sensory
15
#define  R2           -2     // cara vpravo
16
#define  R3           -3     // cara vpravo
17
 
18
// servo
19
#define  SERVO PIN_B5
20
 
21
// kroutitka
22
#define  CERVENA  4  // AN4
23
//#define  CERNA    5  // AN5
24
//#define  ZELENA   6  // AN6
25
#define  MODRA    2  // AN2
26
 
27
// IR
28
#define IRTX      PIN_B2
29
#define  CIHLA    PIN_A3
30
 
31
//motory
32
#define  FR         output_low(PIN_A7); output_high(PIN_A6)  // Vpred
33
#define  FL         output_low(PIN_A1); output_high(PIN_A0)
34
#define  BR         output_low(PIN_A6); output_high(PIN_A7)  // Vzad
35
#define  BL         output_low(PIN_A0); output_high(PIN_A1)
36
#define  STOPR      output_low(PIN_A6);output_low(PIN_A7)
37
#define  STOPL      output_low(PIN_A0);output_low(PIN_A1)
38
 
39
//HID
40
#define  LED1     PIN_B1      //oranzova
41
#define  LED2     PIN_B2      //zluta
42
 
43
#define  STROBE   PIN_B0
44
//#define  SW1      PIN_A2      // Motory On/off
45
 
46
unsigned int8 sensors;        // pomocna promenna pro cteni cidel na caru
47
signed int8 line = S;         // na ktere strane byla detekovana cara
48
unsigned int8 uhel;           // urcuje aktualni uhel zataceni
49
unsigned int8 speed;          // maximalni povolena rychlost
50
unsigned int8 turn;           // rychlost toceni
51
unsigned int8 rovinka;        // pocitadlo na zjisteni rovinky
52
 
53
signed int16  Lmotor;         // promene, ktere urcuji velikost vykonu na levem
54
signed int16  Rmotor;         // a pravem motoru
55
 
56
// makro pro PWM pro motory
57
#define GO(motor, direction, power) if(get_timer0()<=power) \
58
{direction##motor;} else {stop##motor;}
59
////////////////////////////////////////////////////////////////////////////////
60
#int_TIMER2
61
TIMER2_isr()      // ovladani serva
62
{
63
   unsigned int8 n;
64
 
65
   output_high(SERVO);
66
   delay_us(1000);
67
   for(n=uhel; n>0; n--) Delay_us(2);
68
   output_low(SERVO);
69
}
70
////////////////////////////////////////////////////////////////////////////////
71
#include ".\objizdka_centrovani.c"
72
////////////////////////////////////////////////////////////////////////////////
73
void main()
74
{
75
   unsigned int8 n;
76
   unsigned int8 i,j;
77
   unsigned int8 last_sensors;
78
   unsigned int8 RozumnaRychlost;
79
 
80
   setup_adc_ports(sAN5|sAN2|sAN4|sAN6|VSS_VDD); // AD pro kroutitka
81
   setup_adc(ADC_CLOCK_INTERNAL);
82
   setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_XMIT_L_TO_H|SPI_CLK_DIV_16);
83
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
84
   setup_timer_1(T1_DISABLED|T1_DIV_BY_8);
85
   setup_timer_2(T2_DIV_BY_16,140,16);
86
   setup_oscillator(OSC_8MHZ|OSC_INTRC);
87
 
88
   STOPR; STOPL;  // zastav motory
89
   Lmotor=0;Rmotor=0;
90
 
91
   uhel = STRED;    // nastav zadni kolecko na stred
92
   rovinka = 0;
93
 
94
   enable_interrupts(INT_TIMER2);
95
   enable_interrupts(GLOBAL);
96
 
97
   output_low(IRTX); // zapni IR vysilac
98
 
99
   delay_ms(2000); // musime pockat na diagnostiku slave CPU
100
 
101
   //nastaveni rychlosti
102
   set_adc_channel(CERVENA);
103
 
104
   Delay_ms(1);
105
   RozumnaRychlost=R+(read_adc()>>2); // rychlost rovne +63; kroutitko dava 0-63
106
   set_adc_channel(MODRA);
107
   Delay_ms(1);
108
   turn=speed-32+(read_adc()>>2);  // rychlost toceni +-32; kroutitko dava 0-63
109
 
110
   speed=R17;
111
 
112
   while(true)
113
   {
114
 
115
      GO(L,F,Lmotor);GO(R,F,Rmotor);   // zapni motory PWM podle promenych Lmotor a Rmotor
116
 
117
      delay_us(2000);                  // cekani na SLAVE, nez pripravi data od cidel
118
 
119
      last_sensors=sensors;
120
 
121
      output_low(STROBE);              // vypni zobrazovani na posuvnem registru
122
      sensors = spi_read(0);           // cteni senzoru
123
      sensors=~sensors;                // neguj prijata data
124
      output_high(STROBE);             // zobraz data na posuvnem registru
125
 
126
      i=0;                             // havarijni kod
127
      for (n=0; n<=6; n++)
128
      {
129
         if(bit_test(sensors,n)) i++;
130
      }
131
      if (i>4)                // zastavi, kdyz je cerno pod vice nez tremi cidly
132
      {
133
         BL; BR;
134
         delay_ms(300);
135
         STOPR; STOPL;
136
         While(true);
137
      };
138
 
139
      if (bit_test(sensors,7))    // detekce cihly
140
      {
141
         BR;BL;
142
         Delay_ms(400);
143
         STOPR;STOPL;
144
         {
145
            Delay_ms(100);
146
            cikcak();
147
            delay_ms(100);
148
            objizdka();       // objede cihlu
149
         }
150
      }
151
 
152
      if (speed > RozumnaRychlost) speed--; // postupne zpomaleni na Roz. Rychl.
153
 
154
      if(bit_test(sensors,3)) //...|...//
155
      {
156
         uhel=STRED;
157
         Lmotor=speed;
158
         Rmotor=speed;
159
         line=S;
160
         if (rovinka < 255) rovinka++;
161
         continue;
162
      }
163
 
164
// z duvodu zkraceni doby reakce se cidla nevyhodnocuji poporade ale od krajnich k prostrednimu
165
      if(bit_test(sensors,0)) //|......//     
166
      {
167
         uhel=STRED - BEAR3;
168
         Lmotor=0;
169
         Rmotor=turn;
170
         line=L3;
171
         continue;
172
      }
173
 
174
      if(bit_test(sensors,6)) //......|//
175
      {
176
         uhel=STRED + BEAR3;
177
         Rmotor=0;
178
         Lmotor=turn;
179
         line=R3;
180
         continue;
181
      }
182
 
183
      if(bit_test(sensors,1)) //.|.....//
184
      {
185
         uhel=STRED - BEAR2;
186
         Lmotor=speed-70;
187
         Rmotor=speed;
188
         line=L2;
189
         continue;
190
      }
191
 
192
      if(bit_test(sensors,5)) //.....|.//
193
      {
194
         uhel=STRED + BEAR2;
195
         Rmotor=speed-70;
196
         Lmotor=speed;
197
         line=R2;
198
         continue;
199
      }
200
 
201
      if (bit_test(sensors,2)) //..|....//
202
      {
203
         uhel=STRED - BEAR1;
204
         Lmotor=speed-20;
205
         Rmotor=speed;
206
         line=L2;
207
         if (rovinka<255) rovinka++;
208
         continue;
209
      }
210
 
211
      if (bit_test(sensors,4)) //....|..//
212
      {
213
         uhel=STRED + BEAR1;
214
         Rmotor=speed-20;
215
         Lmotor=speed;
216
         line=L2;
217
         if (rovinka<255) rovinka++;
218
         continue;
219
      }
220
 
221
 
222
      if ((L3==line) || (R3==line)) // Brzdeni pri vyjeti z trate
223
      {
224
         if (rovinka>50)
225
         {
226
            BL; BR;
227
            Delay_ms(100);
228
            if (rovinka > 250 || speed > 170) delay_ms(50);
229
         };
230
         rovinka=0;
231
         speed=R17;
232
      };
233
   }
234
}