Subversion Repositories svnkaklik

Rev

Details | Last modification | View Log

Rev Author Line No. Line
1 kaklik 1
#include ".\main.h"
2
 
3
#use rtos (timer=2, minor_cycle=2ms)
4
 
5
#define  STRED       128      // sredni poloha zadniho kolecka
6
#define  BEAR1       12       // 3 stupne zataceni
7
#define  BEAR2       34
8
#define  BEAR3       70
9
#define  SPEEDMAX    120      // maximalni rychlost
10
 
11
#define  L           1
12
#define  S           2
13
#define  R           0
14
 
15
// servo
16
#define  SERVO PIN_A2
17
 
18
// IR
19
#define IRTX      PIN_B2
20
 
21
//motory
22
#define  FR         output_low(PIN_A7); output_high(PIN_A6)  // Vpred
23
#define  FL         output_low(PIN_A1); output_high(PIN_A0)
24
#define  BR         output_low(PIN_A6); output_high(PIN_A7)  // Vzad
25
#define  BL         output_low(PIN_A0); output_high(PIN_A1)
26
#define  STOPR      output_low(PIN_A6);output_low(PIN_A7)
27
#define  STOPL      output_low(PIN_A0);output_low(PIN_A1)
28
 
29
//HID
30
#define  LED1     PIN_B1      //oranzova
31
#define  LED2     PIN_B2      //zluta
32
 
33
#define  STROBE   PIN_B0
34
//#define  SW1      PIN_A2      // Motory On/off
35
 
36
unsigned int8 sensors;        // pomocna promenna pro cteni cidel na caru
37
unsigned int8 line;           // na ktere strane byla detekovana cara
38
//unsigned int8 dira;           // pocita dobu po kterou je ztracena cara
39
unsigned int8 uhel;           // urcuje aktualni uhel zataceni
40
//unsigned int8 speed;          // maximalni povolena rychlost
41
unsigned int8 rovinka;        // pocitadlo na zjisteni rovinky
42
 
43
signed int16  Lmotor;         // promene, ktere urcuji velikost vykonu na levem
44
signed int16  Rmotor;         // a pravem motoru
45
 
