Anda di halaman 1dari 12

PSXpaD interfacing dengan MCS-51 (AT89S52).

semua ilmu semakin di pelajari semakin mudah. jika anda merasa sebaliknya, berarti.
anda mempelajari ilmu sesat atau anda tersesat saat mempelajarinya.
<kenzanin>.

Phase Alpha.
PsxPad atau PSX joystick bukan hal yang baru lagi bagi kita terutama yang penggemar
game, namum bagi yang belum kenal it’s okay there always first time for everything
hehe alat atau device ini berfungsi sebagai pengendali PSXconsole, secara fisik yang
terlihat hanya tombol yang tersusun pada tempat yang lebih mirip pesawat luar angkasa
di tambah kabel pada bagian depan nya. Mungkin setelah melihat gambarnya anda akan
lebih mengerti ☺.

Gambar PSxPad digital.

Gambar PSxPad analog.

Gambar PSxConsole
Sebagian besar PSxPad di gunakan untuk mengendalikan game yang dimainkan pada
PSX atau PS2 console yang tentu saja sebatas gambar yang bergerak gerak di TV, seiring
dengan rasa penasaran yang tinggi muncul pertanyaan apakah mungkin mengendalikan
hal-hal nyata dengan menggunakan PsxPad? Saya yakin “semua hal yang bisa di
rumuskan pasti dapat di kendalikan” karena itu pasti ada cara untuk mewujutkan
keinginan itu maka dimulailah project PsxPad interfacing.

Phase one.
QAC(question, answer, conclusion):

Q:
Cari apakah project seperti ini sudah ada yang mengerjakan?
A:
Sudah sangat banyak, dari berbagai sumber di internet ternyata sangat banyak orang yang
sudah berhasil menghubungkan PSXpad selain ke PSXconsole
C:
Berarti kemungkinan besar ide bisa di wujudkan.

Q:
Apa yang di perlukan untuk menghubungkan PsXpad ke device atau alat lain?
A:
Kebanyakan project menggunakan micro Controller(uC) mulai dari AVR sampai PIC,
bahkan ada juga yang menggunakan PC parallel port.
C:
Penggunaan PC parallel port pada project ini kurang flexible(karena ukuran dan
beratnya) karena itu sepertinya penggunaan micro controller lebih masuk akal.

Q:
Kebanyakan micro controller yang tersedia di pasar adalah jenis MCS-51 (AT89S52)
apakah ada project yang sama out there?
A:
Sayangnya diantara project yang di buka secara umum di internet tidak ada yang
menggunakan micro controller jenis ini, namum ada tempat pelatihan uC yang
menyediakan kelas untuk mempelajari hal ini dengan biaya Rp 700.000.
C:
Heheh biaya traning yang cukup tinggi bukan jadi masalah tapi jika jumat malam ndak
ketemu sama … hehehehe ndak ah. Melihat berbagai reverensi data yang ada sepertinya
bukan hal yang sulit untuk menghubungkan PSXpad ke uC karena itu lebih baik kerjakan
sendiri.
Q:
Analisa berbagai kendala yang di hadapi
A:
Tidak adanya datasheet resmi dari Sony menyebabkan data harus di kumpulkan sendiri.
Meski ada diagram timing dari internet namun itu bukan versi resmi jadi kebenarannya
tidak bisa dianggap 100%(but it’s very good start).
Perbedaan Negara pembuat PSXpad memungkinkan adanya perbedaan antara reverensi
dan barang nyata.
C:
Mencari data suatu alat tanpa datasheet sama seperti berjalan di kegelapan sambil
membawa flash light tanpa battery. Heheh susah, namun di Bantu alat alat yang sesuai
maka project ini masih memiliki kesempatan besar untuk bisa di laksanakan. Lanjut terus.

Q:
Bahasa pemograman yang tepat untuk project ini
A:
Bahasa C memberikan fleksibilitas yang tinggi namun hal ini berdampak pada penurunan
kecepatan program.
Bahasa Assembly memang menyusahkan namun kecepatannya yang tinggi (jika benar
memprogramnya) merupakan suatu keuntungan yang besar.
C:
Karena kecepatan dari PSx belum benar benar di ketahui maka sebaiknya menggunakan
assembly untuk project ini di samping itu tidak di perlukan manipulasi database membuat
assembly lebih sederhana.

Phase two.
Recipe PsxPad Interfacing.
Bahan-bahan:
Satu buah PsxPad lengkap dengan kabelnya
Satu soket SIP usahakan masih memiliki minimal 7 kaki
Kabel secukupnya
Timah secukupnya

Alat-alat:
Solder listrik + pembersih timah
Power supply 5v(untuk uC dan PsxPad) dan 9V (untuk analog PSxPad)
AT89S52 minimum system + ISP programmer
Oscilloscope (usahakan dapat yang digital)
Multimeter
Gunting atau tang pemotong kabel
Pisau jika ada

