Subversion Repositories svnkaklik

Rev

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

Rev 237 Rev 238
Line 1... Line 1...
1
//********* Robot Camerus pro IstRobot 2007 ************
1
//********* Robot Camerus pro IstRobot 2007 ************
2
//"$Id: camerus.c 237 2007-04-17 14:41:35Z kakl $"
2
//"$Id: camerus.c 238 2007-04-17 21:44:53Z 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     20       // Rozumna rychlost pro objizdeni cihly
10
#define RR_CIHLA     24       // Rozumna rychlost pro objizdeni cihly
11
#define RR_PRERUSENI 20       // Rozumna rychlost pro priblizeni se k preruseni
11
#define RR_PRERUSENI 18       // Rozumna rychlost pro priblizeni se k preruseni
12
#define BRZDNA_DRAHA 8        // Jak daleko pred problemem se zacne brzdit
12
#define BRZDNA_DRAHA 8        // Jak daleko pred problemem se zacne brzdit
13
 
13
 
14
// Adresy IIC periferii
14
// Adresy IIC periferii
15
#define CAMERA_ADR   0xC0
15
#define CAMERA_ADR   0xC0
16
#define SONAR_ADR    0xE0
16
#define SONAR_ADR    0xE0
Line 188... Line 188...
188
   delay_us(angle);
188
   delay_us(angle);
189
   delay_us(angle);
189
   delay_us(angle);
190
   output_low(SERVO);
190
   output_low(SERVO);
191
}
191
}
192
 
192
 
-
 
193
// Couvni po narazu na naraznik
-
 
194
inline void bum()
-
 
195
{
-
 
196
   set_pwm1_duty(0);    // couvni, rovne dozadu
-
 
197
   set_pwm2_duty(0);
-
 
198
   output_high(MOT_L);
-
 
199
   output_high(MOT_R);
-
 
200
   disp(0xA5);
-
 
201
   SetServo(CASAVR-CASMIN);
-
 
202
}
-
 
203
 
193
//---------------------------- INT --------------------------------
204
//---------------------------- INT --------------------------------
194
#int_EXT
205
#int_EXT
195
EXT_isr()   // Preruseni od prekazky
206
EXT_isr()   // Preruseni od prekazky
196
{
207
{
197
   set_pwm1_duty(0);    // zabrzdi levym kolem, prave vypni
208
   set_pwm1_duty(0);    // zabrzdi levym kolem, prave vypni
Line 214... Line 225...
214
      output_low(MOT_L); // neni odraz -> vpred
225
      output_low(MOT_L); // neni odraz -> vpred
215
      output_low(MOT_R);
226
      output_low(MOT_R);
216
      return;
227
      return;
217
   };
228
   };
218
 
229
 
-
 
230
   rr=rrold;      // Po cihle se pojede opet Rozumnou Rychlosti
-
 
231
   if(stav!=cihla)
-
 
232
   {
219
   timer_pom=get_timer1();       // Obsah Timeru1 se musi nacist atomicky
233
      timer_pom=get_timer1();       // Obsah Timeru1 se musi nacist atomicky
220
   bb_l[log]=make8(timer_pom,0); // Zaznam do logu
234
      bb_l[log]=make8(timer_pom,0); // Zaznam do logu
221
   bb_h[log]=make8(timer_pom,1)|0x80;  // Cihla ma nastaven nejvyssi bit
235
      bb_h[log]=make8(timer_pom,1)|0x80;  // Cihla ma nastaven nejvyssi bit
222
   if(log<MAXLOG) log++;        // Ukazatel na dalsi zaznam
236
      if(log<MAXLOG) log++;        // Ukazatel na dalsi zaznam
-
 
237
   };
223
//!!! Vyzkouset, ze nepreteka LOG
238
//!!! Vyzkouset, ze nepreteka LOG
224
 
239
 
225
//!!!   if(stav==cihla) while(true); // Zastav na furt, konec drahy
240
//!!!   if(stav==cihla) while(true); // Zastav na furt, konec drahy
226
//   if(stav==cihla) return; // Po druhe nic neobjizdej
241
//   if(stav==cihla) return; // Po druhe nic neobjizdej
227
// Pozor na rozjezd
242
// Pozor na rozjezd
228
 
243
 
229
   if(stav==jizda)   // Objed cihlu
244
   if((stav==jizda)||(stav==cihla))   // Objed cihlu
230
   {
245
   {
231
      #include ".\objizdka_L.c"
246
      #include ".\objizdka_L.c"
232
   };
247
   };
233
   last_log_odo=get_timer1()+16;  // Pul metru po cihle nezaznamenavej do LOGu
248
   last_log_odo=get_timer1()+16;  // Pul metru po cihle nezaznamenavej do LOGu
234
}
249
}
Line 256... Line 271...
256
   set_pwm1_duty(0);    // Zastav motory
271
   set_pwm1_duty(0);    // Zastav motory
257
   set_pwm2_duty(0);
272
   set_pwm2_duty(0);
