Subversion Repositories svnkaklik

Rev

Rev 247 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log

Rev 247 Rev 249
1
//********* Robot Camerus pro IstRobot 2007 ************
1
//********* Robot Camerus pro IstRobot 2007 ************
2
//"$Id: camerus.c 247 2007-04-22 19:31:58Z kakl $"
2
//"$Id: camerus.c 249 2007-04-23 12:26:15Z 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 0xFFF
13
#define ODODO_CIHLA       0xFFF
14
#define ODODO2 0xFFF
14
#define ODODO_TUNEL       0xFFF
-
 
15
#define ODODO_PRERUSENI   0xFFF
15
 
16
 
16
// Adresy IIC periferii
17
// Adresy IIC periferii
17
#define COMPAS_ADR   0xC0
18
#define COMPAS_ADR   0xC0
18
#define CAMERA_ADR   0xDC
19
#define CAMERA_ADR   0xDC
19
#define SONAR_ADR    0xE0
20
#define SONAR_ADR    0xE0
20
 
21
 
21
// A/D vstupy
22
// A/D vstupy
22
#define  RMAX     4  // AN4/RA5 - leve cidlo na vyjeti z cary
23
#define  RMAX     4  // AN4/RA5 - leve cidlo na vyjeti z cary
23
#define  LMAX     3  // AN3/RA3 - prave cidlo na vyjeti z cary
24
#define  LMAX     3  // AN3/RA3 - prave cidlo na vyjeti z cary
24
#define  CERVENA  2  // AN2/RA2 - cervene kroutitko
25
#define  CERVENA  2  // AN2/RA2 - cervene kroutitko
25
#define  ZELENA   1  // AN1/RA0 - zelene kroutitko
26
#define  ZELENA   1  // AN1/RA0 - zelene kroutitko
26
#define  MODRA    0  // AN0/RA1 - modre kroutitko
27
#define  MODRA    0  // AN0/RA1 - modre kroutitko
27
 
28
 
28
// I/O
29
// I/O
29
#define HREF      PIN_C5      // Signal HREF z kamery (v H po celou dobu radku)
30
#define HREF      PIN_C5      // Signal HREF z kamery (v H po celou dobu radku)
30
#define PIX       PIN_C6      // Vstup pro body z kamery (za trivstupim hradlem OR (dig. komparator))
31
#define PIX       PIN_C6      // Vstup pro body z kamery (za trivstupim hradlem OR (dig. komparator))
31
#define SERVO     PIN_B4      // Vystup na servo (1 az 2ms po cca 20ms (synchronizovano snimkovym kmitoctem))
32
#define SERVO     PIN_B4      // Vystup na servo (1 az 2ms po cca 20ms (synchronizovano snimkovym kmitoctem))
32
#define MOT_L     PIN_B5      // Smer otaceni leveho motoru; druhy pol je RC2
33
#define MOT_L     PIN_B5      // Smer otaceni leveho motoru; druhy pol je RC2
33
#define MOT_R     PIN_B6      // Smer otaceni praveho motoru; druhy pol je RC1
34
#define MOT_R     PIN_B6      // Smer otaceni praveho motoru; druhy pol je RC1
34
#define MOT_1     PIN_C1      // PWM vystpy motoru
35
#define MOT_1     PIN_C1      // PWM vystpy motoru
35
#define MOT_2     PIN_C2      //
36
#define MOT_2     PIN_C2      //
36
#define DATA      PIN_B2      // K modulu LEDbar data
37
#define DATA      PIN_B2      // K modulu LEDbar data
37
#define CP        PIN_B1      // K modulu LEDbar hodiny
38
#define CP        PIN_B1      // K modulu LEDbar hodiny
38
//#define ODO       PIN_C0      // Ze snimace z odometrie z praveho kola na TIMER1
39
//#define ODO       PIN_C0      // Ze snimace z odometrie z praveho kola na TIMER1
39
                                // Jeden impuls je 31,25mm
40
                                // Jeden impuls je 31,25mm
40
#define IRRX      !input(PIN_B0)   // Vstup INT, generuje preruseni pri prekazce
41
#define IRRX      !input(PIN_B0)   // Vstup INT, generuje preruseni pri prekazce
41
#define IRTX      PIN_B3      // Modulovani vysilaci IR LED na detekci prekazky
42
#define IRTX      PIN_B3      // Modulovani vysilaci IR LED na detekci prekazky
42
#define PROXIMITY PIN_C7      // Cidlo kratkeho dosahu na cihlu
43
#define PROXIMITY PIN_C7      // Cidlo kratkeho dosahu na cihlu
43
#define BUMPER    !input(PIN_A4)  // Naraznik
44
#define BUMPER    !input(PIN_A4)  // Naraznik
44
 
45
 
45
#define CASMIN 6           // Rozsah radku snimace
46
#define CASMIN 6           // Rozsah radku snimace
46
#define CASMAX 192
47
#define CASMAX 192
47
#define CASAVR ((CASMAX+CASMIN) / 2)
48
#define CASAVR ((CASMAX+CASMIN) / 2)
48
 
49
 
49
#define EEMAX  255         // Konec EEPROM
50
#define EEMAX  255         // Konec EEPROM
50
#define MAXLOG 0x10        // Maximalni pocet zaznamu v logu
51
#define MAXLOG 0x10        // Maximalni pocet zaznamu v logu
51
#if  MAXLOG>(EEMAX/3)
52
#if  MAXLOG>(EEMAX/3)
52
   #error  Prekrocena velikost EEPROM
53
   #error  Prekrocena velikost EEPROM
53
#endif
54
#endif
54
 
55
 
55
#define OFFSETO   0x9F //0x9F         // Vystredeni serva pro objeti prekazky
56
#define OFFSETO   0x9F //0x9F         // Vystredeni serva pro objeti prekazky
56
 
57
 
57
#define THR 90    // Threshold pro UV cidla na caru
58
#define THR 90    // Threshold pro UV cidla na caru
58
 
59
 
59
#byte INTCON      = 0x0B         // Interrupt configuration register
60
#byte INTCON      = 0x0B         // Interrupt configuration register
60
   #bit GIE       = INTCON.7
61
   #bit GIE       = INTCON.7
61
   #bit PEIE      = INTCON.6
62
   #bit PEIE      = INTCON.6
62
   #bit TMR0IE    = INTCON.5
63
   #bit TMR0IE    = INTCON.5
63
   #bit INT0IE    = INTCON.4
64
   #bit INT0IE    = INTCON.4
64
   #bit RBIE      = INTCON.3
65
   #bit RBIE      = INTCON.3
65
   #bit TMR0IF    = INTCON.2
66
   #bit TMR0IF    = INTCON.2
66
   #bit INT0IF    = INTCON.1
67
   #bit INT0IF    = INTCON.1
67
   #bit RBIF      = INTCON.0
68
   #bit RBIF      = INTCON.0
68
 
69
 
