Translate

Membaca Kartu RFID Format Wiegand 26 Bit Pada Accessibility Option Di Microsoft Windows



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....

2 komentar:

  1. related with RFID, you can download this article here http://repository.gunadarma.ac.id/handle/123456789/2162

    BalasHapus
  2. Terima kasih atas komentarnya.
    Aku 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.

    BalasHapus