258
   output_low(MOT_L);   // Nastav smer vpred
273
   output_low(MOT_L);   // Nastav smer vpred
259
   output_low(MOT_R);
274
   output_low(MOT_R);
260
 
275
 
-
 
276
   if(BUMPER)  // Kdyz nekdo na zacatku drzi naraznik, vymaz log
-
 
277
   {
-
 
278
      int8 n;
-
 
279
      
-
 
280
      for(n=0;n<255;n++) write_eeprom(n,0xFF);
-
 
281
      bb_l[0]=0;        // Zapis na pozici 0 vzdalenost 0
-
 
282
      bb_h[0]=0;
-
 
283
      SaveLog(0);       // Zapis do EEPROM pocet zaznamu 0, tedy jeden zaznam
-
 
284
      while(true)
-
 
285
      {
-
 
286
         disp(0x55);       // Blikni pro potvrzeni
-
 
287
         delay_ms(200);
-
 
288
         disp(0xAA);
-
 
289
         delay_ms(200);
-
 
290
      }
-
 
291
   }
-
 
292
 
261
   output_low(IRTX);   // Zapni LED na detekci prekazky
293
   output_low(IRTX);   // Zapni LED na detekci prekazky
262
 
294
 
263
   NightRider(1);    // Aby se poznalo, ze byl RESET
295
   NightRider(1);    // Aby se poznalo, ze byl RESET
264
                     // taky se musi pockat, nez se rozjede kamera, nez se do ni zacnou posilat prikazy
296
                     // taky se musi pockat, nez se rozjede kamera, nez se do ni zacnou posilat prikazy
265
 
297
 
Line 407... Line 439...
407
   stav=start;          // Jsme na startu
439
   stav=start;          // Jsme na startu
408
   set_timer1(0);       // Vynuluj citac odometrie
440
   set_timer1(0);       // Vynuluj citac odometrie
409
   log=0;               // Zacatek logu v cerne skrince
441
   log=0;               // Zacatek logu v cerne skrince
410
   last_log_odo=0;      // Posledni zaznam odometrie do logu
442
   last_log_odo=0;      // Posledni zaznam odometrie do logu
411
 
443
 
412
   if(BUMPER)  // Kdyz nekdo na zacatku drzi naraznik, vymaz log
-
 
413
   {
-
 
414
      bb_l[0]=0;        // Zapis na pozici 0 vzdalenost 0
-
 
415
      bb_h[0]=0;
-
 
416
      SaveLog(0);       // Zapis do EEPROM pocet zaznamu 0, tedy jeden zaznam
-
 
417
      disp(0x55);       // Blikni pro potvrzeni
-
 
418
      delay_ms(200);
-
 
419
      disp(0xAA);
-
 
420
      delay_ms(200);
-
 
421
   }
-
 
422
 
-
 
423
   last_log=read_eeprom(EEMAX); // Kolik zaznamu mame od minule poznamenano?
444
   last_log=read_eeprom(EEMAX); // Kolik zaznamu mame od minule poznamenano?
424
   bb=MAKE16(read_eeprom(1) & 0x7F,read_eeprom(0)); // Precti prvni zaznam
445
   bb=MAKE16(read_eeprom(1) & 0x7F,read_eeprom(0)); // Precti prvni zaznam
425
 
446
 
426
   // ........................... Hlavni smycka ................................
447
   // ........................... Hlavni smycka ................................
427
   while(true)
448
   while(true)