Semua bahan selain PSXpad, bisa anda dapatkan jika menjadi bagian dari Politeknik
Aceh (Promosi heheh).
Phase Three.
Close Look to the device.
Membeli PSxPad seharga Rp 40.000. kemudian membedahnya benar benar bukan hal
yang saya inginkan karena itu saya minta bantuan teman teman yang tertarik pada project
ini dan menyakinkannya untuk membelinya hehe.
Alhamdulilah teman saya mau membelikan dan menyerahkannya pada saya tanpa syarat
(what a wonderful world). Project di mulai dengan menggunakan situs pinouts.ru sebagai
referensinya berikut data dari situs pinouts.ru.

Pinouts.ru Barang asli


Pin Fungsi
Warna Warna
1 Data Coklat
2 CMD Putih
3 N/C atau 9v analog Abu abu
4 GND Hitam
5 VCC 5V Merah
6 ATT Kuning
7 CLK Biru
8 N/C -
9 ACK Hijau
N/C: not connected(tidak di hubungkan).

Semua pin dari PSxPad menggunakan tegangan 0(low)-5(high)v kecuali untuk analog
menggunakan power supply tambahan 9V pada pin ketiganya.
Jadi semua pin selain nomer 3 bisa langsung di hubungkan dengan uC dengan tambahan
resistor pull-up (1k-10k) pada pin 1(data) dan 9(ack).
Juga informasi dari pinouts.ru bahwa untuk PSxPad yang asli bisa berkerja pada level
tegangan 0(low)-3-5(high)v sedang yang aspal 5v.

Keterangan pin pada pspad.


Data: signal dari controller ke uC (output).
8bit serial data yang sync pada saat transisi turun dari clock.
Command: signal dari uC ke PSxPad (input).
8bit serial data yang sync pada saat trasisi turun dari clock.
Att: signal dari uC ke PsxPad.(output)
Signal untuk mengaktifkan atau nonaktifkan PsxPad active low.
Clk: signal dari uC ke PsxPad.(input)
Signal clock dari uC ke PsxPad normaly high.
Ack: signal dari PsxPad ke uC
Signal dari PsxPad ke uC, normaly high, low sesaat setelah 8 clock berhasil di terima
oleh PsxPad kemudian High.
Timing diagram dari PsxPad.

Diagram di atas adalah bentuk komunikasi yang di gunakan antara uC dan PsxPad pada
diagram di atas hanya di tulis satu tahap komunikasi(sesi) sedang untuk komunikasi
sebenarnya di butuhkan lebih dari satu, banyaknya sesi data tergantung dari jenis pad
yang digunakan.
Misal
Digital 5 sesi data.
Analog red or green mode 9 sesi data.
Dll. (selengkapnya bisa di lihat di pinouts.ru)

Komunikasi data pada PsXpad menggunakan metode komunikasi serial 8bit yang sangat
mirip dengan komunikasi SPI
(http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus)
Langkah pertama uC (master) mengaktifkan device PsXpad (Slave) dengan cara memberi
logika rendah pada pin att nya, setelah itu clock mulai di berikan, data terima dan cmd di
kirim pada saat clock transisi rendah, pada transisi tinggi digunakan untuk
mempersiapkan cmd yang dikirim dan mempersiapkan tempat menampung data, satu kali
clock mewakili satu bit data yang di terima dan satu bit cmd, untuk mendapatkan 8bit,
maka perlu mengulang sebanyak 8kali.
Setiap 8kali clock pin ack akan memberikan logika rendah sesaat untuk memberikan
signal sync pada uC pada PSX console yang asli signal ack di gunakan untuk mendeteksi
kehadiran PSxPad.

Timing diagram terbagi atas dua bagian header dan data, header berfungsi untuk
mengaktifkan dan mendeteksi jenis psxpad yang di pakai.

Gambar contoh komunikasi antara digital PSXpad dan PSconsole atau uC.
Berikut keterangan dari gambar di atas.
• ATT di drive low untuk memulai komunikasi.
1. Byte 1.
a. uC atau PSconsole memberi CMD 0x01 untuk meminta ID dari
PSxPad.
2. Byte 2.
a. PsxPad mengirim ID melalui DATA 0x41 untuk digital, 0x73 untuk
analog red, 0x53 analog green, selengkapnya ada pada situs pinouts.ru
b. uC mengirim CMD 0x42 untuk meminta data tombol dari PSxPad.
3. Byte 3.
a. PsxPad mengirim DATA 0x5a yang menandakan bahwa PSxPad siap
mengirim data tombol ke uC.

Setelah bagian header berakhir sekarang masuk ke bagian data, pada bagian
ini jumlah sesi tergantung dengan model pad yang di gunakan untuk digital
PSxPad memiliki dua sesi data.

