Subversion Repositories svnkaklik

Rev

Rev 181 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log

Rev 181 Rev 184
Line 16... Line 16...
16
#define MOT_L  PIN_B5      // Smer otaceni leveho motoru; druhy pol je RC2
16
#define MOT_L  PIN_B5      // Smer otaceni leveho motoru; druhy pol je RC2
17
#define MOT_R  PIN_B6      // Smer otaceni praveho motoru; druhy pol je RC1
17
#define MOT_R  PIN_B6      // Smer otaceni praveho motoru; druhy pol je RC1
18
#define DATA   PIN_B2      // K modulu LEDbar data
18
#define DATA   PIN_B2      // K modulu LEDbar data
19
#define CP     PIN_B1      // K modulu LEDbar hodiny
19
#define CP     PIN_B1      // K modulu LEDbar hodiny
20
#define ODO    PIN_A4      // Ze snimace z odometrie z praveho kola
20
#define ODO    PIN_A4      // Ze snimace z odometrie z praveho kola
-
 
21
//#define CIHLA  PIN_B0      // Vstup INT, generuje preruseni pri prekazce
21
 
22
 
22
#define CASMIN 6           // Rozsah radku snimace
23
#define CASMIN 6           // Rozsah radku snimace
23
#define CASMAX 192
24
#define CASMAX 192
24
#define CASAVR ((CASMAX+CASMIN) / 2)
25
#define CASAVR ((CASMAX+CASMIN) / 2)
25
 
26
 
-
 
27
#byte INTCON      = 0x0B         // Interrupt configuration register
-
 
28
   #bit GIE       = INTCON.7
-
 
29
   #bit PEIE      = INTCON.6
-
 
30
   #bit TMR0IE    = INTCON.5
-
 
31
   #bit INT0IE    = INTCON.4
-
 
32
   #bit RBIE      = INTCON.3
-
 
33
   #bit TMR0IF    = INTCON.2
-
 
34
   #bit INT0IF    = INTCON.1
-
 
35
   #bit RBIF      = INTCON.0
-
 
36
 
-
 
37
enum stavy {start,rozjezd,jizda,cihla,cil};
-
 
38
stavy stav;    // Kde jsme na trati
-
 
39
int8 cas;      // Cas hrany bila/cerna v radce
-
 
40
 
-
 
41
void SetServo(int8 angle)
-
 
42
{
-
 
43
   int8 n, offset;
-
 
44
   
-
 
45
   for(n=0; n<20; n++)
-
 
46
   {
-
 
47
      set_adc_channel(MODRA);    // Kroutitko na vystredeni predniho kolecka
-
 
48
      Delay_ms(1);
-
 
49
      offset=read_adc();
-
 
50
 
-
 
51
      output_high(SERVO);        // Odvysilani impuzu 1 az 2ms pro servo
-
 
52
      delay_us(1000);
-
 
53
      delay_us(offset);
-
 
54
      delay_us(offset);
-
 
55
      delay_us(offset);
-
 
56
      delay_us(angle);
-
 
57
      delay_us(angle);
-
 
58
      output_low(SERVO);
-
 
59
      delay_ms(18);
-
 
60
   }   
-
 
61
}
-
 
62
 
-
 
63
#int_EXT
-
 
64
EXT_isr()   // Preruseni od prekazky
-
 
