Subversion Repositories svnkaklik

Rev

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

Rev 196 Rev 197
Line 1... Line 1...
1
//******** Robot Camerus pro IstRobot 2007 ************
1
//******** Robot Camerus pro IstRobot 2007 ************
2
//"$Id: camerus.c 196 2007-03-17 19:38:00Z kakl $"
2
//"$Id: camerus.c 197 2007-03-18 08:30:32Z 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
// A/D vstupy
9
// A/D vstupy
10
#define  DALKOMER 4  // AN4/RA5 - proximity sensor na ruku startera
10
#define  LMAX     4  // AN4/RA5 - leve cidlo na vyjeti z cary
11
#define  CERNA    3  // AN3/RA3
11
#define  RMAX     3  // AN3/RA3 - prave cidlo na vyjeti z cary
12
#define  CERVENA  2  // AN2/RA2 - cervene kroutitko
12
#define  CERVENA  2  // AN2/RA2 - cervene kroutitko
13
#define  ZELENA   1  // AN1/RA0 - zelene kroutitko
13
#define  ZELENA   1  // AN1/RA0 - zelene kroutitko
14
#define  MODRA    0  // AN0/RA1 - modre kroutitko
14
#define  MODRA    0  // AN0/RA1 - modre kroutitko
15
 
15
 
16
// I/O
16
// I/O
17
#define HREF   PIN_C5      // Signal HREF z kamery (v H po celou dobu radku)
17
#define HREF      PIN_C5      // Signal HREF z kamery (v H po celou dobu radku)
18
#define PIX    PIN_C6      // Vstup pro body z kamery (za trivstupim hradlem OR (dig. komparator))
18
#define PIX       PIN_C6      // Vstup pro body z kamery (za trivstupim hradlem OR (dig. komparator))
19
#define SERVO  PIN_B4      // Vystup na servo (1 az 2ms po cca 20ms (synchronizovano snimkovym kmitoctem))
19
#define SERVO     PIN_B4      // Vystup na servo (1 az 2ms po cca 20ms (synchronizovano snimkovym kmitoctem))
20
#define MOT_L  PIN_B5      // Smer otaceni leveho motoru; druhy pol je RC2
20
#define MOT_L     PIN_B5      // Smer otaceni leveho motoru; druhy pol je RC2
21
#define MOT_R  PIN_B6      // Smer otaceni praveho motoru; druhy pol je RC1
21
#define MOT_R     PIN_B6      // Smer otaceni praveho motoru; druhy pol je RC1
22
#define MOT_1  PIN_C1      // PWM vystpy motoru
22
#define MOT_1     PIN_C1      // PWM vystpy motoru
23
#define MOT_2  PIN_C2      //
23
#define MOT_2     PIN_C2      //
24
#define DATA   PIN_B2      // K modulu LEDbar data
24
#define DATA      PIN_B2      // K modulu LEDbar data
25
#define CP     PIN_B1      // K modulu LEDbar hodiny
25
#define CP        PIN_B1      // K modulu LEDbar hodiny
26
#define ODO    PIN_A4      // Ze snimace z odometrie z praveho kola
26
#define ODO       PIN_A4      // Ze snimace z odometrie z praveho kola
27
#define IRRX   PIN_B0      // Vstup INT, generuje preruseni pri prekazce
27
#define IRRX      PIN_B0      // Vstup INT, generuje preruseni pri prekazce
28
#define IRTX   PIN_C0      // Modulovani vysilaci IR LED na detekci prekazky
28
#define IRTX      PIN_B3      // Modulovani vysilaci IR LED na detekci prekazky
-
 
29
#define PROXIMITY PIN_C7      // Cidlo kratkeho dosahu na cihlu
29
 
30
 
30
#define CASMIN 6           // Rozsah radku snimace
31
#define CASMIN 6           // Rozsah radku snimace
31
#define CASMAX 192
32
#define CASMAX 192
32
#define CASAVR ((CASMAX+CASMIN) / 2)
33
#define CASAVR ((CASMAX+CASMIN) / 2)
33
 
34
 
Line 116... Line 117...
116
      output_low(MOT_L); // neni odraz -> vpred
117
      output_low(MOT_L); // neni odraz -> vpred
117
      output_low(MOT_R);
118
      output_low(MOT_R);
118
      return;
119
      return;
119
   };
120
   };
120
 
121
 
121
   set_adc_channel(DALKOMER);   // Prepni A/D prevodnik na detektor cihly
-
 
122
   SetServo((CASAVR-CASMIN));   // rovne
122
   SetServo((CASAVR-CASMIN));   // rovne
123
 
123
 
124
   set_pwm1_duty(140);  // vpred
124
   set_pwm1_duty(140);  // vpred
125
   set_pwm2_duty(140);
125
   set_pwm2_duty(140);
126
   output_low(MOT_L);
126
   output_low(MOT_L);
127
   output_low(MOT_R);
127
   output_low(MOT_R);
128
   i=0;
128
   i=0;
129
   while(true)
129
   while(true)
130
   {
130
   {
131
     while(input(ODO)) if(read_adc()<128) goto brzdi; // Je cihla blizko?
131
     while(input(ODO)) if(!input(PROXIMITY)) goto brzdi; // Je cihla blizko?
132
     while(!input(ODO));
132
     while(!input(ODO));
133
     i++;
133
     i++;
134
     if(i==7) return; // nedojeli jsme k cihle, jed dal
134
     if(i==7) return; // nedojeli jsme k cihle, jed dal
135
   };
135
   };
