37 extern uint8_t irFifoRead(
void);
38 extern void configTimer2(
void);
39 extern void configInputCapture1(
void);
40 extern void configOutputCapture1(
void);
41 extern uint8_t irFifoDataRdy(
void);
43 #define WHEEL_PWM_STEPS 10 //number of PWM steps
44 #define WHEEL_PWM_STEPSIZE 500 //in microseconds
48 #define BLOCKAGE_PRESENT 560 //1.8 V
49 #define BLOCKAGE_CLEAR 434 //1.4 V
53 uint8_t u8_leftPeriod,u8_rightPeriod ;
57 typedef struct tagFLAGBITS {
62 unsigned u1_irCmdFlag:
65 static volatile FLAGBITS flags;
68 #define WHEEL_LEFT_1A _LATB1
69 #define WHEEL_LEFT_2A _LATB3
70 #define WHEEL_LEFT_EN _LATB2
71 #define WHEEL_RIGHT_1A _LATB14
72 #define WHEEL_RIGHT_2A _LATB12
73 #define WHEEL_RIGHT_EN _LATB13
76 #define WHEEL_LEFT_FORWARD() { WHEEL_LEFT_1A = 1; WHEEL_LEFT_2A = 0; }
77 #define WHEEL_LEFT_REVERSE() { WHEEL_LEFT_1A = 0; WHEEL_LEFT_2A = 1; }
78 #define WHEEL_LEFT_STOP() { WHEEL_LEFT_1A = 0; WHEEL_LEFT_2A = 0; }
79 #define WHEEL_RIGHT_FORWARD() { WHEEL_RIGHT_1A = 1; WHEEL_RIGHT_2A = 0; }
80 #define WHEEL_RIGHT_REVERSE() { WHEEL_RIGHT_1A = 0; WHEEL_RIGHT_2A = 1; }
81 #define WHEEL_RIGHT_STOP() { WHEEL_RIGHT_1A = 0; WHEEL_RIGHT_2A = 0; }
83 static inline void configLeftWheel(
void) {
84 CONFIG_RB1_AS_DIG_OUTPUT();
85 CONFIG_RB2_AS_DIG_OUTPUT();
86 CONFIG_RB3_AS_DIG_OUTPUT();
89 static inline void configRightWheel(
void) {
90 CONFIG_RB12_AS_DIG_OUTPUT();
91 CONFIG_RB13_AS_DIG_OUTPUT();
92 CONFIG_RB14_AS_DIG_OUTPUT();
96 void _ISRFAST _T3Interrupt (
void) {
100 if ( u8_rightPeriod == WHEEL_PWM_STEPS || !u8_rightPeriod) {
103 }
else if (u8_rightPeriod >= u8_rightDC) WHEEL_RIGHT_EN = 0;
110 if ( u8_leftPeriod == WHEEL_PWM_STEPS || !u8_leftPeriod) {
113 }
else if (u8_leftPeriod >= u8_leftDC) WHEEL_LEFT_EN = 0;
120 if (u16_temp > BLOCKAGE_PRESENT ) flags.u1_obstacle = 1;
121 else if (u16_temp < BLOCKAGE_CLEAR) flags.u1_obstacle = 0;
122 AD1CON1bits.SAMP = 1;
125 void configTimer3(
void) {
128 T3CON = T3_OFF |T3_IDLE_CON | T3_GATE_OFF
144 void configWheels(
void) {
151 WHEEL_LEFT_FORWARD();
152 WHEEL_RIGHT_FORWARD();
156 #define CMD_STOP 0x36 //VCR stop button
157 #define CMD_SPEEDUP 0x29 //VCR pause button
158 #define CMD_SLOWDOWN 0x37 //VCR record button
159 #define CMD_FORWARD 0x35 //VCR play button
160 #define CMD_TURN_LEFT 0x32 //VCR rewind button
161 #define CMD_TURN_RIGHT 0x34 //VCR fast forward button
162 #define CMD_REVERSE 0x05 //VCR numeral 5
163 #define CMD_SPIN 0x09 //VCR numeral 9
164 #define CMD_MODESWAP 0x01 //VCR numeral 1
167 #define DEFAULT_SPEED 4
168 #define DEFAULT_SPEED 4
171 void doSpeedUp(
uint8_t u8_speed) {
178 }
while (u8_leftDC < u8_speed);
183 while (u8_leftDC || u8_rightDC) {
184 if (u8_leftDC) u8_leftDC--;
185 if (u8_rightDC) u8_rightDC--;
190 void goForward(
uint8_t u8_speed) {
191 WHEEL_LEFT_FORWARD();
192 WHEEL_RIGHT_FORWARD();
196 void goReverse(
uint8_t u8_speed) {
197 WHEEL_LEFT_REVERSE();
198 WHEEL_RIGHT_REVERSE();
202 void processCmd(
uint8_t u8_cmd) {
205 if (u8_leftDC < WHEEL_PWM_STEPS) u8_leftDC += 1;
206 if (u8_rightDC < WHEEL_PWM_STEPS) u8_rightDC += 1;
209 if (u8_leftDC) u8_leftDC -= 1;
210 if (u8_rightDC) u8_rightDC -= 1;
217 goForward(DEFAULT_SPEED);
221 goReverse(DEFAULT_SPEED);
224 if (u8_leftDC) u8_leftDC -= 1;
227 if (u8_rightDC) u8_rightDC -= 1;
231 WHEEL_LEFT_FORWARD();
232 WHEEL_RIGHT_REVERSE();
233 doSpeedUp(DEFAULT_SPEED);
237 flags.u1_mode = !flags.u1_mode;
247 u8_cmd = irFifoRead();
248 if (u8_x & 0x20)
outString(
"Toggle = 1, ");
255 if (flags.u1_irCmdFlag) flags.u1_irCmdFlag = 0;
256 else flags.u1_irCmdFlag = 1;
257 if (flags.u1_irCmdFlag)
return u8_cmd;
263 if (irFifoDataRdy()) {
272 while ((u8_leftDC != u8_ltarg) ||
273 (u8_rightDC != u8_rtarg) ) {
274 if (u8_leftDC != u8_ltarg) u8_leftDC++;
275 if (u8_rightDC != u8_rtarg) u8_rightDC++;
281 void autoDrive(
void) {
282 if (flags.u1_obstacle) {
285 WHEEL_LEFT_REVERSE();
286 WHEEL_RIGHT_REVERSE();
287 doSpeedUp(BACK_SPEED);
293 WHEEL_LEFT_FORWARD();
294 WHEEL_RIGHT_FORWARD();
295 doTurn(BACK_SPEED,2);
297 doSpeedUp(DEFAULT_SPEED);
298 }
else if (u8_leftDC != DEFAULT_SPEED ||
299 u8_rightDC != DEFAULT_SPEED ) {
300 WHEEL_LEFT_FORWARD();
301 WHEEL_RIGHT_FORWARD();
302 doSpeedUp(DEFAULT_SPEED);
308 CONFIG_AN1_AS_ANALOG();
312 configInputCapture1();
316 if (flags.u1_mode == AUTO_DRIVE) autoDrive();