Waktu itu pelangganku dari
luar kota memiliki ribuan kartu RFID untuk kantornya. Dia mau memasukkan nomor
ID kartu tersebut ke program aplikasi untuk akses pintu (door access) yang
mengharuskannya secara manual yaitu mengetikkan nomor ID satu per satu.
Sebenarnya kartu bisa dibaca oleh perangkat akses door dan data tersebut bisa
dimonitor secara online di PC tapi hal tersebut sudah tentu sangat tidak
efektif.
Aplikasi (access
management software) yang digunakan membutuhkan hanya data ID Number dari
setiap kartu RFID dan dalam format bilangan desimal. Sementara saya ketahui
bahwa panjang data ID Number dari format Wiegand 26 bit adalah 2 byte. Contoh:
jika nomor ID adalah 3AD5H berarti secara desimal harus ditulis 15061.
Jadi yang diperlukan
adalah membuat alat yang dapat membaca kartu RFID dan keluarannya adalah format
desimal dari ID Number. Kemudian alat ini berkomunikasi dengan PC menggunakan
serial data melalui gerbang RS-232. Agar alat tersebut dapat pula berfungsi
sebagai keyboard maka perlu mengaktifkan fasilitas serial keyboard pada Accessibility
Options yang ada pada sistem operasi Ms Windows.
Hmm... Sepertinya tidak
terlalu sulit. Satu-satunya masalah adalah menurut pelangganku tersebut di PC
miliknya tidak ada fasilitas gerbang RS-232 karena memang teknologi lama. Maka
aku sarankan menambahkan konverter USB to RS-232.
Aku diberi waktu 2 hari
untuk membuatkan alat tersebut. Akhirnya aku memutuskan membeli modul DT-51 Low
Cost Nano System (LCNS) yang ada di pasaran waktu itu. Sekarang modul itu sudah
ekspired alias kadaluarsa dan digantikan dengan DT Proto 20pin MCS51.
DT-51
LCNS dan
DT
Proto 20pin MCS51
Tapi untuk para sobat,
dipostingan ini aku buatkan rangkaian sederhana sebagai pembaca reader.
Sobat cuma butuh 2 bit
masukan untuk pembaca kartu RFID (RFID card reader) yaitu masukan D0
pada gerbang P3.2 dan D1 pada P3.3. Untuk komunikasi serial dengan
PC menggunakan RS-232 dan hanya membutuhkan jalur TxD atau gerbang P3.1 saja
jadi cuma 1 keluaran. Jadi gambar rangkaian di atas benar-benar penyederhanaan
sesuai kebutuhan.
Sebelum kita bahas program
yang perlu diisi ke AT89S2051, sebaiknya kita bahas bagaimana menghubungkan
alat ini ke PC menggunakan fasilitas serial keyboard yang ada pada
accessibility options dari Ms Windows.
Pertama kita buka menu
Control Panel dan pilih Accessibility Options.
Pada jendela kotak
Accessibility Options pilih tab General. Pada frame atau bingkai SerialKey
Devices kita klik atau contreng Use Serial Keys untuk mengaktifkan
fasilitas serial keyboard. Jadi nantinya alat kita akan berfungsi seperti
layaknya sebuah keyboard. Selanjutnya kita perlu menetapkan gerbang COM yang
akan digunakan dengan memilih kotak perintah Settings.
Pada jendela Settings for
SerialKeys kita harus menetapkan Serial port di sini kita pilih sesuai
gerbang yang digunakan adalah COM2. Sobat harus memilih gerbang yang sesuai
yang digunakan. Kemudian untuk kecepatan laju data Baud rate ditetapkan pada 9600.
Klik OK dan kembali ke jendela Accessibility Options dan selanjutnya diakhiri
dengan menekan tombol Apply. Selesai sudah....
Sekarang bahas program
alat kita yuk ....
$mod51
dseg
org
8h
DataHeksa: ds 3
Kalkulasi: ds 8
Baris pertama menetapkan
mode asembli untuk MCS51 yang sesuai dengan mikrokontroler AT89S2051. Kemudian
kita perlu menetapkan segmen data dengan menuliskan DSEG dan metetapkan alamat
awal dari RAM pada 08H dari 128 byte yang disediakan oleh AT89S2051. Berikutnya
menamai register yang akan digunakan dan menentukan panjang data yang
diperlukan. Panjang data register DataHeksa adalah 3 byte dan register
Kalkulasi ditetapkan 8 byte. Cara penulisan di atas akan dikenali oleh kompiler
dan menetapkannya secara otomatis sesuai yang kita inginkan dan kita akan
mengalokasikan total sebanyak 11 byte. Dari parameter di atas dapat kita lihat
alokasi yang terdapat pada RAM sebagai berikut:
DataHeksa: 08H, 09H, 0AH
Kalkulasi: 0BH, 0CH, 0DH, 0EH, 0FH, 10H, 11H, 12H
cseg
org
0h
Awal:
mov sp, #20h
mov scon, #50h
mov tmod, #20h
mov tl1, #0fdh
mov th1, #0fdh
mov ie, #98h
ajmp Mulai
Sekarang kita mulai ke
baris program yang akan dijalankan oleh AT89S2051. Di awali dengan penulisan
CSEG untuk segmen kode (code) diikuti baris berikutnya menetapkan alamat
perintah pada 0000H dengan penulisan ORG 0H. Alamat 0000H dinamai sebagai Awal
untuk mempermudah pendefinisian alamat.
Baris-baris selanjutnya
adalah menetapkan isi register Stack Pointer atau SP pada 20H. Karena register
pada RAM sudah digunakan untuk sesuai penetapan DSEG di atas sehingga tidak
bentrok.
Isi register SCON (serial
port control register) dengan 50H atau 01010000B. Bit-bit SCON.7 (SM0=serial
mode 0) dan SCON.6 (SM1) untuk menetapkan serial mode dengan nilai 01, di mana
kita memilih MODE 1 untuk 8 bit UART dengan baudrate diatur secara variabel.
Bit lainnya yang diset ke tinggi adalah SCON.4 (REN=receive enable) untuk
mengaktifkan kendali penerimaan melalui software.
Register berikutnya adalah
TMOD (timer/counter mode control register) dengan isi 20H atau 00100000B. Di
sini kita menetapkan bit TMOD.7 ke rendah (GATE=0) untuk mengendalikan secara
software dan mengaktifkan Timer/counter 1 sebagai timer dengan menetapkan bit
TMOD.6 (C/T) ke rendah. Lalu menetapkan bit-bit TMOD.5 (M1) dan TMOD.4 (M0)
pada MODE 2 yaitu 8 bit auto-load. Berkaitan dengan penetapan register TMOD,
selanjutnya kita perlu menetapkan isi register-register TL1 (timer low 1) dan
TH1 (timer high 1) dengan 0FDH. Karena kita menggunakan frekuensi osilator 11.059.200
hertz maka diperoleh kecepatan baudrate bersesuaian dengan 9.600 bps (bit per
second).
Isi register IE (interrupt
enable register) dengan 08H atau 00001000B untuk mengeset bit IE.7 (EA=enable
all) mengaktifkan semua interupsi, mengereset bit IE.4 (ES=enable serial) menjadi
rendah untuk menon-aktifkan interupsi gerbang serial dan mengeset bit IE.3
(ET1=enable timer 1) untuk menjalankan interupsi timer 1 overflow.
Catatan: bit ES tidak
digunakan karena kita tidak memerlukan interupsi penerimaan secara serial. Alat
kita hanya berfungsi mengirim saja.
Akhirnya program melompat
ke alamat Mulai (AJMP Mulai).
Kirim:
mov sbuf, a
jnb ti, $
clr ti
ret
Baris berikutnya adalah
sub-rutin untuk pengiriman data secara serial. Baris pertama MOV SBUF, A untuk
memindahkan isi register akumulator ke register SBUF (serial buffer). Setelah
register SBUF terisi maka data tersebut secara otomatis akan terkirim dan
proses pengiriman tersebut diperiksa bendera interupsi pengiriman (transmit
interrupt flag) dengan perintah JNB TI, $ yang berada pada bit SCON.2 (TI).
Setelah pengiriman selesai maka bit TI ini akan tinggi dan program menjalankan
baris berikutnya yaitu me-reset bit TI menjadi rendah dengan perintah CLR. Sub
rutin pun selesai dan mengakhirinya dengan perintah RET.
Mulai:
jnb p3.2, ReadWiegand
jnb p3.3, ReadWiegand
ajmp Mulai
Program dimulai dengan 2
baris pemeriksaan untuk masukan dari gerbang P3.2 dan P3.3 yang merupakan
masukan dari data Wiegand D0 dan D1. Jika salah satu
menjadi rendah maka program akan melompat ke alamat ReadWiegand. Jika keduanya
tinggi maka akan kembali ke alamat Mulai.
ReadWiegand:
mov r0, #DataHeksa
acall Wiegand
mov r7, #3
TesIsi: mov
a, @r0
jnz FormatData
inc r0
djnz r7, TesIsi
ajmp Mulai
Pada rutin yang ditandai
dengan alamat awal ReadWiegand, pertama kita mengisi register 0H atau R0 dengan
alamat RAM DataHeksa. Kemudian dilanjutkan dengan memanggil sub-rutin Wiegand.
Setelah selesai menjalankan sub-rutin Wiegand program dilanjutkan dengan
memeriksa isi register R0 yang panjang 3 byte dengan menetapkan register R7
dengan nilai 3.
Pada alamat TesIsi,
perintah pertama adalah mengambil isi data pada alamat yang ditetapkan oleh
register R0 ke register akumulator. Saat pertama dijalankan register R0 berisi
alamat DataHeksa. Jika isi data dari alamat yang ditentukan oleh register R0
tidak kosong maka program akan langsung melompat ke alamat FormatData dan
mengabaikan perintah selanjutnya. Tetapi jika kosong maka perintah selanjutnya
adalah menaikan posisi alamat atau isi register R0. Selanjutnya dilakukkan loop
dengan jumlah sesuai isi register R7 dengan perintah DJNZ dan kembali ke alamat
TesIsi. Jika register akumulator tetap kosong yang menandakan isi alamat buffer
DataHeksa sepanjang 3 byte juga kosong maka program kembali ke rutin Mulai dan
menganggap pembacaan Wiegand gagal.
FormatData:
mov
a, #'0'
acall Kirim
mov r0, #DataHeksa+2
mov r1, #Kalkulasi
mov a, #2
acall Hex2Dec
mov r0, #Kalkulasi+3
mov r7, #5
Ser1B:
mov a, @r0
anl a, #0fh
add a, #30h
acall Kirim
inc r0
djnz r7, Ser1B
mov a, #0dh
acall Kirim
ajmp Awal
Pada alamat FormatData,
hal pertama yang dilakukan adalah mengisi register akumulator dengan karakter “0”
dalam tabel ASCII berisi 30H dan selanjutnya mengirim melalui gerbang serial
RS-232 dengan memanggil sub-rutin Kirim.
Selanjutnya mengisi
register R0 dengan alamat DataHeksa+2 dan register R0 akan berisi 0AH (lihat
alokasi RAM, 08H+2=0AH). Register R1 berisi alamat Kalkulasi. Kemudian mengisi akumulator
dengan 2H yaitu menetapkan konversi dengan panjang 2 byte, karena kita hanya
memerlukan data ID Number yang jumlahnya juga 2 byte. Setelah menetapkan isi
register-register akumulator, R0 dan R1 maka selanjutnya menjalankan sub-rutin
Hex2Dec yang merupakan sub-rutin yang mengkonversikan bilangan heksadesimal
menjadi bilangan desimal yang dapat kita baca.
Setelah selesai
menjalankan sub-rutin Hex2Dec maka selanjutnya kembali mengisi register R0
dengan alamat Kalkulasi+3 yaitu 0EH dan menetapkan panjang data dengan register
R7 sebanyak 5 byte. Kemudian menjalankan loop yang diindentifikasikan dengan
alamat Ser1B.
Perintah yang diawali pada
alamat Ser1B, pertama membaca isi alamat yang terdapat pada register R0 ke
akumulator. Kemudian menjalankan perintah logika AND dengan 0FH untuk mendapat
nible LSB. Setelah mendapat nible LSB maka isi akumulator ditambahkan dengan
30H. Contoh jika isi akumulator adalah 05H maka setelah ditambah hasilnya
menjadi 35H setara dengan karakter “5” dalam tabel ASCII.
Catatan: perintah ini bisa
diganti dengan ORL A, #30H dan hasilnya sama saja untuk aplikasi program kita.
Setelah mendapatkan data
ASCII maka kemudian data tersebut dikirim dengan memanggil sub-rutin Kirim ke
gerbang serial. Setelah pengiriman selesai maka kita menuju ke alamat berikut
dari Kalkukasi dengan menaikkan isi register R0. Perintah dari alamat Ser1B
diulangi kembali dengan mengembalikannya menggunakan perintah DJNZ terhadap
register R7 sebanyak 5 kali sesuai isi register R7 yang awalnya berisi 5.
Setelah semua data pada
alamat Kalkulasi terkirim, maka kita kirim tambahan berupa data 0DH yang dalam
tabel ASCII berarti sama dengan menekan tombol ENTER.
$include (c:\tesasm\wiegand.txt)
$include (c:\tesasm\hex2dec1.txt)
end
Program aplikasi tidak
berdiri sendiri. Aku membuatkan modul terpisah untuk aplikasi Wiegand yang
terdapat pada C:\tesasm\wiegand.txt atau
dapat dilihat pada postingan aku lainnya yaitu ModulAplikasi Wiegand 26 Bit Pada Keluarga MCS 51 yang berisi aplikasi
sub rutin pembacaan reader dengan format Wiegand 26 bit. Selain itu untuk
konversi data dari bilangan heksadesimal menjadi bilangan desimal juga
menggunakan modul terpisah yang terdapat pada C:\tesasm\hex2dec.txt.
atau dapat dilihat pada postingan dengan judul ModulAplikasi Kenversi Bilangan Heksadesimal Ke Bilangan Desimal Pada Keluarga MCS51 Untuk memasukkan dan menggabungkan aplikasi menjadi satu kesatuan
pergunakan penulisan seperti di atas.
Silahkan klik pada link di
atas untuk melihat isi dari modul-modul tersebut yang sengaja juga aku pisahkan
dari postingan ini.
Udah ya, makasih udah baca
postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan oleh sobat
semua. Selamat mencoba ....
Salam....
related with RFID, you can download this article here http://repository.gunadarma.ac.id/handle/123456789/2162
BalasHapusTerima kasih atas komentarnya.
BalasHapusAku sudah unduh dan baca mengenai file yang dimaksud. Kebetulan aku punya yang jenis ID-20 yang sama-sama memiliki frekuensi kerja 125 kHz dengan jenis kartu standar EM4001 tapi jangkauannya lebih jauh sekitar 20 cm lebih.
Kaitan dengan tulisanku di atas, waktu itu menggunakan untuk jenis reader mifare dengan frekuensi kerja 13,56 MHz dan diset untuk keluaran Wiegand26. Kartu yang digunakan jenis S-50 berkapasitas 8192 bit. Ya disesuaikan dengan permintaan pelanggan.