428
   {
449
   {
429
      int8 pom;
450
      int8 pom;
430
      int8 n;
451
      int8 n;
-
 
452
      int8 gap;
-
 
453
      int16 ododo;
-
 
454
      
-
 
455
      gap=0;      // Vynuluj pocitadlo preruseni
431
 
456
      
432
next_snap:
457
next_snap:
433
 
458
 
434
      pom=0;
459
      pom=0;
435
      disable_interrupts(GLOBAL);  //----------------------- Critical
460
      disable_interrupts(GLOBAL);  //----------------------- Critical
436
      while(input(HREF));     // Preskoc 1. radku
461
      while(input(HREF));     // Preskoc 1. radku
Line 462... Line 487...
462
      delay_us(cas);
487
      delay_us(cas);
463
      output_low(SERVO);
488
      output_low(SERVO);
464
 
489
 
465
      if(pom==0) // Kamera nevidi caru, poznamenej to do logu
490
      if(pom==0) // Kamera nevidi caru, poznamenej to do logu
466
      {
491
      {
-
 
492
         if((cas>(CASMIN+30))&&(cas<(CASMAX-30))) // Nebyla minule cara moc u kraje?
467
         if(last_log_odo>get_timer1()) // Aby nebyly zaznamy v logu prilis huste, musi se napred neco ujet od minuleho zaznamu
493
         if(last_log_odo<get_timer1()) // Aby nebyly zaznamy v logu prilis huste, musi se napred neco ujet od minuleho zaznamu
468
         {
494
         {
-
 
495
            gap++;
-
 
496
            if(gap>=3) // Trva preruseni alespon 3 snimky?
-
 
497
            {
469
            timer_pom=get_timer1();          // Timer se musi poznamenat atomicky
498
               timer_pom=get_timer1();          // Timer se musi poznamenat atomicky
470
            bb_l[log]=make8(timer_pom,0); // Zaznam
499
               bb_l[log]=make8(timer_pom,0); // Zaznam
471
            bb_h[log]=make8(timer_pom,1);
500
               bb_h[log]=make8(timer_pom,1);
472
            last_log_odo=timer_pom+8;     // Dalsi mereni nejdrive po ujeti 24 cm
501
               last_log_odo=timer_pom+8;     // Dalsi mereni nejdrive po ujeti 24 cm
473
            if(log<MAXLOG) log++;         // Ukazatel na dalsi zaznam
502
               if(log<MAXLOG) log++;         // Ukazatel na dalsi zaznam
-
 
503
               rr=rrold;      // Preruseni skoncilo, vrat Rozumnou Rychlost
-
 
504
            }
474
         }
505
         }
475
      }
506
      }
-
 
507
      else gap=0;
476
 
508
 
-
 
509
//ODODO
-
 
510
      ododo=get_timer1();
-
 
511
      if((ododo>0x1C)&&(ododo<0x38)) rr=RR_PRERUSENI;
-
 
512
      if((ododo>0x4F)&&(ododo<0x68)) rr=RR_PRERUSENI;      
-
 
513
      
477
      // Elektronicky diferencial
514
      // Elektronicky diferencial
478
      if(cas<CASAVR) {r1=cas-CASMIN; r2=CASAVR-CASMIN;}; // Normovani vystupni hodnoty radkoveho snimace
515
      if(cas<CASAVR) {r1=cas-CASMIN; r2=CASAVR-CASMIN;}; // Normovani vystupni hodnoty radkoveho snimace
479
      if(cas==CASAVR) {r1=cas-CASMIN; r2=cas-CASMIN;};   // pro rizeni rychlosti motoru
516
      if(cas==CASAVR) {r1=cas-CASMIN; r2=cas-CASMIN;};   // pro rizeni rychlosti motoru
480
      if(cas>CASAVR) {r1=CASAVR-CASMIN; r2=CASMAX-cas;}; // Rozsah 1 az 92
517
      if(cas>CASAVR) {r1=CASAVR-CASMIN; r2=CASMAX-cas;}; // Rozsah 1 az 92
481
 
518
 
Line 485... Line 522...
485
      if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN);
522
      if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN);
486
 
523
 
487
//      r1<<=1;     // Rychlost je dvojnasobna
524
//      r1<<=1;     // Rychlost je dvojnasobna
488
//      r2<<=1;     // Rozsah 2 az 184
525
//      r2<<=1;     // Rozsah 2 az 184
489
 
526
 
490
/* Nerozumna rychlost po cihle
-
 
491
      if ((stav==cihla)&&(get_timer1()>(odocounter+5))) // Snizime rychlost po ujeti
-
 
492
      {
-
 
493
         rr=rrold;
-
 
494
         stav=pocihle;
-
 
495
      };
-
 
496
*/
-
 
497
      if ((stav==jizda)||(stav==cihla)||(stav==rozjezd)) //||(stav==pocihle))      // Jizda
527
      if ((stav==jizda)||(stav==cihla)||(stav==rozjezd)) //||(stav==pocihle))      // Jizda
498
      {
528
      {
499
         set_pwm1_duty(r1);
529
         set_pwm1_duty(r1);
500
         set_pwm2_duty(r2);
530
         set_pwm2_duty(r2);
501
      }
531
      }
Line 547... Line 577...
547
 
577
 
548
      while(true) // Ve zbytku casu snimku cti krajni UV senzory a naraznik
578
      while(true) // Ve zbytku casu snimku cti krajni UV senzory a naraznik
549
      {
579
      {
550
         if(BUMPER) // Sakra, do neceho jsme narazili a nevideli jsme to!
580
         if(BUMPER) // Sakra, do neceho jsme narazili a nevideli jsme to!
551
         {
581
         {
552
            set_pwm1_duty(0);    // couvni, rovne dozadu
-
 
553
            set_pwm2_duty(0);
-
 
554
            output_high(MOT_L);
-
 
555
            output_high(MOT_R);
-
 
556
            disp(0x5A);
582
            bum();
557
            SetServo(CASAVR-CASMIN);
-
 
558
            SaveLog(log-1);      // Zapis Black Boxu do EEPROM
583
            SaveLog(log-1);      // Zapis Black Boxu do EEPROM
559
            output_low(MOT_L);   // Vypni motory
584
            output_low(MOT_L);   // Vypni motory
560
            output_low(MOT_R);
585
            output_low(MOT_R);
561
         };
586
         };
562
         set_adc_channel(LMAX);    // Levy UV sensor
587
         set_adc_channel(LMAX);    // Levy UV sensor