4. byte 4.
a. Data tombol bagian satu bagian ini meliputi D0 untuk tombol
SELECT, D3 START, D4 UP, D5 RIGHT, D6 DOWN, D7 LEFT.
Misalkan pada saat ini kita menekan tombol SELECT maka D0 akan
menjadi rendah
D7 D6 D5 D4 D3 D2 D1 D0
1 1 1 1 1 1 1 0
Maka data yang di hasilkan adalah 0xFE.
Jika kita menekan tombol UP maka D4
D7 D6 D5 D4 D3 D2 D1 D0
1 1 1 0 1 1 1 1
Sehingga data yang di kirim menjadi 0xEF.
Dan jika kita menekan dua tombol secara misal SELECT dan UP
maka data akan menjadi 0xEE.
5. byte 5.
a. Pada sesi ini menampung data E0 L2, E1 R2, E2 L1, E3 R1, E4
SEGITIGA, E5 LINGKARAN, E6 SILANG, E7 KOTAK.
Metode pengiriman data pada sesi ini sama dengan pada byte 4.
• ATT di drive high untuk memberi tahu PSxPad bahwa komunikasi sudah
berakhir.
Phase Four.
Close Look to the software.
Setelah melihat deskripsi mengenai device waktunya merancang software yang kita
butuhkan pada intinya program kita berfungsi untuk mengirim CMD dan menerima
DATA seiring(sync) dengan Clock.
Dengan menggunakan bahasa assembly untuk MCS-51 kita bisa membuat program
seperti di bawah ini

Program untuk mengirim CMD.


Mulai:
Drive clock tinggi
Masukkan data pada accumulator.0 pada pin CMD
Geser kanan satu kali
Drive clk rendah
Ulang ke mulai sebanyak 8 kali

Program untuk membaca DATA:


Mulai:
Drive clk tinggi.
Masukkan data pada pin DATA pada register A.7
Geser register A ke kanan satu kali.
Drive clk rendah
Ulang ke mulai sebanyak 8 kali
Untuk mempercepat eksekusi program maka rutine program di atas bisa di gabung
(sebenarnya terinspirasi saat melihat keterangan SPI pada wikipedia hehe).

Program untuk membaca DATA dan menulis CMD


Mulai:
Masukkan data accumulator.0 ke pin cmd
Drive clk rendah
Geser accumulator ke kanan satu kali
Masukkan data pada pin DATA ke accumulator.7
Drive clk tinggi
kembali ke mulai sebanyak 8 kali
Dari routine di atas bisa di buat program assembly seperti di bawah ini
f_spi:
mov r0,#8
f_spi01:
mov c,acc.0
mov pincmd,c
clr pinclk ;clock rendah
rr a
mov c,pindata
mov acc.7,c
setb pinclk ;clock tinggi
djnz r0,f_spi01
end

pada program di atas data CMD yang tersimpan pada accumulator akan di kirim ke
PSxPad dan pada akhir eksekusi DATA akan tersimpan pada accumulator.

Maka untuk digital PSxPad berikut routine nya.


Mulai:
Drive low att
Kirim CMD ke PSxPad 0x01
Kirim CMD ke PSxPad 0x042 dan Baca DATA dari PSxPad jika tidak sama dengan
0x41 (id untuk digital controller) meluncur ke akhir
Baca DATA dari PSxPad jika tidak sama dengan 0x52 meluncur ke akhir
Baca DATA dari PSxPad.
Baca DATA dari PSxPad.
Akhir:
Drive high att
End

Sedang untuk mode analog.


Mulai:
Drive low att
Kirim CMD ke PSxPad 0x01
Kirim CMD ke PSxPad 0x42 dan Baca DATA dari PSxPad jika tidak sama dengan 0x73
(id untuk analog red controller) meluncur ke akhir
Baca DATA dari PSxPad jika tidak sama dengan 0x52 meluncur ke akhir
Baca DATA dari PSxPad.
Baca DATA dari PSxPad.
Baca DATA dari PSxPad.
Baca DATA dari PSxPad.
Baca DATA dari PSxPad.
Baca DATA dari PSxPad.
Akhir:
Drive high att
End
Dengan sedikit usaha kita bisa menggabungkan kedua routine di atas menjadi
Mulai:
Drive low att
Kirim CMD ke PSxPad 0x01
Kirim CMD ke PSxPad 0x42 dan
Baca DATA dari PSxPad,
jika tidak sama dengan 0x41 (id untuk digital controller) meluncur ke bukan_digital
Beri variable xkali nilai 2
Meluncur ke baca_data
Bukan_digital:
jika tidak sama dengan 0x73 (id untuk analog red controller) meluncur ke akhir
Beri variable xkali nilai 6
Meluncur ke baca_data
Baca DATA dari PSxPad jika tidak sama dengan 0x52 meluncur ke akhir
Ulang:
Baca DATA dari PSxPad.
Kembali ke Ulang sebanyak xkali
Akhir:
Drive high att
End

