'------------------------------------------------- ' Name : Biped-explore.bas ' Compiler : PicBasic Pro MicroEngineering Labs ' Notes : biped Robot exploration program '------------------------------------------------- @ DEVICE PIC16F819, INTRC_OSC_NOCLKOUT, WDT_OFF, LVP_OFF, PWRT_ON, PROTECT_OFF, BOD_OFF include "modedefs.bas" TRISA = %00011111 TRISB = %00000000 DEFINE OSC 8 OSCCON = $70 M1 Var PORTB.0 M2 Var PORTB.1 M3 Var PORTB.2 M4 Var PORTB.3 LED1 VAR PORTB.4 LED2 var PORTB.5 PIEZO var PORTB.6 LCD VAR PORTB.7 LCD_BAUD CON N2400 lOW M1 LOW M2 LOW M3 LOW M4 low LED1 low LED2 low PIEZO LEFT_POT VAR BYTE RIGHT_POT VAR BYTE LEG_STOP_F VAR BYTE LEG_STOP_R VAR BYTE INFRARED VAR BYTE VARIANCE VAR BYTE TEMP VAR BYTE FLAG VAR bit LEG_STOP_F = 128 LEG_STOP_R = 119 VARIANCE = 1 FLAG = 0 ' Set up the analog to digital converters DEFINE ADC_BITS 8 ' Set number of bits in result DEFINE ADC_CLOCK 1 ' Set clock source (1 = internal 8 MHz, 3 = rc) DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds ADCON1 = 0 ' Set porta pins to analog sound PIEZO,[100,10,90,5,80,5,110,10] START: sound PIEZO,[100,5,110,5] LOW LED1 HIGH LED2 GOSUB LEFT_FORWARD sound PIEZO,[80,5,90,5] LOW LED2 HIGH LED1 GOSUB RIGHT_FORWARD ADCIN 2,INFRARED IF INFRARED > 100 AND INFRARED < 130 THEN sound PIEZO,[100,10,90,5,100,5,110,10,80,20,90,20] FLAG = FLAG +1 FOR TEMP = 1 TO 5 GOSUB LEFT_REVERSE GOSUB RIGHT_REVERSE NEXT TEMP IF FLAG Then FOR TEMP = 1 TO 5 GOSUB LEFT_REVERSE GOSUB RIGHT_FORWARD NEXT TEMP Else FOR TEMP = 1 TO 5 GOSUB RIGHT_REVERSE GOSUB LEFT_FORWARD NEXT TEMP Endif ENDIF GOTO START END ' motor control subroutines start here '------------------------------------------------------------- RIGHT_FORWARD: RIGHT_POT = 0 lOW M1 LOW M2 HIGH M2 PAUSE 400 WHILE RIGHT_POT < (LEG_STOP_F - VARIANCE) OR RIGHT_POT > (LEG_STOP_F + VARIANCE) ADCIN 1,RIGHT_POT WEND LOW M2 RETURN RIGHT_REVERSE: RIGHT_POT = 0 lOW M1 LOW M2 HIGH M1 PAUSE 300 WHILE RIGHT_POT < (LEG_STOP_R - VARIANCE) OR RIGHT_POT > (LEG_STOP_R + VARIANCE) ADCIN 1,RIGHT_POT WEND LOW M1 RETURN LEFT_FORWARD: LEFT_POT = 0 lOW M3 LOW M4 HIGH M3 PAUSE 400 WHILE LEFT_POT < (LEG_STOP_F - VARIANCE) OR LEFT_POT > (LEG_STOP_F + VARIANCE) ADCIN 0,LEFT_POT WEND LOW M3 RETURN LEFT_REVERSE: LEFT_POT = 0 lOW M3 LOW M4 HIGH M4 PAUSE 300 WHILE LEFT_POT < (LEG_STOP_R - VARIANCE) OR LEFT_POT > (LEG_STOP_R + VARIANCE) ADCIN 0,LEFT_POT WEND LOW M4 RETURN ' LCD display analog-to-digital converter values '------------------------------------------------------------- CALIBRATE: ADCIN 0,LEFT_POT ' read A/D converter - porta.pin 0 serout LCD,LCD_BAUD,[254,128,"L:",#LEFT_POT," "] ADCIN 1,RIGHT_POT ' read A/D converter - porta.pin serout LCD,LCD_BAUD,[254,134,"R:",#RIGHT_POT," "] ADCIN 2,INFRARED ' read A/D converter - porta.pin 2 serout LCD,LCD_BAUD,[254,192,"IR:",#INFRARED," "] RETURN