Subversion Repositories svnkaklik

Rev

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

Rev 239 Rev 246
Line 1... Line 1...
1
//********* Robot Camerus pro IstRobot 2007 ************
1
//********* Robot Camerus pro IstRobot 2007 ************
2
//"$Id: camerus.c 239 2007-04-18 21:51:25Z kakl $"
2
//"$Id: camerus.c 246 2007-04-22 15:43:09Z kakl $"
3
//*****************************************************
3
//*****************************************************
4
 
4
 
5
#include ".\camerus.h"
5
#include ".\camerus.h"
6
 
6
 
7
#USE FAST_IO (C)     // Brana C je ve FAST_IO modu, aby slo rychle cist z kamery
7
#USE FAST_IO (C)     // Brana C je ve FAST_IO modu, aby slo rychle cist z kamery
8
 
8
 
9
// Rychlostni konstanty
9
// Rychlostni konstanty
10
#define RR_CIHLA     30       // Rozumna rychlost pro objizdeni cihly
10
#define RR_CIHLA     30       // Rozumna rychlost pro objizdeni cihly
11
#define RR_PRERUSENI 20       // Rozumna rychlost pro priblizeni se k preruseni
11
#define RR_PRERUSENI 20       // Rozumna rychlost pro priblizeni se k preruseni
12
#define BRZDNA_DRAHA 0x20        // Jak daleko pred problemem se zacne brzdit
12
#define BRZDNA_DRAHA 0x20        // Jak daleko pred problemem se zacne brzdit
13
#define ODODO1 0x37     
13
#define ODODO1 0x37
14
#define ODODO2 0x5E     
14
#define ODODO2 0x5E
15
 
15
 
16
// Adresy IIC periferii
16
// Adresy IIC periferii
-
 
17
#define COMPAS_ADR   0xC0
17
#define CAMERA_ADR   0xC0
18
#define CAMERA_ADR   0xDC
18
#define SONAR_ADR    0xE0
19
#define SONAR_ADR    0xE0
19
 
20
 
20
// A/D vstupy
21
// A/D vstupy
21
#define  RMAX     4  // AN4/RA5 - leve cidlo na vyjeti z cary
22
#define  RMAX     4  // AN4/RA5 - leve cidlo na vyjeti z cary
22
#define  LMAX     3  // AN3/RA3 - prave cidlo na vyjeti z cary
23
#define  LMAX     3  // AN3/RA3 - prave cidlo na vyjeti z cary
Line 210... Line 211...
210
 
211
 
211
//---------------------------- INT --------------------------------
212
//---------------------------- INT --------------------------------
212
#int_EXT
213
#int_EXT
213
EXT_isr()   // Preruseni od prekazky
214
EXT_isr()   // Preruseni od prekazky
214
{
215
{
-
 
216
   int8 bearing, bearing_offset, delta_bearing;
-
 
217
   
215
   set_pwm1_duty(0);    // zabrzdi levym kolem, prave vypni
218
   set_pwm1_duty(0);    // zabrzdi levym kolem, prave vypni
216
   set_pwm2_duty(0);
219
   set_pwm2_duty(0);
217
   output_high(MOT_L);
220
   output_high(MOT_L);
218
   output_low(MOT_R);
221
   output_low(MOT_R);
219
   // Ujistime se, ze prijaty signal je z naseho IR vysilace
222
   // Ujistime se, ze prijaty signal je z naseho IR vysilace
Line 224... Line 227...
224
      output_low(MOT_L); // je odraz -> vpred
227
      output_low(MOT_L); // je odraz -> vpred
225
      output_low(MOT_R);
228
      output_low(MOT_R);
226
      return;
229
      return;
227
   };
230
   };
228
   output_low(IRTX);    // Zapni LED na detekci prekazky
231
   output_low(IRTX);    // Zapni LED na detekci prekazky
-
 
232
 
-
 
233
   i2c_start();     // Cteni kompasu
-
 
234
   i2c_write(COMPAS_ADR);
-
 
235
   i2c_write(0x1);
-
 
236
   i2c_stop();
-
 
237
   i2c_start();
-
 
238
   i2c_write(COMPAS_ADR+1);
-
 
239
   bearing_offset=i2c_read(0);
-
 
240
   i2c_stop();
-
 
241
 
229
   delay_ms(10);
242
   delay_ms(9);
230
   if (!IRRX)     // stale nas signal?
243
   if (!IRRX)     // stale nas signal?