Nah diatas contoh singkat tentang program yang di gunakan untuk menghubungkan
digital dan analog PSxPad ke uC.
Untuk program yang saya tulis selain untuk digital dan analog red PSxPad juga untuk
Negcon dan PSxMouse.
Menggunakan P2 sebagai bus out nya dan P3 sebagai selectornya sedang PSxPad masuk
ke P0.
Berikut table output untuk program KenPSxPad Interface.

Selector DataOut
0 0 1 Data 01 (tombol arah + start + select)
0 1 0 Data 02 (L1, L2, R1, R2, Segitiga, kotak, lingkaran, silang)
0 1 1 Data 03 (Right Joy 0x00 = Left 0xFF = Right)
1 0 0 Data 04 (Right Joy 0x00 = Up 0xFF = Down)
1 0 1 Data 05 (Left Joy 0x00 = Left 0xFF = Right)
1 1 0 Data 06 (Left Joy 0x00 = Up 0xFF = Down)
Berikut timing diagram dari PsxPad yang berhasil di rekam.

Perhatian di karenakan oscilloscope digital yang ada hanya memiliki 2 channel maka
untuk mendapatkan data seperti pada gambar, pengukuran harus di ulang ulang.

Sepertinya dokumentasi cukup sampai di sini entar klo ada request silahkan kirik ke
E-mail kenzanin@kenzanin.co.cc suka.isnaini@politeknikaceh.ac.id Okeh.

See u in next projects hehehe.

Lampiran Program
________________________________________________________________________
;This is free software
;you can redistribute it and/or modify it under the terms of the GNU
Lesser
;General Public License as published by the Free Software Foundation
;either version 2.1 of the License, or any later version.

;This Source is distributed in the hope that it will be useful, but


WITHOUT ANY
;WARRANTY without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A
;PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
details.

;You should have received a copy of the GNU Lesser General Public
License along
;with this library if not, write to the Free Software Foundation, Inc.,
;59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;copyright suka isnaini suka.isnaini@politeknikaceh.ac.id

;project KEnPSXpad Interface


;author Suka Isnaini
;versi 0.14
;date 13/01/2010 14:41:54

$debug nosymbols notabs nopaging condonly genonly


name Poltek_aceh_PSXpad_Interface

pinctr equ P0
outp equ p2
outpc equ p3
pinclk equ pinctr.1
pinatt equ pinctr.2
pincmd equ pinctr.3
pindata equ pinctr.4
pinack equ pinctr.0
data01 equ r3
data02 equ r4
idle equ 0ffh

rwspi macro cmd


mov a,#cmd
call f_spi
endm

delay macro del


mov r6,#del
call f_delay
endm

org $+00h
sjmp main
org $+40h
main: ;program utama
call f_scanPSx
sjmp main

f_scanPSx:
clr pinatt
rwspi 01h ;1
rwspi 42h ;2
cjne a,#41h,f_scanPSx01 ;digital pad <tested>
sjmp f_scanPSx_kel03
f_scanPSx01:
cjne a,#73h,f_scanPSx02 ;analog red pad <tested>
sjmp f_scanPSx_kel01
f_scanPSx02:
cjne a,#23h,f_scanPSx03 ;negcon pad <untested>
sjmp f_scanPSx_kel01
f_scanPSx03:
cjne a,#53h,f_scanPSx04 ;analog green pad <untested>
sjmp f_scanPSx_kel01
f_scanPSx04:
cjne a,#12h,f_scanPSx06 ;PSX mouse <untested>
sjmp f_scanPSx_kel02
f_scanPSx_kel01:
mov r5,#6
sjmp f_scanPSx_lanjut
f_scanPSx_kel02:
mov r5,#4
sjmp f_scanPSx_lanjut
f_scanPSx_kel03:
mov r5,#2
sjmp f_scanPSx_lanjut
f_scanPSx_lanjut:
rwspi idle ;3
cjne a,#5ah,f_scanPSx06
mov outpc,#1
f_scanPSx05:
rwspi idle ;4 -> 9 tergantung jenis pad
mov outp,a
inc outpc
djnz r5,f_scanPSx05
f_scanPSx06:
setb pinatt
delay 100
ret

f_spi:
mov r0,#8
f_spi01:
mov c,acc.0
mov pincmd,c
clr pinclk ;clock rendah
delay 5
rr a
mov c,pindata
mov acc.7,c
setb pinclk ;clock tinggi
delay 5
djnz r0,f_spi01
delay 20
ret

f_delay:
djnz r6,f_delay
ret
end

Anda mungkin juga menyukai