69
enum stavy {start,rozjezd,jizda,cihla,pocihle,cil};
70
enum stavy {start,rozjezd,jizda,cihla,pocihle,cil};
70
stavy stav;       // Kde jsme na trati
71
stavy stav;       // Kde jsme na trati
71
int8 cas;         // Cas hrany bila/cerna v radce
72
int8 cas;         // Cas hrany bila/cerna v radce
72
int8 stred;       // Vystredeni kolecka
73
int8 stred;       // Vystredeni kolecka
73
int16 odocounter; // Zaznamenani aktualniho stavu pocitadla odometrie
74
int16 odocounter; // Zaznamenani aktualniho stavu pocitadla odometrie
74
int16 last_log_odo; // Posledni stav odometrie poznamenany do logu
75
int16 last_log_odo; // Posledni stav odometrie poznamenany do logu
75
int16 last_log;   // Cislo posledniho zaznamu v logu v EEPROM
76
int16 last_log;   // Cislo posledniho zaznamu v logu v EEPROM
76
int8 bb_h[MAXLOG];  // Cerna skrinka MSB
77
int8 bb_h[MAXLOG];  // Cerna skrinka MSB
77
int8 bb_l[MAXLOG];  // Cerna skrinka LSB
78
int8 bb_l[MAXLOG];  // Cerna skrinka LSB
78
int8 bb_f[MAXLOG];  // Cerna skrinka priznak (typ zaznamu)
79
int8 bb_f[MAXLOG];  // Cerna skrinka priznak (typ zaznamu)
79
int8 log;         // Pocitadlo pro cernou skrinku
80
int8 log;         // Pocitadlo pro cernou skrinku
80
int16 bb;         // Posledni nactena udalost z Black Boxu
-
 
81
int16 timer_pom;  // Pomocna promenna pro atomicke nacteni hodnoty timeru1
-
 
82
int8 rr;          // Promenna na ulozeni Rozumne rychlost
81
int8 rr;          // Promenna na ulozeni Rozumne rychlost
83
int8 rrold;
82
int8 rrold;
84
int16 odo1, odo2; // Problemy na trati
83
int16 odo_preruseni, odo_cihla, odo_tunel; // Problemy na trati
85
 
84
 
86
// Zobrazeni jednoho byte na modulu LEDbar
85
// Zobrazeni jednoho byte na modulu LEDbar
87
inline void disp(int8 x)
86
inline void disp(int8 x)
88
{
87
{
89
   int n;
88
   int n;
90
 
89
 
91
   for(n=0;n<=7;n++)
90
   for(n=0;n<=7;n++)
92
   {
91
   {
93
      if (bit_test(x,0)) output_low(DATA); else output_high(DATA);
92
      if (bit_test(x,0)) output_low(DATA); else output_high(DATA);
94
      output_high(CP);
93
      output_high(CP);
95
      x>>=1;
94
      x>>=1;
96
      output_low(CP);
95
      output_low(CP);
97
   }
96
   }
98
}
97
}
99
 
98
 
100
// Blikani LEDbarem ve stilu Night Rider
99
// Blikani LEDbarem ve stilu Night Rider
101
void NightRider(int8 x)
100
void NightRider(int8 x)
102
{
101
{
103
   int n,i,j;
102
   int n,i,j;
104
 
103
 
105
   for(j=0;j<x;j++)
104
   for(j=0;j<x;j++)
106
   {
105
   {
107
      i=0x01;
106
      i=0x01;
108
      for(n=0;n<7;n++)
107
      for(n=0;n<7;n++)
109
      {
108
      {
110
         disp(i);
109
         disp(i);
111
         rotate_left(&i, 1);
110
         rotate_left(&i, 1);
112
         delay_ms(40);
111
         delay_ms(40);
113
      }
112
      }
114
      for(n=0;n<7;n++)
113
      for(n=0;n<7;n++)
115
      {
114
      {
116
         disp(i);
115
         disp(i);
117
         rotate_right(&i, 1);
116
         rotate_right(&i, 1);
118
         delay_ms(40);
117
         delay_ms(40);
119
      }
118
      }
120
   }
119
   }
121
   disp(i);
120
   disp(i);
122
   delay_ms(40);
121
   delay_ms(40);
123
   i=0;
122
   i=0;
124
   disp(i);
123
   disp(i);
125
}
124
}
126
 
125
 
127
// Zaznam LOGu do EEPROM
126
// Zaznam LOGu do EEPROM
128
void SaveLog(int8 log)
127
void SaveLog(int8 log)
129
{
128
{
130
   int8 n,i;
129
   int8 n,i;
131
 
130
 
132
   i=0;
131
   i=0;
133
   for(n=0;n<=(log*3);n+=3)   // Ulozeni Black Boxu do EEPROM
132
   for(n=0;n<=(log*3);n+=3)   // Ulozeni Black Boxu do EEPROM
134
   {
133
   {
135
      write_eeprom(n,bb_f[i]);
134
      write_eeprom(n,bb_f[i]);
136
      write_eeprom(n+1,bb_h[i]);
135
      write_eeprom(n+1,bb_h[i]);
137
      write_eeprom(n+2,bb_l[i]);
136
      write_eeprom(n+2,bb_l[i]);
138
      i++;
137
      i++;
139
   };
138
   };
140
   write_eeprom(EEMAX,log);  // Zapis poctu zaznamu na konec EEPROM
139
   write_eeprom(EEMAX,log);  // Zapis poctu zaznamu na konec EEPROM
141
}
140
}
142
 
141
 
-
 
142
// Zaznam do Logu do RAM
-
 
143
void LogLog(int8 flag, int16 gap)
-
 
144
{
-
 
145
   int16 timer_pom;
-
 
146
   
-
 
147
   timer_pom=get_timer1();          // Timer se musi vycist atomicky
-
 
148
   bb_l[log]=make8(timer_pom,0); // Zaznam
-
 
149
   bb_h[log]=make8(timer_pom,1);
-
 
150
   bb_f[log]=flag;   // Typ zaznamu
-
 
151
   if(log<MAXLOG) log++;         // Ukazatel na dalsi zaznam
-
 
152
   last_log_odo=timer_pom+gap;     // Dalsi mereni nejdrive po ujeti def. vzdalenosti
-
 
153
   rr=rrold;      // Problem skoncil, znovu jed Rozumnou Rychlosti
-
 
154
}
-
 
155
 
-
 
156
void ReadBlackBox()
-
 
157
{
-
 
158
   last_log=read_eeprom(EEMAX); // Kolik zaznamu mame od minule poznamenano?
-
 
159
   {
-
 
160
      int8 n,i;
-
 
161
      
-
 
162
      i=0;
-
 
163
      for(n=0;n<=last_log;n++)
-
 
164
      {
-
 
165
         if(read_eeprom(i)==0) odo_tunel=MAKE16(read_eeprom(i+2),read_eeprom(i+1));
-
 
166
         if(read_eeprom(i)==0xFF) odo_cihla=MAKE16(read_eeprom(i+2),read_eeprom(i+1));
-
 
167
         if((read_eeprom(i)>0) && (read_eeprom(i)<0xFF)) odo_preruseni=MAKE16(read_eeprom(i+2),read_eeprom(i+1));
-
 
168
      }
-
 
169
   }   
-
 
170
}
-
 