65
{
-
 
66
   set_pwm1_duty(0);    // reverz (zabrzdi)
-
 
67
   set_pwm2_duty(0);
-
 
68
   output_high(MOT_L);
-
 
69
   output_high(MOT_R);
-
 
70
   delay_ms(400);
-
 
71
   output_low(MOT_L); // zastav
-
 
72
   output_low(MOT_R);
-
 
73
   if (stav==cihla) while(true); // Zastav na furt
-
 
74
   if(stav==jizda)
-
 
75
   {
-
 
76
      int n;
-
 
77
 
-
 
78
      SetServo(CASAVR-CASMIN);      
-
 
79
      set_pwm1_duty(40); // pomalu couvej
-
 
80
      set_pwm2_duty(40);
-
 
81
      output_high(MOT_L);
-
 
82
      output_high(MOT_R);
-
 
83
      n=0;
-
 
84
      while(true)
-
 
85
      {
-
 
86
         while(input(ODO));
-
 
87
         while(!input(ODO));
-
 
88
         n++;
-
 
89
         if(n==6) break;
-
 
90
      }
-
 
91
      set_pwm1_duty(255);    // reverz (zabrzdi)
-
 
92
      set_pwm2_duty(255);
-
 
93
      output_low(MOT_L);
-
 
94
      output_low(MOT_R);
-
 
95
      delay_ms(100);
-
 
96
      set_pwm1_duty(0);  // Zastav
-
 
97
      set_pwm2_duty(0);
-
 
98
      output_low(MOT_L);
-
 
99
      output_low(MOT_R);
-
 
100
      delay_ms(1000);
-
 
101
 
-
 
102
      SetServo((CASAVR-CASMIN)-20);   // doleva        
-
 
103
      set_pwm1_duty(150);  // vpred
-
 
104
      set_pwm2_duty(200);
-
 
105
      output_low(MOT_L);
-
 
106
      output_low(MOT_R);
-
 
107
      stav=cihla;
-
 
108
      n=0;
-
 
109
      while(true)
-
 
110
      {
-
 
111
         while(input(ODO));
-
 
112
         while(!input(ODO));
-
 
113
         n++;
-
 
114
         if(n==10) break;
-
 
115
      }
-
 
116
      set_pwm1_duty(0);    // reverz (zabrzdi)
-
 
117
      set_pwm2_duty(0);
-
 
118
      output_high(MOT_L);
-
 
119
      output_high(MOT_R);
-
 
120
 
-
 
121
      SetServo((CASAVR-CASMIN));   // rovne        
-
 
122
      set_pwm1_duty(140);  // vpred
-
 
123
      set_pwm2_duty(140);
-
 
124
      output_low(MOT_L);
-
 
125
      output_low(MOT_R);
-
 
126
      stav=cihla;
-
 
127
      n=0;
-
 
128
      while(true)
-
 
129
      {
-
 
130
         while(input(ODO));
-
 
131
         while(!input(ODO));
-
 
132
         n++;
-
 
133
         if(n==10) break;
-
 
134
      }
-
 
135
      set_pwm1_duty(0);    // reverz (zabrzdi)
-
 
136
      set_pwm2_duty(0);
-
 
137
      output_high(MOT_L);
-
 
138
      output_high(MOT_R);
-
 
139
      delay_ms(200);
-
 
140
      set_pwm1_duty(150);  // Zastav
-
 
141
      set_pwm2_duty(150);
-
 
142
      output_high(MOT_L);
-
 
143
      output_high(MOT_R);
-
 
144
      delay_ms(1000);
-
 
145
 
-
 
146
      SetServo(CASMIN);   // max. doleva      
-
 
147
      set_pwm1_duty(0);  // vzad
-
 
148
      set_pwm2_duty(20);
-
 
149
      output_low(MOT_L);
-
 
150
      output_high(MOT_R);
-
 
151
      stav=cihla;
-
 
152
      n=0;
-
 
153
      while(true)
-
 
154
      {
-
 
155
         while(input(ODO));
-
 
156
         while(!input(ODO));
-
 
157
         n++;
-
 
158
         if(n==10) break;
-
 
159
      }
-
 
160
      set_pwm1_duty(0);    // reverz (zabrzdi)
-
 
161
      set_pwm2_duty(255);
-
 
162
      output_low(MOT_L);
-
 
163
      output_low(MOT_R);
-
 
164
      delay_ms(100);
-
 
165
      set_pwm1_duty(0);  // Zastav
-
 
166
      set_pwm2_duty(0);
-
 
167
      output_low(MOT_L);
-
 
168
      output_low(MOT_R);
-
 
169
      delay_ms(500);
-
 
170
 
-
 
171
 
-
 
172
      SetServo((CASAVR-CASMIN)+5);   // mirne doprava      
-
 
173
      set_pwm1_duty(180);  // vpred
-
 
174
      set_pwm2_duty(180);
-
 
175
      output_low(MOT_L);
-
 
176
      output_low(MOT_R);
-
 
177
      stav=cihla;
-
 
178
      n=0;
-
 
179
      while(true)
-
 
180
      {
-
 
181
         while(input(ODO));
-
 
182
         while(!input(ODO));
-
 
183
         n++;
-
 
184
         if(n==10) break;
-
 
185
      }
-
 
186
      set_pwm1_duty(0);  // Zastav
-
 
187
      set_pwm2_duty(0);
-
 
188
      output_low(MOT_L);
-
 
189
      output_low(MOT_R);
-
 
190
      delay_ms(500);
-
 
191
 
-
 
192
 
-
 
193
      cas=CASMIN;  // Cara je vlevo
-
 
194
      
-
 
195
      stav=cihla;
-
 
196
   }
-
 
197
}
-
 