231
   {
244
   {
232
      output_low(MOT_L); // neni odraz -> vpred
245
      output_low(MOT_L); // neni odraz -> vpred
233
      output_low(MOT_R);
246
      output_low(MOT_R);
234
      return;
247
      return;
Line 237... Line 250...
237
   rr=rrold;      // Po cihle se pojede opet Rozumnou Rychlosti
250
   rr=rrold;      // Po cihle se pojede opet Rozumnou Rychlosti
238
   if(stav!=cihla)
251
   if(stav!=cihla)
239
   {
252
   {
240
      timer_pom=get_timer1();       // Obsah Timeru1 se musi nacist atomicky
253
      timer_pom=get_timer1();       // Obsah Timeru1 se musi nacist atomicky
241
      bb_l[log]=make8(timer_pom,0); // Zaznam do logu
254
      bb_l[log]=make8(timer_pom,0); // Zaznam do logu
242
      bb_h[log]=make8(timer_pom,1); 
255
      bb_h[log]=make8(timer_pom,1);
243
      bb_f[log]=0xFF;   // Cihla
256
      bb_f[log]=0xFF;   // Cihla
244
      if(log<MAXLOG) log++;        // Ukazatel na dalsi zaznam
257
      if(log<MAXLOG) log++;        // Ukazatel na dalsi zaznam
245
   };
258
   };
246
//!!! Vyzkouset, ze nepreteka LOG
-
 
247
 
259
 
248
//!!!   if(stav==cihla) while(true); // Zastav na furt, konec drahy
260
//!!!   if(stav==cihla) while(true); // Zastav na furt, konec drahy
249
//   if(stav==cihla) return; // Po druhe nic neobjizdej
261
//   if(stav==cihla) return; // Po druhe nic neobjizdej
250
// Pozor na rozjezd
262
// Pozor na rozjezd
251
 
263
 
Line 279... Line 291...
279
   set_pwm1_duty(0);    // Zastav motory
291
   set_pwm1_duty(0);    // Zastav motory
280
   set_pwm2_duty(0);
292
   set_pwm2_duty(0);
281
   output_low(MOT_L);   // Nastav smer vpred
293
   output_low(MOT_L);   // Nastav smer vpred
282
   output_low(MOT_R);
294
   output_low(MOT_R);
283
 
295
 
-
 
296
   disp(0);    // Zhasni LEDbar
-
 
297
   
-
 
298
/*!!!!
-
 
299
while(true)
-
 
300
{
-
 
301
   int8 ble;
-
 
302
 
-
 
303
   i2c_start();     // Cteni kompasu
-
 
304
   i2c_write(COMPAS_ADR);
-
 
305
   i2c_write(0x1);
-
 
306
   i2c_stop();
-
 
307
   i2c_start();
-
 
308
   i2c_write(COMPAS_ADR+1);
-
 
309
   ble=i2c_read(0);
-
 
310
   i2c_stop();
-
 
311
   disp(ble);
-
 
312
   delay_ms(200);
-
 
313
}
-
 
314
//*/           
-
 
315
 
284
   if(BUMPER)  // Kdyz nekdo na zacatku drzi naraznik, vymaz log
316
   if(BUMPER)  // Kdyz nekdo na zacatku drzi naraznik, vymaz log
285
   {
317
   {
286
      int8 n;
318
      int8 n;
287
 
319
 
288
      for(n=0;n<255;n++) write_eeprom(n,0);
320
      for(n=0;n<255;n++) write_eeprom(n,0);
289
      bb_l[0]=0;        // Zapis na pozici 0 vzdalenost 0
321
      bb_l[0]=0;        // Zapis na pozici 0 vzdalenost 0
290
      bb_h[0]=0;
322
      bb_h[0]=0;
291
      SaveLog(0);       // Zapis do EEPROM pocet zaznamu 0, tedy jeden zaznam
323
      SaveLog(0);       // Zapis do EEPROM pocet zaznamu 0, tedy jeden zaznam
292
      while(true)
324
      while(true)
293
      {
325
      {
-
 
326
         if(!IRRX)
-
 
327
         {
294
         disp(0x55);       // Blikni pro potvrzeni
328
            disp(0x55);       // Blikni pro potvrzeni
295
         delay_ms(200);
329
            delay_ms(200);
296
         disp(0xAA);
330
            disp(0xAA);
-
 
331
            delay_ms(200);
-
 
332
         }
-
 
333
         else
-
 
334
         {
-
 
335
            disp(0x81);       // Diagnostika celniho IR senzoru na prekazku
297
         delay_ms(200);
336
            delay_ms(200);
-
 
337
         }
298
      }
338
      }
299
   }
339
   }
300
 
340
 
301
   output_low(IRTX);   // Zapni LED na detekci prekazky
341
   output_low(IRTX);   // Zapni LED na detekci prekazky
302
 
342
 
Line 337... Line 377...
337
   }
377
   }
338
*/
378
*/
339
 
379
 
340
   //... Nastaveni kamery ...
380
   //... Nastaveni kamery ...
341
   i2c_start();      // Soft RESET kamery
381
   i2c_start();      // Soft RESET kamery
342
   i2c_write(CAMERA_ADR);        // Pro single slave musi mit vsechny zapisy adresu C0h
382
   i2c_write(CAMERA_ADR);        // Adresa kamery
343
   i2c_write(0x12);        // Adresa registru COMH
383
   i2c_write(0x12);        // Adresa registru COMH
344
   i2c_write(0x80 | 0x24); // Zapis ridiciho slova
384
   i2c_write(0x80 | 0x24); // Zapis ridiciho slova