171
 
-
 
172
 
143
// Brzdeni motorama stridou 1:1
173
// Brzdeni motorama stridou 1:1
144
void brzda()
174
void brzda()
145
{
175
{
146
   int8 n,i;
176
   int8 n,i;
147
 
177
 
148
   set_pwm1_duty(0);    // vypni PWM
178
   set_pwm1_duty(0);    // vypni PWM
149
   set_pwm2_duty(0);
179
   set_pwm2_duty(0);
150
   setup_ccp1(CCP_OFF);
180
   setup_ccp1(CCP_OFF);
151
   setup_ccp2(CCP_OFF);
181
   setup_ccp2(CCP_OFF);
152
   for (n=0;n<200;n++)
182
   for (n=0;n<200;n++)
153
   {
183
   {
154
      output_low(MOT_L);
184
      output_low(MOT_L);
155
      output_low(MOT_R);
185
      output_low(MOT_R);
156
      output_high(MOT_1);
186
      output_high(MOT_1);
157
      output_high(MOT_2);
187
      output_high(MOT_2);
158
      delay_us(200);
188
      delay_us(200);
159
      output_high(MOT_L);
189
      output_high(MOT_L);
160
      output_high(MOT_R);
190
      output_high(MOT_R);
161
      output_low(MOT_1);
191
      output_low(MOT_1);
162
      output_low(MOT_2);
192
      output_low(MOT_2);
163
      delay_us(200);
193
      delay_us(200);
164
   }
194
   }
165
   output_low(MOT_L); // smer vpred
195
   output_low(MOT_L); // smer vpred
166
   output_low(MOT_R);
196
   output_low(MOT_R);
167
   setup_ccp1(CCP_PWM); // RC1               // Zapni PWM pro motory
197
   setup_ccp1(CCP_PWM); // RC1               // Zapni PWM pro motory
168
   setup_ccp2(CCP_PWM); // RC2
198
   setup_ccp2(CCP_PWM); // RC2
169
}
199
}
170
 
200
 
171
void SetServo(int8 angle)
201
void SetServo(int8 angle)
172
{
202
{
173
   int8 n;
203
   int8 n;
174
 
204
 
175
   for(n=0; n<10; n++)
205
   for(n=0; n<10; n++)
176
   {
206
   {
177
      output_high(SERVO);        // Odvysilani impuzu 1 az 2ms pro servo
207
      output_high(SERVO);        // Odvysilani impuzu 1 az 2ms pro servo
178
      delay_us(1000);
208
      delay_us(1000);
179
      delay_us(stred);
209
      delay_us(stred);
180
      delay_us(stred);
210
      delay_us(stred);
181
      delay_us(stred);
211
      delay_us(stred);
182
      delay_us(angle);
212
      delay_us(angle);
183
      delay_us(angle);
213
      delay_us(angle);
184
      output_low(SERVO);
214
      output_low(SERVO);
185
      delay_ms(18);
215
      delay_ms(18);
186
   }
216
   }
187
}
217
}
188
 
218
 
189
inline void SetServoQ(int8 angle)
219
inline void SetServoQ(int8 angle)
190
{
220
{
191
   output_high(SERVO);        // Odvysilani impuzu 1 az 2ms pro servo
221
   output_high(SERVO);        // Odvysilani impuzu 1 az 2ms pro servo
192
   delay_us(1000);
222
   delay_us(1000);
193
   delay_us(stred);
223
   delay_us(stred);
194
   delay_us(stred);
224
   delay_us(stred);
195
   delay_us(stred);
225
   delay_us(stred);
196
   delay_us(angle);
226
   delay_us(angle);
197
   delay_us(angle);
227
   delay_us(angle);
198
   output_low(SERVO);
228
   output_low(SERVO);
199
}
229
}
200
 
230
 
201
// Couvni po narazu na naraznik
231
// Couvni po narazu na naraznik
202
inline void bum()
232
inline void bum()
203
{
233
{
204
   set_pwm1_duty(0);    // couvni, rovne dozadu
234
   set_pwm1_duty(0);    // couvni, rovne dozadu
205
   set_pwm2_duty(0);
235
   set_pwm2_duty(0);
206
   output_high(MOT_L);
236
   output_high(MOT_L);
207
   output_high(MOT_R);
237
   output_high(MOT_R);
208
   disp(0xA5);
238
   disp(0xA5);
209
   SetServo(CASAVR-CASMIN);
239
   SetServo(CASAVR-CASMIN);
210
}
240
}
211
 
241
 
-
 
242
#include ".\diag.c" 
-
 
243
 
212
//---------------------------- INT --------------------------------
244
//---------------------------- INT --------------------------------
213
#int_EXT
245
#int_EXT
214
EXT_isr()   // Preruseni od prekazky
246
EXT_isr()   // Preruseni od prekazky
215
{
247
{
216
   unsigned int8 bearing, bearing_offset, delta_bearing;
248
   unsigned int8 bearing, bearing_offset, delta_bearing;
217
 
249
 
218
   set_pwm1_duty(0);    // zabrzdi levym kolem, prave vypni
250
   set_pwm1_duty(0);    // zabrzdi levym kolem, prave vypni
219
   set_pwm2_duty(0);
251
   set_pwm2_duty(0);
220
   output_high(MOT_L);
252
   output_high(MOT_L);
221
   output_low(MOT_R);
253
   output_low(MOT_R);
222
   // Ujistime se, ze prijaty signal je z naseho IR vysilace
254
   // Ujistime se, ze prijaty signal je z naseho IR vysilace
223
   output_high(IRTX);   // Vypni LED na detekci prekazky
255
   output_high(IRTX);   // Vypni LED na detekci prekazky
224
   delay_ms(2);
256
   delay_ms(2);
225
   if (IRRX)    // stale nas signal?
257
   if (IRRX)    // stale nas signal?
226
   {
258
   {
227
      output_low(MOT_L); // je odraz -> vpred
259
      output_low(MOT_L); // je odraz -> vpred
228
      output_low(MOT_R);
260
      output_low(MOT_R);
229
      return;
261
      return;
230
   };
262
   };
231
   output_low(IRTX);    // Zapni LED na detekci prekazky
263
   output_low(IRTX);    // Zapni LED na detekci prekazky
232
 
264
 
233
   i2c_start();     // Cteni kompasu
265
   i2c_start();     // Cteni kompasu
234
   i2c_write(COMPAS_ADR);
266
   i2c_write(COMPAS_ADR);
235
   i2c_write(0x1);
267
   i2c_write(0x1);   // 0-255 (odpovida 0-359)
236
   i2c_stop();
268
   i2c_stop();
237
   i2c_start();
269
   i2c_start();
238
   i2c_write(COMPAS_ADR+1);
270
   i2c_write(COMPAS_ADR+1);
239
   bearing_offset=i2c_read(0);
271
   bearing_offset=i2c_read(0); // Poznamenej hodnotu pred cihlou
240
   i2c_stop();
272
   i2c_stop();
241
 
273
 
242
   delay_ms(9);
274
   delay_ms(9);
243
   if (!IRRX)     // stale nas signal?
275
   if (!IRRX)     // stale nas signal?
244
   {
276
   {
245
      output_low(MOT_L); // neni odraz -> vpred
277
      output_low(MOT_L); // neni odraz -> vpred
246
      output_low(MOT_R);
278
      output_low(MOT_R);
247
      return;
279
      return;
248
   };
280
   };
249
 
281
 
250
   rr=rrold;      // Po cihle se pojede opet Rozumnou Rychlosti
282
   rr=rrold;      // Po cihle se pojede opet Rozumnou Rychlosti
251
   if(stav!=cihla)
283
   if(stav!=cihla)
252
   {
284
   {
253
      timer_pom=get_timer1();       // Obsah Timeru1 se musi nacist atomicky
-
 
254
      bb_l[log]=make8(timer_pom,0); // Zaznam do logu
-
 
255
      bb_h[log]=make8(timer_pom,1);
-
 
256
      bb_f[log]=0xFF;   // Cihla
285
      LogLog(0xFF,3);   // Cihla
257
      if(log<MAXLOG) log++;        // Ukazatel na dalsi zaznam
-
 
258
   };
286
   };
259
 
287
 
260
//!!!   if(stav==cihla) while(true); // Zastav na furt, konec drahy
288
//!!!   if(stav==cihla) while(true); // Zastav na furt, konec drahy
261
//   if(stav==cihla) return; // Po druhe nic neobjizdej
289
//   if(stav==cihla) return; // Po druhe nic neobjizdej
262
// Pozor na rozjezd
290
// Pozor na rozjezd
263
 
291
 
264
   if((stav==jizda)||(stav==cihla))   // Objed cihlu
292
   if((stav==jizda)||(stav==cihla))   // Objed cihlu
265
   {
293
   {
266
      #include ".\objizdka_L.c"
294
      #include ".\objizdka_L.c"
267
   };
295
   };
268
   last_log_odo=get_timer1()+16;  // Pul metru po cihle nezaznamenavej do LOGu
296
   last_log_odo=get_timer1()+16;  // Pul metru po cihle nezaznamenavej do LOGu
269
}
297
}
270
 