198
 
26
// Zobrazeni jednoho byte na modulu LEDbar
199
// Zobrazeni jednoho byte na modulu LEDbar
27
void disp(int8 x)
200
void disp(int8 x)
28
{
201
{
29
   int n;
202
   int n;
30
 
203
 
Line 37... Line 210...
37
      output_low(CP);
210
      output_low(CP);
38
   }
211
   }
39
}
212
}
40
 
213
 
41
// Blikani LEDbarem ve stilu Night Rider
214
// Blikani LEDbarem ve stilu Night Rider
42
void NightRider(int x)
215
void NightRider(int8 x)
43
{
216
{
44
   int n,i,j;
217
   int n,i,j;
45
 
218
 
46
   for(j=0;j<x;j++)
219
   for(j=0;j<x;j++)
47
   {
220
   {
48
      i=0x01;
221
      i=0x01;
49
      for(n=0;n<7;n++)
222
      for(n=0;n<7;n++)
50
      {
223
      {
51
         disp(i);
224
         disp(i);
52
         rotate_left(&i, 1);
225
         rotate_left(&i, 1);
53
         delay_ms(50);
226
         delay_ms(40);
54
      }
227
      }
55
      for(n=0;n<7;n++)
228
      for(n=0;n<7;n++)
56
      {
229
      {
57
         disp(i);
230
         disp(i);
58
         rotate_right(&i, 1);
231
         rotate_right(&i, 1);
59
         delay_ms(50);
232
         delay_ms(40);
60
      }
233
      }
61
   }
234
   }
62
   disp(i);
235
   disp(i);
63
   delay_ms(30);
236
   delay_ms(40);
64
   i=0;
237
   i=0;
65
   disp(i);
238
   disp(i);
66
}
239
}
67
 
240
 
-
 
241
 
68
void main()
242
void main()
69
{
243
{
70
   int8 cas;      // Cas hrany bila/cerna v radce
-
 
71
   int8 offset;   // Promena pro ulozeni ovsetu
244
   int8 offset;   // Promena pro ulozeni ovsetu
72
   int8 rr;       // Promenna na ulozeni Rozumne rychlost
245
   int8 rr;       // Promenna na ulozeni Rozumne rychlost
73
   int8 r1;       // Rychlost motoru 1
246
   int8 r1;       // Rychlost motoru 1
74
   int8 r2;       // Rychlost motoru 2
247
   int8 r2;       // Rychlost motoru 2
75
   enum stavy {start,rozjezd,jizda,cihla,cil};
-
 
76
   stavy stav;    // Kde jsme na trati
-
 
77
   int16 trasa;   // Pocitadlo ujete vzdalenosti
248
   int16 trasa;   // Pocitadlo ujete vzdalenosti
78
 
249
 
79
   setup_adc_ports(ALL_ANALOG);              // Zapnuti A/D prevodniku pro cteni kroutitek
250
   setup_adc_ports(ALL_ANALOG);              // Zapnuti A/D prevodniku pro cteni kroutitek
80
   setup_adc(ADC_CLOCK_INTERNAL);
251
   setup_adc(ADC_CLOCK_INTERNAL);
81
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);  // Casovac pro mereni casu hrany W/B v radce
252
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);  // Casovac pro mereni casu hrany W/B v radce
Line 149... Line 320...
149
 
320
 
150
   NightRider(1);    // Musi se dat cas kamere na AGC a AEC
321
   NightRider(1);    // Musi se dat cas kamere na AGC a AEC
151
 
322
 
