' ========================================================================= ' ' File...... PSX_BOE_Bot.BS2 ' Purpose... PlayStation Control of BOE-Bot ' Author.... Jon Williams ' E-mail.... jwilliams@parallax.com ' Started... ' Updated... 17 JUL 2003 ' ' {$STAMP BS2} ' {$PBASIC 2.5} ' ' ========================================================================= ' -----[ Program Description ]--------------------------------------------- ' -----[ Revision History ]------------------------------------------------ ' -----[ I/O Definitions ]------------------------------------------------- LMotor PIN 13 ' servo motor connections RMotor PIN 12 LfLed PIN 14 ' blue LEDs RtLed PIN 1 PsxAtt PIN 8 ' PSX joystic interface PsxClk PIN 9 PsxCmd PIN 10 PsxDat PIN 11 ' -----[ Constants ]------------------------------------------------------- Inverted CON 1 ' inverted clock signal Direct CON 0 ' no inverter in clock line ClockMode CON Inverted ' -----[ Variables ]------------------------------------------------------- idx VAR Nib ' loop counter psxOut VAR Byte psxIn VAR Byte ' joystick packet psxID VAR Byte ' controller ID psxThumbL VAR Byte ' left thumb buttons psxThumbR VAR Byte ' right thumb buttons psxStatus VAR Byte ' status ($5A) psxJoyRX VAR Byte ' r joystick - horizontal psxJoyRY VAR Byte ' r joystick - vertical psxJoyLX VAR Byte ' l joystick - horizontal psxJoyLY VAR Byte ' l joystick - vertical fireL1 VAR psxThumbR.BIT2 ' front fire buttons fireL2 VAR psxThumbR.BIT0 fireR1 VAR psxThumbR.BIT3 fireR2 VAR psxThumbR.BIT1 arrows VAR psxThumbL.HIGHNIB btnUp VAR psxThumbL.BIT4 ' left pad btnDn VAR psxThumbL.BIT6 btnLf VAR psxThumbL.BIT7 btnRt VAR psxThumbL.BIT5 btnTri VAR psxThumbR.BIT4 ' right pad btnX VAR psxThumbR.BIT6 btnSqr VAR psxThumbR.BIT7 btnCirc VAR psxThumbR.BIT5 lSpeed VAR Word ' left motor speed rSpeed VAR Word ' right motor speed ' -----[ EEPROM Data ]----------------------------------------------------- ' -----[ Initialization ]-------------------------------------------------- Setup: HIGH PsxAtt ' deselect LOW PsxCmd ' make pin an output LOW PsxClk ' make output LOW LMotor LOW RMotor LOW LfLed ' LEDs off LOW RtLed ' -----[ Program Code ]---------------------------------------------------- Main: DO GOSUB Get_PSX_Buttons ' get PSX data LfLed = ~fireL1 | ~fireL2 ' update left LED RtLed = ~fireR1 | ~fireR2 ' update right LED ' update servos ' SELECT arrows CASE %1110 ' forward PULSOUT LMotor, 1000 PULSOUT RMotor, 500 CASE %0110 ' turn left PULSOUT LMotor, 750 PULSOUT RMotor, 500 CASE %1100 ' turn right PULSOUT LMotor, 1000 PULSOUT RMotor, 750 CASE %0111 ' rotate left PULSOUT LMotor, 500 PULSOUT RMotor, 500 CASE %1101 ' rotate right PULSOUT LMotor, 1000 PULSOUT RMotor, 1000 CASE %1011 ' reverse PULSOUT LMotor, 500 PULSOUT RMotor, 1000 CASE %0011 ' reverse left PULSOUT LMotor, 750 PULSOUT RMotor, 1000 CASE %1001 ' reverse right PULSOUT LMotor, 500 PULSOUT RMotor, 750 CASE ELSE PULSOUT LMotor, 750 ' stop PULSOUT RMotor, 750 ENDSELECT LOOP END ' -----[ Subroutines ]----------------------------------------------------- ' This routine REQUIRES inverted clock signal from ' Stamp to PSX controller Get_PSX_Buttons: IF (ClockMode = Direct) THEN Get_PSX_Packet ' redirect if not inverted LOW PsxAtt SHIFTOUT PsxCmd, PsxClk, LSBFIRST, [$01, $42] SHIFTIN PsxDat, PsxClk, LSBPOST, [psxThumbL, psxThumbL, psxThumbR] psxId = $41 HIGH PsxAtt RETURN ' This routine manually creates the clock signal, ' so it can be used with a direct (via 220 ohm resistor) ' connection to the clock input ' ' Execution time on BS2 is ~145 ms. Get_PSX_Packet: LOW PsxAtt ' select controller psxOut = $01 : GOSUB PSX_TxRx psxOut = $42 : GOSUB PSX_TxRx psxId = psxIn ' save controller type psxOut = $00 : GOSUB PSX_TxRx psxStatus = psxIn ' should be $5A ("ready") GOSUB PSX_TxRx : psxThumbL = psxIn ' get PSX data GOSUB PSX_TxRx : psxThumbR = psxIn GOSUB PSX_TxRx : psxJoyRX = psxIn GOSUB PSX_TxRx : psxJoyRY = psxIn GOSUB PSX_TxRx : psxJoyLX = psxIn GOSUB PSX_TxRx : psxJoyLY = psxIn HIGH PsxAtt ' deselect controller RETURN ' This routine combines manual and built-in shifting ' routines to get the best speed and all valid data. ' ' Execution time on BS2 is ~40 ms. Get_PSX_Packet_Fast: IF (ClockMode = Direct) THEN Get_PSX_Packet ' redirect if not inverted LOW PsxAtt ' select controller SHIFTOUT PsxCmd, PsxClk, LSBFIRST, [$01] ' send "start" psxOut = $42 : GOSUB PSX_TxRx ' send "get data" psxId = psxIn ' save controller type SHIFTIN PsxDat, PsxClk, LSBPOST, [psxStatus] ' should be $5A ("ready") SHIFTIN PsxDat, PsxClk, LSBPOST, [psxThumbL] SHIFTIN PsxDat, PsxClk, LSBPOST, [psxThumbR] SHIFTIN PsxDat, PsxClk, LSBPOST, [psxJoyRX] SHIFTIN PsxDat, PsxClk, LSBPOST, [psxJoyRY] SHIFTIN PsxDat, PsxClk, LSBPOST, [psxJoyLX] GOSUB PSX_TxRx : psxJoyLY = psxIn HIGH PsxAtt ' deselect controller RETURN ' Transmit psxOut to, and receive psxIn from the ' PSX controller PSX_TxRx: FOR idx = 0 TO 7 PsxCmd = psxOut.LOWBIT(idx) ' setup command bit PsxClk = ClockMode ' clock the bit psxIn.LOWBIT(idx) = PsxDat ' get data bit PsxClk = ~ClockMode ' release clock NEXT RETURN