298
 
271
 
299
 
272
//---------------------------------- MAIN --------------------------------------
300
//---------------------------------- MAIN --------------------------------------
273
void main()
301
void main()
274
{
302
{
275
   int8 offset;   // Promena pro ulozeni offsetu
303
   int8 offset;   // Promena pro ulozeni offsetu
276
   int8 r1;       // Rychlost motoru 1
304
   int8 r1;       // Rychlost motoru 1
277
   int8 r2;       // Rychlost motoru 2
305
   int8 r2;       // Rychlost motoru 2
278
 
306
 
279
   setup_adc_ports(ALL_ANALOG);              // Zapnuti A/D prevodniku pro cteni kroutitek
307
   setup_adc_ports(ALL_ANALOG);              // Zapnuti A/D prevodniku pro cteni kroutitek
280
   setup_adc(ADC_CLOCK_INTERNAL);
308
   setup_adc(ADC_CLOCK_INTERNAL);
281
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);  // Casovac pro mereni casu hrany W/B v radce
309
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);  // Casovac pro mereni casu hrany W/B v radce
282
   setup_timer_1(T1_EXTERNAL);               // Cita pulzy z odometrie z praveho kola
310
   setup_timer_1(T1_EXTERNAL);               // Cita pulzy z odometrie z praveho kola
283
   setup_timer_2(T2_DIV_BY_16,255,1);        // Casovac PWM motoru
311
   setup_timer_2(T2_DIV_BY_16,255,1);        // Casovac PWM motoru
284
   setup_ccp1(CCP_PWM); // RC1               // PWM pro motory
312
   setup_ccp1(CCP_PWM); // RC1               // PWM pro motory
285
   setup_ccp2(CCP_PWM); // RC2
313
   setup_ccp2(CCP_PWM); // RC2
286
   setup_comparator(NC_NC_NC_NC);
314
   setup_comparator(NC_NC_NC_NC);
287
   setup_vref(FALSE);
315
   setup_vref(FALSE);
288
 
316
 
289
   set_tris_c(0b11111001);     // Nastaveni vstup/vystup pro branu C, protoze se to nedela automaticky
317
   set_tris_c(0b11111001);     // Nastaveni vstup/vystup pro branu C, protoze se to nedela automaticky
290
 
318
 
291
   set_pwm1_duty(0);    // Zastav motory
319
   set_pwm1_duty(0);    // Zastav motory
292
   set_pwm2_duty(0);
320
   set_pwm2_duty(0);
293
   output_low(MOT_L);   // Nastav smer vpred
321
   output_low(MOT_L);   // Nastav smer vpred
294
   output_low(MOT_R);
322
   output_low(MOT_R);
295
 
323
 
296
   disp(0);    // Zhasni LEDbar
324
   disp(0);    // Zhasni LEDbar
297
 
325
 
298
   if(BUMPER)  // Kdyz nekdo na zacatku drzi naraznik, vymaz log
326
   if(BUMPER)  // Kdyz nekdo na zacatku drzi naraznik, vymaz log a spust diagnostiku
299
   {
327
   {
300
      int8 n;
328
      diag();
301
 
-
 
302
      for(n=0;n<255;n++) write_eeprom(n,0);
-
 
303
      bb_l[0]=0;        // Zapis na pozici 0 vzdalenost 0
-
 
304
      bb_h[0]=0;
-
 
305
      SaveLog(0);       // Zapis do EEPROM pocet zaznamu 0, tedy jeden zaznam
-
 
306
      for(n=0;n<=4;n++)
-
 
307
      {
-
 
308
         disp(0x55);       // Blikni pro potvrzeni
-
 
309
         delay_ms(200);
-
 
310
         disp(0xAA);
-
 
311
         delay_ms(200);
-
 
312
      };
-
 
313
      while(true)
-
 
314
      {
-
 
315
         if(!IRRX)
-
 
316
         {
-
 
317
            int8 ble;
-
 
318
         
-
 
319
            i2c_start();     // Cteni kompasu
-
 
320
            i2c_write(COMPAS_ADR);
-
 
321
            i2c_write(0x1);
-
 
322
            i2c_stop();
-
 
323
            i2c_start();
-
 
324
            i2c_write(COMPAS_ADR+1);
-
 
325
            ble=i2c_read(0);
-
 
326
            i2c_stop();
-
 
327
            disp(ble);
-
 
328
            delay_ms(200);
-
 
329
         }
-
 
330
         else
-
 
331
         {
-
 
332
            disp(0x81);       // Diagnostika celniho IR senzoru na prekazku
-
 
333
            delay_ms(200);
-
 
334
         }
-
 
335
      }
-
 
336
   }
329
   }
337
 
330
 
338
   output_low(IRTX);   // Zapni LED na detekci prekazky
331
   output_low(IRTX);   // Zapni LED na detekci prekazky
339
 
332
 
340
   NightRider(1);    // Aby se poznalo, ze byl RESET
333
   NightRider(1);    // Zablikej, aby se poznalo, ze byl RESET
