LOOKING AT THE PLUG ------------------------------- PIN 1->| o o o | o o o | o o o | \_____________________________/PIN # USAGE
It should also be noted that this is a bus of sorts. This means that the wires are all tied together (except select which is separate for each device). For the CLK, ATT, and CMD pins this does not matter as the PSX is always the originator. The DATA and ACK pins however can be driven from any one of four devices. To avoid contentions on these lines they are open collectors and can only be driven low.
|BIT 0|BIT 1|BIT 2|BIT 3|BIT 4|BIT 5|BIT 6|BIT 7| CLOCK -----___---___---___---___---___---___---___---___----------- DATA -----000000111111222222333333444444555555666666777777-------- * * * * * * * * CMND -----000000111111222222333333444444555555666666777777-------- ACK ----------------------------------------------------------__-
The logic level on the data lines is changed by the transmitting device on the falling edge of clock. This is then read by the receiving device on the leading edge (at the points marked *) allowing time for the signal to settle. After each COMMAND is received by a selected controller, that controller needs to pull ACK low for at least one clock tick. If a selected controller does not ACK the PSX will assume that there is no controller present.
When the PSX wants to read information from a controller it pulls that devices ATT line low and issues a start command (0x01). The Controller Will then reply with its ID (0x41=Digital, 0x23=NegCon, 0x73=Analogue Red LED, 0x53=Analogue Green LED). At the same time as the controller is sending this ID byte the PSX is transmitting 0x42 to request the data. Following this the COMMAND line goes idle and the controller transmits 0x5A to say "here comes the data".This would look like this for a digital controller
ATT -______________________________________________________________ | Byte 1 | | Byte 2 | | Byte 3 | CLOCK ---_-_-_-_-_-_-_-_-----_-_-_-_-_-_-_-_-----_-_-_-_-_-_-_-_----- 0xFF 0x41 0x5A DATA -------------------------__________--__----__--__----__--__---- 0x01 0x42 CMND -----_____________-----__--________--__------------------------ ACK --------------------__-------------------__-----------------__-
After this command initiation process the controller then sends all its data bytes (in the case of a digital controller there is only two). After the last byte is sent ATT will go high and the controller does not need to ACK.The data transmission for a digital controller would look like this (where A0,A1,A2...B6,B7 are the data bits in the two bytes).
ATT _______________________________________------- | Byte 4 | | Byte 5 | CLOCK ---_-_-_-_-_-_-_-_-----_-_-_-_-_-_-_-_-------- DATA ---D0D1D2D3D4D5D6D7----E0E1E2E3E4E5E6E7------- CMND ---------------------------------------------- *** ACK --------------------__------------------------ NOTE: No ACK.
Standard Digital Pad BYTE CMND DATA 01 0x01 idle 02 0x42 0x41 03 idle 0x5A Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 04 idle data SLCT STRT UP RGHT DOWN LEFT 05 idle data L2 R2 L1 R1 /\ O X |_| All Buttons active low.
NegCon BYTE CMND DATA 01 0x01 idle 02 0x42 0x23 03 idle 0x5A Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 04 idle data STRT UP RGHT DOWN LEFT 05 idle data R1 A B 06 idle data Steering 0x00 = Right 0xFF = Left 07 idle data I Button 0x00 = Out 0xFF = In 08 idle data II Button 0x00 = Out 0xFF = In 09 idle data L1 Button 0x00 = Out 0xFF = In All Buttons active low.
Analogue Controller in Red Mode BYTE CMND DATA 01 0x01 idle 02 0x42 0x73 03 idle 0x5A Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 04 idle data SLCT JOYR JOYL STRT UP RGHT DOWN LEFT 05 idle data L2 R2 L1 R1 /\ O X |_| 06 idle data Right Joy 0x00 = Left 0xFF = Right 07 idle data Right Joy 0x00 = Up 0xFF = Down 08 idle data Left Joy 0x00 = Left 0xFF = Right 09 idle data Left Joy 0x00 = Up 0xFF = Down All Buttons active low.
Analogue Controller in Green Mode BYTE CMND DATA 01 0x01 idle 02 0x42 0x53 03 idle 0x5A Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 04 idle data STRT UP RGHT DOWN LEFT 05 idle data L2 L1 |_| /\ R1 O X R2 06 idle data Right Joy 0x00 = Left 0xFF = Right 07 idle data Right Joy 0x00 = Up 0xFF = Down 08 idle data Left Joy 0x00 = Left 0xFF = Right 09 idle data Left Joy 0x00 = Up 0xFF = Down All Buttons active low.
PSX Mouse (credit to T.Fujita http://www.keisei.tsukuba.ac.jp/~kashima/games/ps-e.txt) BYTE CMND DATA 01 0x01 idle 02 0x42 0x12 03 idle 0x5A Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 04 idle 0xFF 05 idle data L R 06 idle data Delta Vertical 07 idle data Delta Horizontal All Buttons active low.
This circuit can be set up to emulate a digital controller, an analogue controller (in either mode) or a NegCon. The circuit uses six 74XX IC's to emulate a digital controller. To emulate an analogue controller a further four 74XX IC's and four A/D converters are needed. To emulate a NegCon you also need four A/D's and four extra 74XX over the digital controllers six chips.
When ATT is pulled LOW by the PSX, inverter 4/4A will pull SH/!LD on the 74HC165's HIGH. This will load the data at their serial input pins (Only two of five IC's are shown). Inverter 1/4A supplies the clocking for the HC165's so that on each falling edge of the PSX's supplied CLK the next bit of data in the HC165's is shifted out. This data out is gated by the ATT signal on inverter 2/4B, this is so only the selected device can drive the bus.
The data loaded into the HC165's is directly related to the data shown in the timing diagrams in the section above. Looking back at the diagram shows the first byte as 0xFF. This means that A1 through to A8 would all be tied HIGH. The next byte is the controller ID. For the digital controller this is 0x41 so B1-8 are HLLLLLLHL respectively. The next byte is the DATA READY command 0x5A so C1-8 are HLHLLHLH. The final two bytes are the button presses and should be set HIGH (through a pull up) when the button is not pressed or LOW if the button is pressed. (NB E8 is SER IN on the last HC165)
The Ack signal is provided by the missing pulse detector built around inverters 1/4A, 2/4A and 1/4B. Diode D1 only allows inverter 1/4A to charge up C1 when CLK is low. When CLK goes HIGH for longer than the time set by R1/C1, inverter 2/4A will go HIGH. This HIGH going signal is coupled to inverter 1/4B via C2 which causes its output to pulse LOW. This signal is also gated by the ATT signal (again to avoid bus contention).
The micro controller version uses the Motorola 68HC11 (no one presented a compelling argument to use anything different). The code is currently set up to assemble for an E2 but can be changed to run on any 52 pin version with EEPROM (I made sure that I didn't use interrupts or use more than 256 bytes).
Clicking on either the picture to the left or the overlay below will take you to a larger version of the picture. In the large version clicking on any component will take you to that part in the parts list.
The circuit uses a Motorola MC68HC11 to do everything. It reads the state of the sixteen N/O (normally open) switch inputs on the left. It reads the values of the four analog inputs on the right. It then sends this data out one of its two serial ports.
The four jumpers in the circuit affect how the circuit works. J1 at the top of the board is used to put the HC11 into one of two operating modes. With J1 open the microcontroller is in single chip mode with it closed the micro is in special bootstrap mode.
J2,3 and 4 select what type of PSX controller to emulate as shown in the table below.
|O = Open, C = Closed, X = Don't Care|
The four analog inputs in the top right hand corner of the circuit are designed for hooking up potentiometers. The size of the pots is not critical but a 10K to 50K pot would be sensible. The three wires for each pot are WIPER, VCC and GND as shown below.
____________________ | || | \/ | /\ /\ /\ /\ | / \/ \/ \/ \ | | | | | | O O O PIN 3 PIN 2 PIN 1
The nine pin connector at the bottom of the circuit goes to the playstation as well as being used to program the microcontroller. Its pin assignments are shown below.
|1||SCI RX FOR RS-232 comms (not used by psx)|
|2||SCI TX "|
|3||DATA (pin 1 on PSX)|
|4||CLOCK (pin 2 on PSX)|
|5||COMMAND (pin 7 on PSX)|
|6||ATT (pin 6 on PSX)|
|7||VCC (pin 5 on PSX)|
|8||ACK (pin 9 on PSX)|
|9||GND (pin 4 on PSX)|
Finally the LVI (low voltage inhibitor) at the bottom of the circuit is used to keep the HC11 in a state of RESET when there is not enough voltage to run it safely. It is fairly safe to leave this out of the circuit if you can't get hold of one but be warned you may pop that fuse if you don't include it.
The overlay above shows the PCB and all the components on it. The parts and their functions are described below.
|U2||MC 34064 Low voltage inhibitor|
|C1, C2||18pF ceramic cap|
|C3, C4||1uF mono or MKT cap|
|R2- R5||4K7 res|
|RP1||4K7 x 9 sip res pack|
|CON1||9 way sil connector|
|D1- D16||1N4148 diode|
|J1||Boot mode jumper|
|J2- J4||Controller mode jumpers|
|POT1- 4||Analogue inputs|
|Button 1- 16||Header for 16 N/O momentary switches|
The software is totally free and can be downloaded from the URL's below. However it is not Freeware. It is a slightly different concept called Great-Guy-Ware. All you have to do if you wish to use the software is send me an E-mail telling me I am a great guy. This serves two main purposes. One is to make me feel good and secondly it encourages me to finish some of the other articles I may have started in the last ten years.
The software is for the microcontroller is VERY heavily commented and should not need any explanation. It can be downloaded with the PCB (in auto/easytrax format) here psxcont.zip (240K).
|Also included in the ZIP file above is a program called EELOADER.EXE. This is an IBM executable that can be used to download the code into the HC11. The first two pins on the nine pin connector are a 5V RS232 port. This can be connected to any serial port on your IBM compatible PC through a MAX232 as shown.|
The PCB shown does not have connections for RTS-CTS and DTR-DSR-CD. These connections must be made manually with pieces of wire soldered to the DB25 female plug. These connections, that are shown in the photo, are pin four to pin five and pin six to pin eight to pin twenty.
To use it connect it to a 5 volt power supply. I used four nicad batteries which gives 4.8v (do not use non-rechargables, the voltage will be to high). You also have to connect it to a serial port on your PC and place a jumper on J1. Then type EELOAD PSXCONT.S19 /Cx where x is the com port the controller is on. Then follow the instructions on the screen.Please read the disclaimer