345
   i2c_stop();
385
   i2c_stop();
346
 
386
 
347
   i2c_start();      // BW
387
   i2c_start();      // BW
Line 350... Line 390...
350
   i2c_write(0b01000001);
390
   i2c_write(0b01000001);
351
   i2c_stop();
391
   i2c_stop();
352
 
392
 
353
/*
393
/*
354
   i2c_start();      // Contrast (nema podstatny vliv na obraz)
394
   i2c_start();      // Contrast (nema podstatny vliv na obraz)
355
   i2c_write(0xC0);
395
   i2c_write(CAMERA_ADR);
356
   i2c_write(0x05);
396
   i2c_write(0x05);
357
   i2c_write(0xA0);  // 48h
397
   i2c_write(0xA0);  // 48h
358
   i2c_stop();
398
   i2c_stop();
359
 
399
 
360
   i2c_start();      // Band Filter (pokud by byl problem se zarivkama 50Hz)
400
   i2c_start();      // Band Filter (pokud by byl problem se zarivkama 50Hz)
361
   i2c_write(0xC0);
401
   i2c_write(CAMERA_ADR);
362
   i2c_write(0x2D);
402
   i2c_write(0x2D);
363
   i2c_write(0x04 | 0x03);
403
   i2c_write(0x04 | 0x03);
364
   i2c_stop();
404
   i2c_stop();
365
*/
405
*/
366
 
406
 
Line 452... Line 492...
452
   last_log=read_eeprom(EEMAX); // Kolik zaznamu mame od minule poznamenano?
492
   last_log=read_eeprom(EEMAX); // Kolik zaznamu mame od minule poznamenano?
453
   bb=MAKE16(read_eeprom(1) & 0x7F,read_eeprom(0)); // Precti prvni zaznam
493
   bb=MAKE16(read_eeprom(1) & 0x7F,read_eeprom(0)); // Precti prvni zaznam
454
 
494
 
455
   odo1=ODODO1-BRZDNA_DRAHA;
495
   odo1=ODODO1-BRZDNA_DRAHA;
456
   odo2=ODODO2-BRZDNA_DRAHA;
496
   odo2=ODODO2-BRZDNA_DRAHA;
457
   
497
 
458
   // ........................... Hlavni smycka ................................
498
   // ........................... Hlavni smycka ................................
459
   while(true)
499
   while(true)
460
   {
500
   {
461
      int8 pom;
501
      int8 pom;
462
      int8 n;
502
      int8 n;
Line 534... Line 574...
534
      if((ododo>odo2)&&(ododo<(odo2+8))) rr=RR_PRERUSENI;
574
      if((ododo>odo2)&&(ododo<(odo2+8))) rr=RR_PRERUSENI;
535
 
575
 
536
      // Elektronicky diferencial 2. cast
576
      // Elektronicky diferencial 2. cast
537
      if (r1>(CASAVR-CASMIN-rr)) r1=(r1<<1)+rr-(CASAVR-CASMIN);     // Neco jako nasobeni
577
      if (r1>(CASAVR-CASMIN-rr)) r1=(r1<<1)+rr-(CASAVR-CASMIN);     // Neco jako nasobeni
538
      if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN);     // rozsah 1 az 92 pro rr=0
578
      if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN);     // rozsah 1 az 92 pro rr=0
539
                                                                    // rozsah 1 az 154 pro rr=63 
579
                                                                    // rozsah 1 az 154 pro rr=63
540
 
580
 
541
//      r1<<=1;     // Rychlost je dvojnasobna
581
//      r1<<=1;     // Rychlost je dvojnasobna
542
//      r2<<=1;     // Rozsah 2 az 184
582
//      r2<<=1;     // Rozsah 2 az 184
543
 
583
 
544
      if ((stav==jizda)||(stav==cihla)||(stav==rozjezd)) //||(stav==pocihle))      // Jizda
584
      if ((stav==jizda)||(stav==cihla)||(stav==rozjezd)) //||(stav==pocihle))      // Jizda
Line 598... Line 638...
598
         {
638
         {
599
            bum();
639
            bum();
600
            SaveLog(log-1);      // Zapis Black Boxu do EEPROM
640
            SaveLog(log-1);      // Zapis Black Boxu do EEPROM
601
            set_pwm1_duty(140);   // pomalu vpred
641
            set_pwm1_duty(140);   // pomalu vpred
602
            set_pwm2_duty(140);
642
            set_pwm2_duty(140);
603
            output_low(MOT_L);   
643
            output_low(MOT_L);
604
            output_low(MOT_R);
644
            output_low(MOT_R);
605
         };
645
         };
606
         set_adc_channel(LMAX);    // Levy UV sensor
646
         set_adc_channel(LMAX);    // Levy UV sensor
607
         for(n=0;n<20;n++) if(input(HREF)) goto next_snap;
647
         for(n=0;n<20;n++) if(input(HREF)) goto next_snap;
608
         if(read_adc()<THR) cas=CASMIN;
648
         if(read_adc()<THR) cas=CASMIN;