341
                     // taky se musi pockat, nez se rozjede kamera, nez se do ni zacnou posilat prikazy
334
                     // Zaroven se musi pockat, nez se rozjede kamera, nez se do ni zacnou posilat prikazy
342
 
335
 
343
   //... Nastaveni sonaru ...
336
   //... Nastaveni sonaru ...
344
   i2c_start();
337
   i2c_start();
345
   i2c_write(SONAR_ADR);
338
   i2c_write(SONAR_ADR);
346
   i2c_write(0x02);  // dosah
339
   i2c_write(0x02);  // dosah
347
   i2c_write(0x03);  // n*43mm
340
   i2c_write(0x03);  // n*43mm
348
   i2c_stop();
341
   i2c_stop();
349
   i2c_start();
342
   i2c_start();
350
   i2c_write(SONAR_ADR);
343
   i2c_write(SONAR_ADR);
351
   i2c_write(0x01);  // zesileni
344
   i2c_write(0x01);  // zesileni
352
   i2c_write(0x01);  // male, pro eliminaci echa z minuleho mereni
345
   i2c_write(0x01);  // male, pro eliminaci echa z minuleho mereni
353
   i2c_stop();
346
   i2c_stop();
354
 
347
 
355
// pro ladeni sonaru
-
 
356
/*
-
 
357
   while(true)
-
 
358
   {
-
 
359
         i2c_start();     // Sonar Ping
-
 
360
      i2c_write(0xE0);
-
 
361
      i2c_write(0x0);
-
 
362
      i2c_write(0x51);  // 50 mereni v palcich, 51 mereni v cm, 52 v us
-
 
363
      i2c_stop();
-
 
364
      delay_ms(100);
-
 
365
      i2c_start();     // Odraz ze sonaru
-
 
366
      i2c_write(0xE0);
-
 
367
      i2c_write(0x3);
-
 
368
      i2c_stop();
-
 
369
      i2c_start();
-
 
370
      i2c_write(0xE1);
-
 
371
      cas=i2c_read(0);
-
 
372
      i2c_stop();
-
 
373
      disp(cas);
-
 
374
   }
-
 
375
*/
-
 
376
 
-
 
377
   //... Nastaveni kamery ...
348
   //... Nastaveni kamery ...
378
   i2c_start();      // Soft RESET kamery
349
   i2c_start();      // Soft RESET kamery
379
   i2c_write(CAMERA_ADR);        // Adresa kamery
350
   i2c_write(CAMERA_ADR);        // Adresa kamery
380
   i2c_write(0x12);        // Adresa registru COMH
351
   i2c_write(0x12);        // Adresa registru COMH
381
   i2c_write(0x80 | 0x24); // Zapis ridiciho slova
352
   i2c_write(0x80 | 0x24); // Zapis ridiciho slova
382
   i2c_stop();
353
   i2c_stop();
383
 
354
 
384
   i2c_start();      // BW
355
   i2c_start();      // BW
385
   i2c_write(CAMERA_ADR);
356
   i2c_write(CAMERA_ADR);
386
   i2c_write(0x28);
357
   i2c_write(0x28);
387
   i2c_write(0b01000001);
358
   i2c_write(0b01000001);
388
   i2c_stop();
359
   i2c_stop();
389
 
360
 
390
/*
361
/*
391
   i2c_start();      // Contrast (nema podstatny vliv na obraz)
362
   i2c_start();      // Contrast (nema podstatny vliv na obraz)
392
   i2c_write(CAMERA_ADR);
363
   i2c_write(CAMERA_ADR);
393
   i2c_write(0x05);
364
   i2c_write(0x05);
394
   i2c_write(0xA0);  // 48h
365
   i2c_write(0xA0);  // 48h
395
   i2c_stop();
366
   i2c_stop();
396
 
367
 
397
   i2c_start();      // Band Filter (pokud by byl problem se zarivkama 50Hz)
368
   i2c_start();      // Band Filter (pokud by byl problem se zarivkama 50Hz)
398
   i2c_write(CAMERA_ADR);
369
   i2c_write(CAMERA_ADR);
399
   i2c_write(0x2D);
370
   i2c_write(0x2D);
400
   i2c_write(0x04 | 0x03);
371
   i2c_write(0x04 | 0x03);
401
   i2c_stop();
372
   i2c_stop();
402
*/
373
*/
403
 
374
 
404
   i2c_start();      // Fame Rate
375
   i2c_start();      // Fame Rate
405
   i2c_write(CAMERA_ADR);
376
   i2c_write(CAMERA_ADR);
406
   i2c_write(0x2B);
377
   i2c_write(0x2B);
407
   i2c_write(0x00);  // cca 17ms (puvodni hodnota 5Eh = 20ms)
378
   i2c_write(0x00);  // cca 17ms (puvodni hodnota 5Eh = 20ms)
408
   i2c_stop();
379
   i2c_stop();
409
 
380
 
410
   i2c_start();      // VSTRT
381
   i2c_start();      // VSTRT
411
   i2c_write(CAMERA_ADR);
382
   i2c_write(CAMERA_ADR);
412
   i2c_write(0x19);
383
   i2c_write(0x19);
413
   i2c_write(118);   // prostredni radka
384
   i2c_write(118);   // prostredni radka
414
   i2c_stop();
385
   i2c_stop();
415
 
386
 
416
   i2c_start();      // VEND
387
   i2c_start();      // VEND
417
   i2c_write(CAMERA_ADR);
388
   i2c_write(CAMERA_ADR);
418
   i2c_write(0x1A);
389
   i2c_write(0x1A);
419
   i2c_write(118);
390
   i2c_write(118);
420
   i2c_stop();
391
   i2c_stop();
421
 
392
 
422
   NightRider(1);    // Musi se dat cas kamere na AGC a AEC
393
   NightRider(1);    // Musi se dat cas kamere na AGC a AEC
423
 
394
 