136
 
136
 
Line 202... Line 202...
202
   int16 trasa;   // Pocitadlo ujete vzdalenosti
202
   int16 trasa;   // Pocitadlo ujete vzdalenosti
203
 
203
 
204
   setup_adc_ports(ALL_ANALOG);              // Zapnuti A/D prevodniku pro cteni kroutitek
204
   setup_adc_ports(ALL_ANALOG);              // Zapnuti A/D prevodniku pro cteni kroutitek
205
   setup_adc(ADC_CLOCK_INTERNAL);
205
   setup_adc(ADC_CLOCK_INTERNAL);
206
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);  // Casovac pro mereni casu hrany W/B v radce
206
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);  // Casovac pro mereni casu hrany W/B v radce
207
   setup_timer_1(T1_DISABLED);
207
//   setup_timer_1(T1_DISABLED);
-
 
208
   setup_timer_1(T1_EXTERNAL_SYNC);          // Cita pulzy z odometrie z praveho kola
208
   setup_timer_2(T2_DIV_BY_16,255,1);        // Casovac PWM motoru
209
   setup_timer_2(T2_DIV_BY_16,255,1);        // Casovac PWM motoru
209
   setup_ccp1(CCP_PWM); // RC1               // PWM pro motory
210
   setup_ccp1(CCP_PWM); // RC1               // PWM pro motory
210
   setup_ccp2(CCP_PWM); // RC2
211
   setup_ccp2(CCP_PWM); // RC2
211
   setup_comparator(NC_NC_NC_NC);
212
   setup_comparator(NC_NC_NC_NC);
212
   setup_vref(FALSE);
213
   setup_vref(FALSE);
Line 278... Line 279...
278
      i2c_write(0x06);
279
      i2c_write(0x06);
279
      i2c_write(0);  // 80h default
280
      i2c_write(0);  // 80h default
280
      i2c_stop();
281
      i2c_stop();
281
      delay_ms(50);
282
      delay_ms(50);
282
 
283
 
283
      for(offset=0x60;offset<(255-0x04);offset+=0x04)   // Zacni od jasu 60h
284
      for(offset=0x04;offset<(255-0x04);offset+=0x04)   // Zacni od jasu 10h
284
      {
285
      {
285
         i2c_start();      // Brightness
286
         i2c_start();      // Brightness
286
         i2c_write(0xC0);
287
         i2c_write(0xC0);
287
         i2c_write(0x06);
288
         i2c_write(0x06);
288
         i2c_write(offset);  // 80h default
289
         i2c_write(offset);  // 80h default
Line 310... Line 311...
310
      delay_ms(1000);   // Nech chvili na displayi zmerenou hodnotu
311
      delay_ms(1000);   // Nech chvili na displayi zmerenou hodnotu
311
   }
312
   }
312
 
313
 
313
   set_adc_channel(CERVENA);   // --- Kroutitko pro jas ---
314
   set_adc_channel(CERVENA);   // --- Kroutitko pro jas ---
314
   delay_ms(1);
315
   delay_ms(1);
315
   offset=read_adc()>>1;   // 0-127
316
   offset=read_adc(); 
316
   offset &= 0b11111100;   // Dva nejnizsi bity ignoruj
317
   offset &= 0b11111100;   // Dva nejnizsi bity ignoruj
317
   offset += 0x70;         // Jas nebude nikdy nizsi
318
//   offset += 0x70;         // Jas nebude nikdy nizsi
318
   disp(offset);
319
   disp(offset);
319
   i2c_start();            // Brightness
320
   i2c_start();            // Brightness
320
   i2c_write(0xC0);
321
   i2c_write(0xC0);
321
   i2c_write(0x06);
322
   i2c_write(0x06);
322
   i2c_write(offset);  // 80h default
323
   i2c_write(offset);  // 80h default
Line 400... Line 401...
400
      if(stav==start)         // Snimkuje, toci servem a ceka na start
401
      if(stav==start)         // Snimkuje, toci servem a ceka na start
401
      {
402
      {
402
         set_adc_channel(MODRA);    // Kroutitko na vystredeni predniho kolecka
403
         set_adc_channel(MODRA);    // Kroutitko na vystredeni predniho kolecka
403
         Delay_ms(1);
404
         Delay_ms(1);
404
         stred=read_adc();
405
         stred=read_adc();
405
         set_adc_channel(DALKOMER);   // Prepni A/D prevodnik na detektor cihly
-
 
406
         Delay_ms(1);
-
 
407
         if(read_adc()<128)
406
         if(!input(PROXIMITY))
408
         {
407
         {
409
            disp(0x80);
408
            disp(0x80);
410
            while(read_adc()<128); // Cekej, dokud starter neda ruku pryc
409
            while(input(PROXIMITY)); // Cekej, dokud starter neda ruku pryc
411
            set_pwm1_duty(255);    // Rychly rozjezd  !!! Zkontrolovat na oscyloskopu
410
            set_pwm1_duty(255);    // Rychly rozjezd  !!! Zkontrolovat na oscyloskopu
412
            set_pwm2_duty(255);
411
            set_pwm2_duty(255);
413
            disp(0x1);
412
            disp(0x1);
414
            delay_ms(300);
413
            delay_ms(300);
415
            stav=jizda;
414
            stav=jizda;