00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "asuro.h"
00023 #include <stdlib.h>
00024
00025 #define OFFSET 0x3F
00026 #define STEP 5
00027
00028 #define RWD_KEY '2'
00029 #define FWD_KEY '8'
00030 #define LEFT_KEY '4'
00031 #define RIGHT_KEY '6'
00032 #define STOP_KEY '5'
00033
00034 volatile unsigned char switchPressed;
00035 int speedLeft,speedRight;
00036
00037 SIGNAL (SIG_INTERRUPT1)
00038 {
00039 unsigned int i;
00040
00041 DDRD |= SWITCHES;
00042 SWITCH_ON;
00043 ADMUX = (1 << REFS0) | SWITCH;
00044 for (i = 0; i < 0xFE; i++);
00045
00046 ADCSRA |= (1 << ADSC);
00047 while (!(ADCSRA & (1 << ADIF)));
00048 ADCSRA |= (1 << ADIF);
00049 i = ADCL + (ADCH << 8);
00050
00051
00052 MotorDir(RWD,RWD);
00053 MotorSpeed(200,200);
00054 FrontLED(ON);
00055 BackLED(ON,ON);
00056 for (i = 0; i < 0xFFFD; i++);
00057
00058 switchPressed = TRUE;
00059 SWITCH_OFF;
00060 DDRD &= ~SWITCHES;
00061 }
00062
00063 void PCFwd(void)
00064 {
00065 speedRight += STEP;
00066 speedLeft += STEP;
00067 if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
00068 if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
00069 FrontLED(ON);
00070 BackLED(OFF,OFF);
00071 }
00072
00073 void PCRwd(void)
00074 {
00075 speedRight -= STEP;
00076 speedLeft -= STEP;
00077 if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;
00078 if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
00079 FrontLED(OFF);
00080 BackLED(ON,ON);
00081 }
00082
00083 void PCLeft (void)
00084 {
00085 speedLeft -= STEP;
00086 if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
00087 speedRight += STEP;
00088 if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
00089 FrontLED(OFF);
00090 BackLED(ON,OFF);
00091 }
00092
00093 void PCRight (void)
00094 {
00095 speedLeft += STEP;
00096 if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
00097 speedRight -= STEP;
00098 if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;
00099 FrontLED(OFF);
00100 BackLED(OFF,ON);
00101 }
00102
00103
00104 void PCStop(void)
00105 {
00106 speedRight = speedLeft = 0;
00107 FrontLED(OFF);
00108 BackLED(OFF,OFF);
00109 }
00110
00111
00112 void PCDemo(void)
00113 {
00114 unsigned char cmd;
00115 unsigned char leftDir = FWD, rightDir = FWD;
00116
00117 Init();
00118 StartSwitch();
00119 sei();
00120 for (;;)
00121 {
00122 cmd = 0;
00123 SerRead(&cmd,1,0xFFFE);
00124 switch (cmd)
00125 {
00126 case RWD_KEY :
00127 PCRwd();
00128 break;
00129 case FWD_KEY :
00130 PCFwd();
00131 break;
00132 case LEFT_KEY :
00133 PCLeft();
00134 break;
00135 case RIGHT_KEY :
00136 PCRight();
00137 break;
00138 case STOP_KEY :
00139 PCStop();
00140 break;
00141 }
00142 if (speedLeft > 0 && speedLeft < OFFSET) speedLeft += OFFSET;
00143 if (speedLeft < 0 && speedLeft > -OFFSET) speedLeft -= OFFSET;
00144 if (speedRight > 0 && speedRight < OFFSET) speedRight += OFFSET;
00145 if (speedRight < 0 && speedRight > -OFFSET) speedRight -= OFFSET;
00146
00147 if (switchPressed)
00148 {
00149 speedLeft = 0;
00150 speedRight = 0;
00151 switchPressed = FALSE;
00152 }
00153
00154 leftDir = rightDir = FWD;
00155 if (speedLeft < 0) leftDir = RWD;
00156 if (speedRight < 0) rightDir = RWD;
00157
00158 if (speedLeft > 255) speedLeft = 255;
00159 if (speedLeft < -255) speedLeft = -255;
00160 if (speedRight > 255) speedRight = 255;
00161 if (speedRight < -255) speedRight = -255;
00162
00163 MotorDir(leftDir,rightDir);
00164 MotorSpeed(abs(speedLeft),abs(speedRight));
00165 }
00166 }
00167
00168