152
{ // Kalibrace kamery
323
{ // Kalibrace kamery
153
   int8 t1,t2;
324
   int8 t1,t2;
154
   
325
 
155
   for(offset=0;offset<=255;offset+=0x04) // Cita porad dokola
326
   for(offset=0;offset<=255;offset+=0x04) // Cita porad dokola
156
   {
327
   {
157
      i2c_start();      // Brightness
328
      i2c_start();      // Brightness
158
      i2c_write(0xC0);
329
      i2c_write(0xC0);
159
      i2c_write(0x06);
330
      i2c_write(0x06);
160
      i2c_write(offset);  // 80h default
331
      i2c_write(offset);  // 80h default
161
      i2c_stop();
332
      i2c_stop();
162
      disp(offset);
333
      disp(offset);
163
      delay_ms(100);
334
      delay_ms(50);
164
 
335
 
165
      t1=0;
336
      t1=0;
166
      t2=0;
337
      t2=0;
167
      while(!input(HREF));    // Cekej nez se zacnou posilat pixely z radky
338
      while(!input(HREF));    // Cekej nez se zacnou posilat pixely z radky
168
      delay_ms(5);     
339
      delay_ms(5);
169
      while(!input(HREF));    // Cekej nez se zacnou posilat pixely z radky
340
      while(!input(HREF));    // Cekej nez se zacnou posilat pixely z radky
170
      set_timer0(0);          // Vynuluj pocitadlo casu
341
      set_timer0(0);          // Vynuluj pocitadlo casu
171
      if(!input(PIX)) continue;
342
      if(!input(PIX)) continue;
172
      while(input(PIX));
343
      while(input(PIX));
173
      t1=get_timer0();    // Precti cas z citace casu hrany
344
      t1=get_timer0();    // Precti cas z citace casu hrany
174
      set_timer0(0);          // Vynuluj pocitadlo casu     
345
      set_timer0(0);          // Vynuluj pocitadlo casu
175
      while(!input(PIX));
346
      while(!input(PIX));
176
      t2=get_timer0();   
347
      t2=get_timer0();
177
      
348
 
178
      if((t1>60) && (t1<140) && (t2>5) && (t2<=10)) break;
349
      if((t1>60) && (t1<140) && (t2>5) && (t2<=10)) break;
179
      
350
 
180
      delay_ms(2);
351
      delay_ms(2);
181
   }
352
   }
182
}
353
}
183
 
354
 
184
delay_ms(1000);
355
delay_ms(1000);
185
 
356
 
186
   cas=128;  // Inicializace promenych, aby neslo servo za roh a aby se to rozjelo jeste dneska
357
   cas=CASAVR-CASMIN;  // Inicializace promenych, aby neslo servo za roh a aby se to rozjelo jeste dneska
187
   stav=start;
358
   stav=start;
188
   trasa=0;
359
   trasa=0;
189
 
360
 
190
   // ... Hlavni smycka ...
361
   // ... Hlavni smycka ...
191
   while(true)
362
   while(true)
Line 197... Line 368...
197
      while(!input(HREF));    // Cekej nez se zacnou posilat pixely z radky
368
      while(!input(HREF));    // Cekej nez se zacnou posilat pixely z radky
198
      set_timer0(0);          // Vynuluj pocitadlo casu
369
      set_timer0(0);          // Vynuluj pocitadlo casu
199
      while(input(HREF))      // Po dobu vysilani radky cekej na hranu W/B
370
      while(input(HREF))      // Po dobu vysilani radky cekej na hranu W/B