424
   { // Mereni expozice
395
   { // Mereni expozice
425
      int8 t1,t2;
396
      int8 t1,t2;
426
 
397
 
427
      i2c_start();      // Brightness, zacni od uplne tmy
398
      i2c_start();      // Brightness, zacni od uplne tmy
428
      i2c_write(CAMERA_ADR);
399
      i2c_write(CAMERA_ADR);
429
      i2c_write(0x06);
400
      i2c_write(0x06);
430
      i2c_write(0);  // 80h default
401
      i2c_write(0);  // 80h default
431
      i2c_stop();
402
      i2c_stop();
432
      delay_ms(50);
403
      delay_ms(50);
433
 
404
 
434
      for(offset=0x04;offset<(255-0x04);offset+=0x04)   // Zacni od jasu 10h
405
      for(offset=0x04;offset<(255-0x04);offset+=0x04)   // Zacni od jasu 10h
435
      {
406
      {
436
         i2c_start();      // Brightness
407
         i2c_start();      // Brightness
437
         i2c_write(CAMERA_ADR);
408
         i2c_write(CAMERA_ADR);
438
         i2c_write(0x06);
409
         i2c_write(0x06);
439
         i2c_write(offset);  // 80h default
410
         i2c_write(offset);  // 80h default
440
         i2c_stop();
411
         i2c_stop();
441
         disp(offset);
412
         disp(offset);
442
         delay_ms(50);
413
         delay_ms(50);
443
 
414
 
444
         t1=0;
415
         t1=0;
445
         t2=0;
416
         t2=0;
446
         while(!input(HREF));    // Cekej nez se zacnou posilat pixely z radky
417
         while(!input(HREF));    // Cekej nez se zacnou posilat pixely z radky
447
         delay_ms(5);
418
         delay_ms(5);
448
         while(!input(HREF));    // Cekej nez se zacnou posilat pixely z radky
419
         while(!input(HREF));    // Cekej nez se zacnou posilat pixely z radky
449
         set_timer0(0);          // Vynuluj pocitadlo casu
420
         set_timer0(0);          // Vynuluj pocitadlo casu
450
         if(!input(PIX)) continue;
421
         if(!input(PIX)) continue;
451
         while(input(PIX));
422
         while(input(PIX));
452
         t1=get_timer0();    // Precti cas z citace casu hrany
423
         t1=get_timer0();    // Precti cas z citace casu hrany
453
         set_timer0(0);          // Vynuluj pocitadlo casu
424
         set_timer0(0);          // Vynuluj pocitadlo casu
454
         while(!input(PIX));
425
         while(!input(PIX));
455
         t2=get_timer0();
426
         t2=get_timer0();
456
 
427
 
457
         if((t1>60) && (t1<140) && (t2>5) && (t2<=10)) break; // Vidis, co mas?
428
         if((t1>60) && (t1<140) && (t2>5) && (t2<=10)) break; // Vidis, co mas?
458
 
429
 
459
         delay_ms(2);   // Preskoc druhou radku z kamery
430
         delay_ms(2);   // Preskoc druhou radku z kamery
460
      };
431
      };
461
      delay_ms(1000);   // Nech chvili na displayi zmerenou hodnotu
432
      delay_ms(1000);   // Nech chvili na displayi zmerenou hodnotu
462
   }
433
   }
463
 
434
 
464
   set_adc_channel(CERVENA);   // --- Kroutitko pro jas ---
435
   set_adc_channel(CERVENA);   // --- Kroutitko pro jas ---
465
   delay_ms(1);
436
   delay_ms(1);
466
   offset=read_adc();
437
   offset=read_adc();
467
   offset &= 0b11111100;   // Dva nejnizsi bity ignoruj
438
   offset &= 0b11111100;   // Dva nejnizsi bity ignoruj
468
//   offset += 0x70;         // Jas nebude nikdy nizsi
439
//   offset += 0x70;         // Jas nebude nikdy nizsi
469
   disp(offset);
440
   disp(offset);
470
   i2c_start();            // Brightness
441
   i2c_start();            // Brightness
471
   i2c_write(CAMERA_adr);
442
   i2c_write(CAMERA_adr);
472
   i2c_write(0x06);
443
   i2c_write(0x06);
473
   i2c_write(offset);  // 80h default
444
   i2c_write(offset);  // 80h default
474
   i2c_stop();
445
   i2c_stop();
475
   delay_ms(1000);   // Nech hodnotu chvili na displayi
446
   delay_ms(1000);   // Nech hodnotu chvili na displayi
476
 
447
 
477
   set_adc_channel(ZELENA);   // --- Kroutitko pro vykon motoru ---
448
   set_adc_channel(ZELENA);   // --- Kroutitko pro vykon motoru ---
478
   delay_ms(1);
449
   delay_ms(1);
479
   rr=read_adc()>>2; // 0-63  // Pokud by se zvetsil rozsah, tak zkontrolovat jakonasobeni!
450
   rr=read_adc()>>2; // 0-63  // Pokud by se zvetsil rozsah, tak zkontrolovat jakonasobeni!
480
   rrold=rr;
451
   rrold=rr;
481
 
452
 
482
   cas=CASAVR-CASMIN;   // Inicializace promenych, aby neslo servo za roh
453
   cas=CASAVR-CASMIN;   // Inicializace promenych, aby neslo servo za roh
483
                        // a aby se to rozjelo jeste dneska
454
                        // a aby se to rozjelo jeste dneska
484
   stav=start;          // Jsme na startu
455
   stav=start;          // Jsme na startu
485
   set_timer1(0);       // Vynuluj citac odometrie
456
   set_timer1(0);       // Vynuluj citac odometrie
486
   log=0;               // Zacatek logu v cerne skrince
457
   log=0;               // Zacatek logu v cerne skrince
487
   last_log_odo=0;      // Posledni zaznam odometrie do logu
458
   last_log_odo=0;      // Posledni zaznam odometrie do logu
488
 
459
 
489
   last_log=read_eeprom(EEMAX); // Kolik zaznamu mame od minule poznamenano?
460
//   ReadBlackBox();    // Vycteni zaznamu z Black Boxu
490
   bb=MAKE16(read_eeprom(1) & 0x7F,read_eeprom(0)); // Precti prvni zaznam
-
 
491
 
461
 
492
   odo1=ODODO1-BRZDNA_DRAHA;
462
   odo_cihla=ODODO_CIHLA-BRZDNA_DRAHA;
493
   odo2=ODODO2-BRZDNA_DRAHA;
463
   odo_tunel=ODODO_TUNEL-BRZDNA_DRAHA;
-
 
464
   odo_preruseni=ODODO_PRERUSENI-BRZDNA_DRAHA;
494
 
465
 
495
   // ........................... Hlavni smycka ................................
466
   // ........................... Hlavni smycka ................................
496
   while(true)
467
   while(true)