46
// makro pro PWM
47
#define GO(motor, direction, power) if(get_timer0()<=power) \
48
{direction##motor;} else {stop##motor;}
49
 
50
////////////////////////////////////////////////////////////////////////////////
51
////////////////////////////////////////////////////////////////////////////////
52
/*
53
void diagnostika()
54
{
55
   if(input(SW1))STOPR;STOPL;While(TRUE);
56
//   if(LSENSOR==true) output_high(LED2); else output_low(LED2);
57
//   if(RSENSOR==true) output_high(LED1); else output_low(LED1);
58
}
59
*/
60
////////////////////////////////////////////////////////////////////////////////
61
#task (rate=18ms,max=2ms)
62
void zatoc()   // ridi servo ktere otaci kolem
63
{
64
   unsigned int8 n;
65
 
66
   output_high(SERVO);
67
   delay_us(1100);
68
   for(n=uhel; n>0; n--);
69
   output_low(SERVO);
70
}
71
 
72
////////////////////////////////////////////////////////////////////////////////
73
void diag()   // ridi servo ktere otaci kolem
74
{
75
   unsigned int8 n;
76
 
77
   output_high(SERVO);
78
   delay_us(1100);
79
   for(n=uhel; n>0; n--);
80
   output_low(SERVO);
81
}
82
 
83
////////////////////////////////////////////////////////////////////////////////
84
short int IRcheck()                 // potvrdi detekci cihly
85
{
86
   output_high(IRTX);               // vypne vysilac IR
87
 
88
   output_low(STROBE);
89
   sensors = spi_read(0);         // cteni senzoru
90
   output_high(STROBE);
91
 
92
   if(true==bit_test(sensors,7))    // otestuje, jestli je stale detekovan IR signal
93
   {
94
      output_low(IRTX);             // zapne vysilac IR
95
 
96
      output_low(STROBE);
97
      sensors = spi_read(0);         // cteni senzoru
98
      output_high(STROBE);
99
 
100
      if(false==bit_test(sensors,7))      // otestuje, jestli je detekovana cihla
101
      {
102
         output_high(IRTX);            // vypne vysilac IR
103
 
104
         output_low(STROBE);
105
         sensors = spi_read(0);         // cteni senzoru
106
         output_high(STROBE);
107
 
108
         if(bit_test(sensors,7)) return 1; //
109
 
110
         else return 0; // vrat 0 kdyz je ruseni
111
      }
112
      else return 0; // vrat 0 kdyz to nebyla cihla
113
   }
114
   else return 0; // vrat 0 kdyz je detekovano ruseni
115
}
116
////////////////////////////////////////////////////////////////////////////////
117
/*
118
#task (rate=4ms, max=20us)
119
void rychlost()
120
{
121
   if(speed<255) speed++;
122
}
123
*/
124
////////////////////////////////////////////////////////////////////////////////
125
#task (rate=2ms, max=1ms)
126
void rizeni()
127
{
128
   unsigned int16 n;
129
   unsigned int8 i;
130
 
131
   GO(L,F,Lmotor);GO(R,F,Rmotor); // zapni motory
132
 
133
   delay_us(500);
134
 
135
   output_low(STROBE);
136
   sensors = spi_read(0);         // cteni senzoru
137
   sensors=~sensors;
138
   output_high(STROBE); 
139
 
140
   i=0;                    // havarijni kod   
141
   for (n=0; n<=6; n++)
142
   {
143
      if(bit_test(sensors,n)) i++;
144
   }
145
   if (i>3) rtos_terminate(); // zastavi, kdyz je cerno pod vice nez tremi cidly
146
 
147
 
148
   if(bit_test(sensors,3)) //...|...//
149
   {
150
      uhel=STRED;
151
      Lmotor=SPEEDMAX;
152
      Rmotor=SPEEDMAX;
153
      line=S;
154
      if (rovinka<255) rovinka++;
155
      return;
156
   }
157
 
158
   if(bit_test(sensors,0)) //|......//     // z duvodu zkraceni doby reakce se cidla nevyhodnocuji poporade ale od krajnich k prostrednimu
159
   {
160
      uhel=STRED-BEAR3;
161
      Lmotor=0;
162
      Rmotor=SPEEDMAX;
163
      line=L;
164
      return;
165
   }
166
 
167
   if(bit_test(sensors,6)) //......|//
168
   {
169
      uhel=STRED+BEAR3;
170
      Rmotor=0;
171
      Lmotor=SPEEDMAX;
172
      line=R;
173
      return;
174
 
175
   }
176
 
177
   if(bit_test(sensors,1)) //.|.....//
178
   {
179
      uhel=STRED-BEAR2;
180
      Lmotor=SPEEDMAX-50;
181
      Rmotor=SPEEDMAX;
182
      line=S;
183
      return;
184
   }
185
 
186
   if(bit_test(sensors,5)) //.....|.//
187
   {
188
      uhel=STRED+BEAR2;
189
      Rmotor=SPEEDMAX-50;
190
      Lmotor=SPEEDMAX;
191
      line=S;
192
      return;
193
   }
194
 
195
   if (bit_test(sensors,2)) //..|....//
196
   {
197
      uhel=STRED-BEAR1;
198
      Lmotor=SPEEDMAX;
199
      Rmotor=SPEEDMAX;
200
      line=S;
201
      if (rovinka<255) rovinka++;
202
      return;
203
   }
204
 
205
   if (bit_test(sensors,4)) //....|..//
206
   {
207
      uhel=STRED+BEAR1;
208
      Rmotor=SPEEDMAX;
209
      Lmotor=SPEEDMAX;
210
      line=S;
211
      if (rovinka<255) rovinka++;
212
      return;
213
   }
214
 
215
   if ((L==line) || (R==line)) // Brzdeni pri vyjeti z trate
216
   {
217
      if (rovinka>250)
218
      {
219
         BL; BR;
220
         for(n=1; n<(60); n++) {rtos_yield(); delay_us(500);};
221
      };
222
      rovinka=0;
223
   }
224
 
225
   if(bit_test(sensors,7))       // zjisti jestli neni cihla
226
   {
227
      rtos_terminate();
228
   }
229
}
230
 
231
 
232
 
233
////////////////////////////////////////////////////////////////////////////////
234
void main()
235
{
236
   unsigned int16 i;
237
   unsigned int8 last;
238
 
239
   setup_adc_ports(NO_ANALOGS);
240
   setup_adc(ADC_CLOCK_INTERNAL);
241
    setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_XMIT_L_TO_H|SPI_CLK_DIV_4);
242
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
243
   setup_timer_1(T1_DISABLED);
244
   setup_oscillator(OSC_8MHZ|OSC_INTRC);
245
 
246
   STOPR; STOPL;  // zastav motory
247
   Lmotor=0;Rmotor=0;
248
 
249
   uhel=STRED;    // nastav zadni kolecko na stred
250
   rovinka=0;
251
 
252
   output_low(IRTX); // zapni IR vysilac
253
 
254
   for(i=0;i<100;i++)   // pockej, nez se zadni kolecko vystredi
255
   {
256
      diag();
257
      delay_ms(16);
258
   }
259
//      diagnostika();
260
 
261
   while(true)
262
   {
263
      rtos_run();
264
      STOPR;
265
      STOPL;
266
      while(true);
267
   }
268
}