Professional Documents
Culture Documents
+5V
+5V
Vin
Vout
VIN D3 1N4007 R2 1K
VOUT
C1 2200uf (25V)
U1 LM317
U2 LM7805
GND
R1 470
Adj
C2 220uf
D6 PWR
R3 20K
R4 1K
Buzzer R7 100
LS1
Buzzer
+5V
+5V
+5V
+5V
R6 470
D6 LED
Sw_Up
Sw_Down
+5V
+5V
+5V
+5V
D8 LED
R21 22K
1
2
D9 LED
R22 22K
+5V
+5V
DIS
VCC
C3 3 104
LS1
Q THR TR U1 NE555
Tx
GND
CV
***************************************/ //#define ICD_DEBUG uns8 vblEncPulseHigh; uns16 vblEncValue; uns16 uns8 uns8 uns16 uns16 MSec; Sec; Min; DelaySec; DelayMSec;
#include "intr.h" #pragma codepage 1 #include "FuncLib.h" #pragma codepage 0 #include "init.h" uns16 ADC_Read(uns8 ChannelNo); void Read_Switches(); void FunContinuousSetMode(); void FunDistanceSetMode(); //****** Main Function *********** void main() { myDiv(vblCurrDistance , 100 , &b, &r); RobotDistanceBuff[3] = Convert_Des2Asc(b); myDiv(r , 10 , &b, &r); RobotDistanceBuff[4] = Convert_Des2Asc(b); RobotDistanceBuff[5] = Convert_Des2Asc(r); nop(); LCD_Out(1, 0, "MODE : Dist Set"); LCD_Out(2, 0, "SET:"); LCD_Chr_Cp(RobotDistanceBuff[0]); LCD_Chr_Cp(RobotDistanceBuff[1]); LCD_Chr_Cp('.'); LCD_Chr_Cp(RobotDistanceBuff[2]); LCD_Chr_Cp(','); nop(); FunDistanceSetMode(); //State = ReadSwitches; break;
} } } } //************* Dis Set Mode Fuction ******************** void FunDistanceSetMode() { uns16 tmpADCvalue; nop(); tmpADCvalue = ADC_Read(0); vblLDRvalue_L = tmpADCvalue; nop(); tmpADCvalue = ADC_Read(1); vblLDRvalue_R = tmpADCvalue; nop(); if((vblLDRvalue_L > 200)&&(vblLDRvalue_R < 200)) { Rly_Motor_L = 1; Rly_Motor_R = 0; DelayMSec = 100; while(DelayMSec != 0); State = ContinuousSetMode; } else if((vblLDRvalue_L < 200)&&(vblLDRvalue_R > 200)) { Rly_Motor_L = 0; Rly_Motor_R = 1; DelayMSec = 100; while(DelayMSec != 0); State = ContinuousSetMode; } else if((vblLDRvalue_L > 200)&&(vblLDRvalue_R > 200)) { Rly_Motor_L = 1; Rly_Motor_R = 1; DelayMSec = 100; while(DelayMSec != 0); State = ContinuousSetMode; } else // No white line found { myDiv(r , 10 , &b, &r); RobotDistanceBuff[4] = Convert_Des2Asc(b); RobotDistanceBuff[5] = Convert_Des2Asc(r); nop();
LCD_Out(2, 0, "SET:"); LCD_Chr_Cp(RobotDistanceBuff[0]); LCD_Chr_Cp(RobotDistanceBuff[1]); LCD_Chr_Cp('.'); LCD_Chr_Cp(RobotDistanceBuff[2]); LCD_Chr_Cp(','); LCD_Chr_Cp('C'); LCD_Chr_Cp('U'); LCD_Chr_Cp(':'); LCD_Chr_Cp(RobotDistanceBuff[3]); LCD_Chr_Cp(RobotDistanceBuff[4]); LCD_Chr_Cp('.'); LCD_Chr_Cp(RobotDistanceBuff[5]); nop(); if(vblSetDistance <= vblCurrDistance) { Rly_Motor_L = 0; Rly_Motor_R = 0; Buzzer = 1; LCD_Cmd(_LCD_CLEAR); LCD_Out(1, 0, "Robot Stop"); DelaySec = 5; while(DelaySec != 0); Buzzer = 0; State = ReadSwitches; } else if((Rly_Motor_L == 0)&&(Rly_Motor_R == 0)) { State = ReadSwitches; nop(); } else nop(); tmpADCvalue = ADC_Read(0); vblLDRvalue_L = tmpADCvalue; nop(); tmpADCvalue = ADC_Read(1); vblLDRvalue_R = tmpADCvalue; nop(); if(( )) { Rly_Motor_L = 1; Rly_Motor_R = 1; DelayMSec = 100;
while(DelayMSec != 0); State = ContinuousSetMode; } else { // No white line found Rly_Motor_L = 0; Rly_Motor_R = 0; Buzzer = 1; LCD_Cmd(_LCD_CLEAR); LCD_Out(1, 0, "Whiteline Over"); DelaySec = 5; while(DelaySec != 0); Buzzer = 0; State = ReadSwitches; nop(); } vblCurrDistance = vblEncValue / 5; myDiv(vblCurrDistance , 100 , &b, &r); RobotDistanceBuff[3] = Convert_Des2Asc(b); myDiv( LCD_Cmd(_LCD_CLEAR); LCD_Out(1, 0, "Obstacle Detected"); while(Obstacle_Sensor == 0); LCD_Cmd(_LCD_CLEAR); LCD_Out(1, 0, "Obstacle Clear"); DelaySec = 5; while(DelaySec != 0); LCD_Out(1, 0, "MODE: Cons Set "); } } //--------------------------------void Read_Switches() { nop(); State = ReadSwitches; if((Sw_Up == 0)&&(Sw_Down == 0)) {
// Change mode
} if((Sw_Up == 0)&&(Sw_Down == 1)) // Up switch { DelaySec = 3; while((DelaySec != 0)&&(Sw_Up == 0)); if(DelaySec == 0) // Robot go {
vblCurrDistance = 0; vblEncValue = 0; if(vblRobotMode == 0) State = ContinuousSetMode; else State = DistanceSetMode; nop(); } else { if(vblSetDistance < 1000) vblSetDistance++; } LCD_Out(1, 0, "Robot Start "); while(Sw_Up == 0); } if((Sw_Up == 1)&&(Sw_Down == 0)) // Down switch { DelaySec = 3; while((DelaySec != 0)&&(Sw_Down == 0)); if(DelaySec == 0) // Mode change { if(vblRobotMode == 0) vblRobotMode = 1; else vblRobotMode = 0; nop(); } else { if(vblSetDistance > 0) vblSetDistance--; } if(vblRobotMode == 1) LCD_Out(1, 0, "MODE: Dist Set "); else LCD_Out(1, 0, "MODE: Cons Set "); while(Sw_Down == 0); } if(vblRobotMode == 1) { myDiv(r , 10 , &b, &r); RobotDistanceBuff[1] = Convert_Des2Asc(b); RobotDistanceBuff[2] = Convert_Des2Asc(r); nop(); myDiv(vblCurrDistance , 100 , &b, &r); RobotDistanceBuff[3] = Convert_Des2Asc(b); myDiv(r , 10 , &b, &r); RobotDistanceBuff[4] = Convert_Des2Asc(b); RobotDistanceBuff[5] = Convert_Des2Asc(r); nop(); LCD_Out(2, 0, "SET:"); LCD_Chr_Cp(RobotDistanceBuff[0]);
LCD_Chr_Cp(RobotDistanceBuff[1]); LCD_Chr_Cp('.'); LCD_Chr_Cp(RobotDistanceBuff[2]); LCD_Chr_Cp(','); LCD_Chr_Cp('C'); LCD_Chr_Cp('U'); LCD_Chr_Cp(':'); LCD_Chr_Cp(RobotDistanceBuff[3]); LCD_Chr_Cp(RobotDistanceBuff[4]); LCD_Chr_Cp('.'); LCD_Chr_Cp(RobotDistanceBuff[5]); nop(); } else { LCD_Out(1, 0, "MODE: Cons Set "); myDiv(vblCurrDistance , 100 , &b, &r); RobotDistanceBuff[3] = Convert_Des2Asc(b); myDiv(r , 10 , &b, &r); RobotDistanceBuff[4] = Convert_Des2Asc(b); RobotDistanceBuff[5] = Convert_Des2Asc(r); nop(); LCD_Out(2, 0, " ");
//------- Read Analog Input ----------------------uns16 ADC_Read(uns8 ChannelNo) { uns8 tmpNoOfSample; GIE PEIE = 1; = 1;
//-----Other init---------MSec = 0; Sec = 0; vblRobotMode = 1; vblEncPulseHigh = 0; vblEncValue = 0; State = ReadSwitches; } // CODE : Above 2048 words (PCLATH is saved) // RAM : Located in bank 0 and 1 (no mapping between bank 0 and 1) #define int_save_registers \ #pragma char s1_save = 0x20 \ #pragma char s1_savX = 0xA0 \ #pragma rambank 0 \ char s2, s3; \ #pragma update_RP 0 \ s1_save = W; \ W = swap( STATUS); \ RP0 = 0; \ #pragma update_RP 1 \ s2 = W; \ s3 = PCLATH; \ PCLATH = 0; #define int_restore_registers \ PCLATH = s3; \ W = swap( s2); \ #pragma update_RP 0 \ STATUS = W; \ s1_save = swap( s1_save); \ W = swap( s1_save); \ #pragma update_RP 1 uns16 Counter; #pragma origin 0x04 //interrupt vector address
interrupt serverX(void) { int_save_registers char sv_FSR = FSR; // save FSR if required if(TMR1IF==1) { TMR1IF=0;
TMR1ON = 0; TMR1L = t1l; TMR1H = t1h; TMR1ON = 1; if(DelayMSec != 0) DelayMSec--; if(vblEncPulseHigh == 0) // pulse off time { if(Encoder_Sensor == 1) { vblEncPulseHigh = 1; if(vblEncValue < 65000) vblEncValue++; } } else { if(Encoder_Sensor == 0) { vblEncPulseHigh = 0; } } if(MSec < 999) { MSec++; } else { MSec =0; if(DelaySec != 0) DelaySec--; if(Sec < 60) Sec++; else // After 1 Minute { Sec = 0; if(Min < 60) Min++; else { Min = 0; } } } nop(); } FSR = sv_FSR; // restore FSR if saved int_restore_registers }