497
   {
468
   {
498
      int8 pom;
469
      int8 pom;
499
      int8 n;
470
      int8 n;
500
      int8 gap;
471
      int8 gap;
501
      int16 ododo;
472
      int16 ododo;
502
 
473
 
503
      gap=0;      // Vynuluj pocitadlo preruseni
474
      gap=0;      // Vynuluj pocitadlo preruseni
504
 
475
 
505
next_snap:
476
next_snap:
506
 
477
 
507
      pom=0;
478
      pom=0;
508
      disable_interrupts(GLOBAL);  //----------------------- Critical Section
479
      disable_interrupts(GLOBAL);  //----------------------- Critical Section
509
      while(input(HREF));     // Preskoc 1. radku
480
      while(input(HREF));     // Preskoc 1. radku
510
      while(!input(HREF));    // Cekej nez se zacnou posilat pixely z 2. radky
481
      while(!input(HREF));    // Cekej nez se zacnou posilat pixely z 2. radky
511
      set_timer0(0);          // Vynuluj pocitadlo casu
482
      set_timer0(0);          // Vynuluj pocitadlo casu
512
      while(input(HREF))      // Po dobu vysilani radky cekej na hranu W/B
483
      while(input(HREF))      // Po dobu vysilani radky cekej na hranu W/B
513
      {
484
      {
514
// !!!!Dodelat rozpoznani cerne cary napric pro zastaveni ?
485
// !!!!Dodelat rozpoznani cerne cary napric pro zastaveni ?
515
         if(!input(PIX))   // Pokud se X-krat za sebou precetla CERNA
486
         if(!input(PIX))   // Pokud se X-krat za sebou precetla CERNA
516
         if(!input(PIX))
487
         if(!input(PIX))
517
//         if(!input(PIX))
488
//         if(!input(PIX))
518
         {
489
         {
519
            pom=get_timer0();    // Precti cas z citace casu hrany
490
            pom=get_timer0();    // Precti cas z citace casu hrany
520
            break;
491
            break;
521
         };
492
         };
522
      };
493
      };
523
      while(input(HREF));      // Pockej na shozeni signalu HREF
494
      while(input(HREF));      // Pockej na shozeni signalu HREF
524
 
495
 
525
      if((pom<CASMAX) && (pom>CASMIN)) cas=pom;  // Orizni konce radku
496
      if((pom<CASMAX) && (pom>CASMIN)) cas=pom;  // Orizni konce radku
526
      // Na konci obrazovaho radku to blbne. Jednak chyba od apertury
497
      // Na konci obrazovaho radku to blbne. Jednak chyba od apertury
527
      // a vubec to nejak na kraji nefunguje.
498
      // a vubec to nejak na kraji nefunguje.
528
 
499
 
529
      output_high(SERVO);        // Odvysilani impuzu 1 az 2ms pro servo
500
      output_high(SERVO);        // Odvysilani impuzu 1 az 2ms pro servo
530
      delay_us(1000);
501
      delay_us(1000);
531
      delay_us(stred);
502
      delay_us(stred);
532
      delay_us(stred);
503
      delay_us(stred);
533
      delay_us(stred);
504
      delay_us(stred);
534
      delay_us(cas);
505
      delay_us(cas);
535
      delay_us(cas);
506
      delay_us(cas);
536
      output_low(SERVO);
507
      output_low(SERVO);
537
 
508
 
538
      // Elektronicky diferencial 1. cast
509
      // Elektronicky diferencial 1. cast
539
      if(cas<CASAVR) {r1=cas-CASMIN; r2=CASAVR-CASMIN;}; // Normovani vystupni hodnoty radkoveho snimace
510
      if(cas<CASAVR) {r1=cas-CASMIN; r2=CASAVR-CASMIN;}; // Normovani vystupni hodnoty radkoveho snimace
540
      if(cas==CASAVR) {r1=cas-CASMIN; r2=cas-CASMIN;};   // pro rizeni rychlosti motoru
511
      if(cas==CASAVR) {r1=cas-CASMIN; r2=cas-CASMIN;};   // pro rizeni rychlosti motoru
541
      if(cas>CASAVR) {r1=CASAVR-CASMIN; r2=CASMAX-cas;}; // Rozsah 1 az 92
512
      if(cas>CASAVR) {r1=CASAVR-CASMIN; r2=CASMAX-cas;}; // Rozsah 1 az 92
542
 
513
 
543
      enable_interrupts(GLOBAL);    //----------------------- End Critical Section
514
      enable_interrupts(GLOBAL);    //----------------------- End Critical Section
544
 
515
 
545
      if(pom==0) // Kamera nevidi caru, poznamenej to do logu
516
      if(pom==0) // Kamera nevidi caru, poznamenej to do logu
546
      {
517
      {
547
         if((cas>(CASMIN+30))&&(cas<(CASMAX-30))) // Nebyla minule cara moc u kraje?
518
         if((cas>(CASMIN+30))&&(cas<(CASMAX-30))) // Nebyla minule cara moc u kraje?
548
         if(last_log_odo<get_timer1()) // Aby nebyly zaznamy v logu prilis huste, musi se napred neco ujet od minuleho zaznamu
519
         if(last_log_odo<get_timer1()) // Aby nebyly zaznamy v logu prilis huste, musi se napred neco ujet od minuleho zaznamu
549
         {
520
         {
550
            gap++;
521
            gap++;
551
         }
522
         }
552
      }
523
      }
553
      else
524
      else
554
      {
525
      {
555
         if(gap>=2) // Trva preruseni cary alespon 2 snimky?
526
         if(gap>=2) // Trva preruseni cary alespon 2 snimky?
556
         {
527
         {
557
            timer_pom=get_timer1();          // Timer se musi vycist atomicky
-
 
558
            bb_l[log]=make8(timer_pom,0); // Zaznam
-
 
559
            bb_h[log]=make8(timer_pom,1);
-
 
560
            bb_f[log]=gap;
-
 
561
            last_log_odo=timer_pom+8;     // Dalsi mereni nejdrive po ujeti 24 cm
528
            LogLog(gap,8); // Dalsi mereni nejdrive po ujeti 24 cm
562
            if(log<MAXLOG) log++;         // Ukazatel na dalsi zaznam
-
 
563
            rr=rrold;      // Preruseni cary skoncilo, znovu jed Rozumnou Rychlosti
529
            rr=rrold;      // Preruseni cary skoncilo, znovu jed Rozumnou Rychlosti
564
         }
530
         }
565
         gap=0;
531
         gap=0;
-
 
532
      };
-
 
533
 
-
 
534
      if(input(PROXIMITY) && ((stav==jizda)||(stav==cihla))) // Tunel
-
 
535
      {
-
 
536
         if(last_log_odo<get_timer1()) // Aby nebyly zaznamy v logu prilis huste, musi se napred neco ujet od minuleho zaznamu
-
 
537
         {
-
 
538
            LogLog(0,16);   // Priznak tunelu; dalsi mereni nejdrive po ujeti 48 cm
-
 
539
            rr=rrold;      // Vjeli jsme do tunelu, znovu jed rychle      
566
      }
540
         }
-
 
541
      };
567
 
542
      
568
//ODODO
543
//ODODO
569
      ododo=get_timer1();
544
      ododo=get_timer1();
-
 
545
      if((ododo>odo_preruseni)&&(ododo<(odo_preruseni+8))) rr=RR_PRERUSENI;
570
      if((ododo>odo1)&&(ododo<(odo1+8))) rr=RR_PRERUSENI;
546
      if((ododo>odo_cihla)&&(ododo<(odo_cihla+8))) rr=RR_PRERUSENI;
571
      if((ododo>odo2)&&(ododo<(odo2+8))) rr=RR_PRERUSENI;
547
      if((ododo>odo_tunel)&&(ododo<(odo_tunel+8))) rr=RR_PRERUSENI;
572
 
548
 
573
      // Elektronicky diferencial 2. cast
549
      // Elektronicky diferencial 2. cast
574
      if (r1>(CASAVR-CASMIN-rr)) r1=(r1<<1)+rr-(CASAVR-CASMIN);     // Neco jako nasobeni
550
      if (r1>(CASAVR-CASMIN-rr)) r1=(r1<<1)+rr-(CASAVR-CASMIN);     // Neco jako nasobeni
575
      if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN);     // rozsah 1 az 92 pro rr=0
551
      if (r2>(CASAVR-CASMIN-rr)) r2=(r2<<1)+rr-(CASAVR-CASMIN);     // rozsah 1 az 92 pro rr=0
576
                                                                    // rozsah 1 az 154 pro rr=63
552
                                                                    // rozsah 1 az 154 pro rr=63
577
 
553
 
578
//      r1<<=1;     // Rychlost je dvojnasobna
554
//      r1<<=1;     // Rychlost je dvojnasobna
579
//      r2<<=1;     // Rozsah 2 az 184
555
//      r2<<=1;     // Rozsah 2 az 184 pro rr=0
580
 
556
 
581
      if ((stav==jizda)||(stav==cihla)||(stav==rozjezd)) //||(stav==pocihle))      // Jizda
557
      if ((stav==jizda)||(stav==cihla)||(stav==rozjezd)) //||(stav==pocihle))      // Jizda
582
      {
558
      {
583
         set_pwm1_duty(r1);
559
         set_pwm1_duty(r1);
584
         set_pwm2_duty(r2);
560
         set_pwm2_duty(r2);
585
      }
561
      }
586
      else
562
      else
587
      {
563
      {
588
         set_pwm1_duty(0);       // Zastaveni
564
         set_pwm1_duty(0);       // Zastaveni
589
         set_pwm2_duty(0);
565
         set_pwm2_duty(0);
590
      };
566
      };
591
 
567
 
592
      if((stav==rozjezd)&&(get_timer1()>10)) // musi ujet alespon 31cm
568
      if((stav==rozjezd)&&(get_timer1()>10)) // musi ujet alespon 31cm
593
      {
569
      {
594
         ext_int_edge(H_TO_L);         // Nastav podminky preruseni od cihly
570
         ext_int_edge(H_TO_L);         // Nastav podminky preruseni od cihly
595
         INT0IF=0;                     // Zruseni predesle udalosti od startera
571
         INT0IF=0;                     // Zruseni predesle udalosti od startera
596
         enable_interrupts(INT_EXT);
572
         enable_interrupts(INT_EXT);
597
         enable_interrupts(GLOBAL);
573
         enable_interrupts(GLOBAL);
598
         stav=jizda;
574
         stav=jizda;
599
      };
575
      };
600
 
576
 
601
      if(stav==start)         // Snimkuje, toci servem a ceka na start
577
      if(stav==start)         // Snimkuje, toci servem a ceka na start
602
      {
578
      {
603
         set_adc_channel(MODRA);    // Kroutitko na vystredeni predniho kolecka
579
         set_adc_channel(MODRA);    // Kroutitko na vystredeni predniho kolecka
604
         Delay_ms(1);
580
         Delay_ms(1);
605
         stred=read_adc();
581
         stred=read_adc();
606
         if(!input(PROXIMITY))
582
         if(!input(PROXIMITY))
607
         {
583
         {
608
            disp(0x80);
584
            disp(0x80);
609
            while(input(PROXIMITY)); // Cekej, dokud starter neda ruku pryc
585
            while(input(PROXIMITY)); // Cekej, dokud starter neda ruku pryc
610
            set_timer1(0);         // Vynuluj citac odometrie
586
            set_timer1(0);         // Vynuluj citac odometrie
611
            set_pwm1_duty(255);    // Rychly rozjezd  !!! Zkontrolovat na oscyloskopu
587
            set_pwm1_duty(255);    // Rychly rozjezd  !!! Zkontrolovat na oscyloskopu
612
            set_pwm2_duty(255);
588
            set_pwm2_duty(255);
613
            disp(0x01);
589
            disp(0x01);
614
            while(get_timer1()<=4) // Ujed alespon 12cm
590
            while(get_timer1()<=4) // Ujed alespon 12cm
615
            {
591
            {
616
               set_adc_channel(LMAX);    // Levy UV sensor
592
               set_adc_channel(LMAX);    // Levy UV sensor
617
               delay_us(40);
593
               delay_us(40);
618
               if(read_adc()<THR) {cas=CASMIN; break;};  // Prejeli jsme caru vlevo
594
               if(read_adc()<THR) {cas=CASMIN; break;};  // Prejeli jsme caru vlevo
619
               set_adc_channel(RMAX);    // Pravy UV sensor
595
               set_adc_channel(RMAX);    // Pravy UV sensor
620
               delay_us(40);
596
               delay_us(40);
621
               if(read_adc()<THR) {cas=CASMAX; break;};  // Prejeli jsme caru vpravo
597
               if(read_adc()<THR) {cas=CASMAX; break;};  // Prejeli jsme caru vpravo
622
               cas=CASAVR-CASMIN;    // Cara je rovne
598
               cas=CASAVR-CASMIN;    // Cara je rovne
623
            };
599
            };
624
            stav=rozjezd;
600
            stav=rozjezd;
625
         };
601
         };
626
      }
602
      }
627
 
603
 
628
      pom=0x80;    // Zobrazeni pozice cary na displayi
604
      pom=0x80;    // Zobrazeni pozice cary na displayi
629
      for(n=CASMAX/8; n<cas; n+=CASMAX/8) pom>>=1;
605
      for(n=CASMAX/8; n<cas; n+=CASMAX/8) pom>>=1;
630
      disp(pom);
606
      disp(pom);
631
 
607
 
632
      while(true) // Ve zbytku casu snimku cti krajni UV senzory a naraznik
608
      while(true) // Ve zbytku casu snimku cti krajni UV senzory a naraznik
633
      {
609
      {
634
         if(BUMPER) // Sakra, do neceho jsme narazili a nevideli jsme to!
610
         if(BUMPER) // Sakra, do neceho jsme narazili a nevideli jsme to!
635
         {
611
         {
636
            bum();
612
            bum();
637
            SaveLog(log-1);      // Zapis Black Boxu do EEPROM
613
            SaveLog(log-1);      // Zapis Black Boxu do EEPROM
638
            set_pwm1_duty(160);   // pomalu vpred
614
            set_pwm1_duty(160);   // pomalu vpred
639
            set_pwm2_duty(160);
615
            set_pwm2_duty(160);
640
            output_low(MOT_L);
616
            output_low(MOT_L);
641
            output_low(MOT_R);
617
            output_low(MOT_R);
-
 
618
            cas=CASAVR-CASMIN; 
642
         };
619
         };
643
         set_adc_channel(LMAX);    // Levy UV sensor
620
         set_adc_channel(LMAX);    // Levy UV sensor
644
         for(n=0;n<20;n++) if(input(HREF)) goto next_snap;
621
         for(n=0;n<20;n++) if(input(HREF)) goto next_snap;
645
         if(read_adc()<THR) cas=CASMIN;
622
         if(read_adc()<THR) cas=CASMIN;
646
         set_adc_channel(RMAX);    // Pravy UV sensor
623
         set_adc_channel(RMAX);    // Pravy UV sensor
647
         for(n=0;n<20;n++) if(input(HREF)) goto next_snap;
624
         for(n=0;n<20;n++) if(input(HREF)) goto next_snap;
648
         if(read_adc()<THR) cas=CASMAX;
625
         if(read_adc()<THR) cas=CASMAX;
649
      };
626
      };
650
   }
627
   }
651
}
628
}