200
      {
371
      {
201
// !!!!Dodelat rozpoznani cerne cary napric pro zastaveni
372
// !!!!Dodelat rozpoznani cerne cary napric pro zastaveni
202
         if(!input(PIX))   // Pokud se 3x za sebou precetla CERNA
373
         if(!input(PIX))   // Pokud se Xx za sebou precetla CERNA
203
         if(!input(PIX))
374
         if(!input(PIX))
204
//         if(!input(PIX))
375
//         if(!input(PIX))
205
         {
376
         {
206
            pom=get_timer0();    // Precti cas z citace casu hrany
377
            pom=get_timer0();    // Precti cas z citace casu hrany
207
            break;
378
            break;
Line 219... Line 390...
219
 
390
 
220
      output_high(SERVO);        // Odvysilani impuzu 1 az 2ms pro servo
391
      output_high(SERVO);        // Odvysilani impuzu 1 az 2ms pro servo
221
      delay_us(1000);
392
      delay_us(1000);
222
      delay_us(offset);
393
      delay_us(offset);
223
      delay_us(offset);
394
      delay_us(offset);
-
 
395
      delay_us(offset);
224
      delay_us(cas);
396
      delay_us(cas);
225
      delay_us(cas);
397
      delay_us(cas);
226
      output_low(SERVO);
398
      output_low(SERVO);
227
 
399
 
228
      set_adc_channel(ZELENA);   // Kroutitko pro vykon motoru
400
      set_adc_channel(ZELENA);   // Kroutitko pro vykon motoru
Line 238... Line 410...
238
      if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN);
410
      if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN);
239
 
411
 
240
//      r1<<=1;     // Rychlost je dvojnasobna
412
//      r1<<=1;     // Rychlost je dvojnasobna
241
//      r2<<=1;     // Rozsah 2 az 184
413
//      r2<<=1;     // Rozsah 2 az 184
242
 
414
 
243
      if (stav==jizda)      // Jizda
415
      if ((stav==jizda)||(stav==cihla))      // Jizda
244
      {
416
      {
245
         set_pwm1_duty(r1);
417
         set_pwm1_duty(r1);
246
         set_pwm2_duty(r2);
418
         set_pwm2_duty(r2);
247
         trasa++;
419
         trasa++;
248
      }
420
      }
Line 252... Line 424...
252
         set_pwm2_duty(0);
424
         set_pwm2_duty(0);
253
      }
425
      }
254
 
426
 
255
      set_adc_channel(DALKOMER);   // Prepni A/D prevodnik na detektor cihly
427
      set_adc_channel(DALKOMER);   // Prepni A/D prevodnik na detektor cihly
256
      Delay_ms(1);
428
      Delay_ms(1);
-
 
429
 
257
      for(n=0;n<200;n++)      // Detekce prekazky
430
      if((stav==jizda)&&(trasa>50)) // musi to alespon 1s jet
258
      {
431
      {
-
 
432
         ext_int_edge(H_TO_L);         // Nastav podminky preruseni od cihly
-
 
433
         INT0IF=0;                     // Zruseni predesle udalosti od startera
-
 
434
         enable_interrupts(INT_EXT);
259
         if(read_adc()<128)
435
         enable_interrupts(GLOBAL);
260
         {
436
      };
-
 
437
 
261
            if(stav==start)
438
      if(stav==start)
-
 
439
      if(read_adc()<128)
262
            {
440
      {
263
              disp(0x55);
441
         disp(0x55);
264
              while(read_adc()<128); // Cekej, dokud starter neda ruku pryc
442
         while(read_adc()<128); // Cekej, dokud starter neda ruku pryc
265
              set_pwm1_duty(255);
443
         set_pwm1_duty(255);
266
              set_pwm2_duty(255);
444
         set_pwm2_duty(255);
267
              disp(0xAA);
445
         disp(0xAA);
268
              delay_ms(500);
446
         delay_ms(200);
269
              stav=jizda;
447
         stav=jizda;
270
              break;
-
 
271
            };
-
 
272
            if((stav==jizda)&&(trasa>50)) // musi to alespon 1s jet
-
 
273
            {
-
 
274
              set_pwm1_duty(0);
-
 
275
              set_pwm2_duty(0);
-
 
276
              output_high(MOT_L); // zabrzdi
-
 
277
              output_high(MOT_R);
-
 
278
              delay_ms(300);
-
 
279
              output_low(MOT_L); // zastav
-
 
280
              output_low(MOT_R);
-
 
281
              stav=cil;
-
 
282
              while(true);
-
 
283
            };
-
 
284
         }
-
 
285
      }
448
      }
286
 
449
 
287
      pom=0x80;   
450
      pom=0x80;
288
      for(n=CASMAX/8; n<cas; n+=CASMAX/8)
451
      for(n=CASMAX/8; n<cas; n+=CASMAX/8)
289
      {
452
      {
290
         pom>>=1;
453
         pom>>=1;
291
      }
454
      }
292
      disp(pom);
455
      disp(pom);
293
      
456
 
294
   output_high(PIN_C0);
457
   output_high(PIN_C0);
295
   delay_ms(1);
458
   delay_ms(1);
296
   output_low(PIN_C0);
459
   output_low(PIN_C0);
297
 
460
 
298
   };
461
   };