Ini adalah kelanjutan dari
postingan aku sebelumnya yang menulis mengenai: MembacaKartu RFID Format Wiegand 26 Bit Pada Accessibility Option Di Microsoft Windows.
Pada postingan tersebut membutuhkan modul aplikasi tambahan untuk melengkapi
programmnya. Salah satunya aku berikan dalam postingan ini. Postingan lainnya
yang berkaitan adalah Modul Aplikasi KonversiBilangan Heksadesimal Ke Bilangan Desimal Pada Keluarga MCS 51.
Sebelum membahas soal
aplikasi Wiegand 26 Bit, ada baiknya kita bahas dulu bagaimana format dari
protokol Wiegand 26 bit tersebut.
Ada beberapa perangkat
yang menghasilkan keluaran serial data dengan format Wiegand 26 bit. Salah satu
contohnya adalah pembaca kartu RFID. Perangkat lainnya juga ada seperti pembaca
sidik jari atau fingerscan. Yang penting kita tahu bahwa spesifikasi yang
tertulis dari perangkat tersebut adalah format Wiegand 26 bit.
Perangkat yang menggunakan
standar Wiegand 26 bit memiliki 2 buah saluran data yang terdiri dari D0 (data
0) yang sinyal keluarannya merepresentasikan data dengan level logika rendah
dan D1 (data 1) yang merepresentasikan data dengan level logika tinggi. Sinyal
data dapat dilihat di bawah ini:
Lebar pulsa rendah sebagai
yang dibangkitkan pada antarmuka Wiegand 26 bit baik untuk D0 maupun D1
ditandai pada gambar di atas dengan TPW (pulse width time) dengan
kisaran antara 20us sampai 100us. Sementara itu interval antar pulsa ditandai
dengan TPI (pulse interval time) berkisar antara 200us sampai 20ms.
Hal ini sesuai dengan Access Control Standard Protocol untuk Wiegand. Namun
umumnya keluaran dari perangkat adalah TPW adalah 100us dan TPI
adalah 1ms.
Pada format Wiegand 26 bit
sudah jelas panjang data serial yang ditransmisikan adalah 26 bit. Lalu pembagiannya
bagaimana?
Dari 26 bit panjang data
terbagi dalam beberapa bagian yaitu:
- Bit 1 adalah even parity untuk bit 2 sampai 13
- Bit 2 – 9 adalah facility code berjumlah 1 byte (0 –
255) dengan bit 2 sebagai MSB
- Bit 10 – 25 adalah ID Number berjumlah 2 byte (0 –
65535) dengan bit 10 sebagai MSB
- Bit 26 adalah odd parity untuk bit 14 sampai 25
Nah sekarang baru kita
bahas aplikasi sesuai dengan format di atas.
WiegandData0 bit p3.2
WiegandData1 bit p3.3
Pertama-tama pastikan bahwa pada awal program utama
memasukkan parameter seperti tersebut di atas untuk mengenali penamaan gerbang
pada program yang akan digabungkan. Penggunaan gerbang P3.2 dan P3.3 tidaklah
mutlak tetapi menyesuaikan dengan rangkaian yang sobat buat.
;Register 0
=> Alamat RAM Data Card terbaca
Wiegand:
push 0h
jnb WiegandData0, $
jnb WiegandData1, $
mov r6, #3
mov b, r0
mov r5, #255
mov r4, #255
mov r3, #255
Baris pertama berisi
keterangan yang tidak akan dijalankan oleh aplikasi di mana alamat awal dari
data akan disimpan pada register R0. Untuk keperluan lainnya baris pertama
perintah adalah menyimpan ke dalam register SP alamat tersebut yaitu register
R0 yang beralamat 00H. Kemudian baris berikutnya adalah memeriksa masukan dari
bit-bit WiegandData0 dan WiegandData1. Kedua perintah JNB di atas akan
melewatkan bit 1 atau mengabaikan even parity.
Selanjutnya program
mengisi register R6 dengan jumlah panjang data yaitu 3 byte. Kemudian menyalin
isi register R0 ke register B. Tiga baris berikutnya adalah mengisi register-register
R5 dan R4 masing-masing dengan nilai 255 setara dengan 0FFH.
WiegandByte:
mov r7, #8
mov a, #0
WiegandDelay:
djnz r5, WiegandWaitBit
mov r5, #255
djnz r4, WiegandWaitBit
mov r0, b
mov r7, #3
WiegandDlyLoop:
mov @r0, #0
inc r0
djnz r7, WiegandDlyLoop
pop 0h
ret
WiegandWaitBit:
jnb WiegandData0, WiegandBitLow
jnb WiegandData1, WiegandBitHigh
ajmp WiegandDelay
Proses pembacaan dimulai
pada alamat WiegandByte dengan menetapkan panjang data 8 bit menggunakan
register R7. Kemudian me-reset register akumulator dengan nilai 00H.
Selanjutnya menjalankan
perintah delay yang ditandai dengan perintah DJNZ. Perintah delay pertama
adalah mengurangi jumlah register R5, jika belum kosong maka program akan
melompat ke alamat WiegandWaitBit. Kita bisa menghitung berapa lama interval
delay maksimum sampai selesai. Perintah-perintah DJNZ, JNB dan AJMP membutuhkan
panjang siklus masing-masing sebanyak 2. Sehingga dari perintah DJNZ R5,rel;
JNB P3.2,rel; JNB P3.3,rel dan AJMP rel (rel=relative address) total
membutuhkan 8 siklus. Isi register R5 adalah 255 maka total siklus menjadi 2.040
siklus. Kemudian MOV R5, #data membutuhkan 1 siklus dan DJNZ R4,rel maka siklus
menjadi 2.043 siklus. Isi register r4 juga 255 sehingga menghasilkan 520.965
siklus. Jika dianggap 1 siklus setara dengan 1us maka lama tundaan adalah
520.965us kurang lebih setengah detik. Bandingkan dengan nilai maksimum timing
sesuai standar Wiegand yang kita anggap saja TPW adalah 100us dan TPI
adalah 20ms atau 10.000us. Terdapat 26 TPW dengan 2.600us ditambah
25 TPI dengan 250.000us jadi total waktu ada 252.600us.
Tapi perhitungan di atas
tidak termasuk jika program melompat ke WiegandBitLow atau WiegandBitHigh.
Perintah delay di atas untuk menjaga jika masukan D0 dan D1 mengalami kesalahan
yang disebabkan karena kejutan listrik atau kesalahan pada perangkat pembaca
kartu.
Jika sampai batas waktu
yang ditetapkan hingga nilai register R4 habis, maka program akan menjalankan
perintah mengisi kembali registor R0 dengan register B. Kemudian menetapkan
register R7 dengan 3 untuk panjang loop.
Alamat WiegandDlyLoop
berisi perintah pengosongan isi data pada alamat sesuai isi register R0
sebanyak 3 byte. Kemudian mengembalikan isi register R0 dan akhirnya memaksa
aplikasi keluar dengan perintah RET.
Alamat WiegandWaitBit
memeriksa masukan WiegandData0 dan WiegandData1. jika D0 rendah maka program melompat ke
WiegandBitLow namun jika D1 yang rendah akan melompat ke WiegandBitHigh.
WiegandBitLow:
jnb WiegandData0, $
clr c
rlc a
ajmp WiegandBitSet
WiegandBitHigh:
jnb WiegandData1, $
setb c
rlc a
WiegandBitSet:
djnz
r7, WiegandWaitBit
mov @r0, a
inc r0
djnz r6, WiegandByte
pop 0h
ret
Perintah pada alamat
WiegandBitLow diawali dengan memeriksa gerbang P3.2 dan menunggu menjadi tinggi
selama waktu TPW. Kemudian aplikasi akan meproses selama masa TPI dengan
me-reset bit CY (carry) menjadi rendah dilanjutkan dengan merotasi ke kiri
register akumulator termasuk bit CY. Selanjutnya program melompat ke alamat
WiegandBit Set.
Isi perintah pada alamat
WiegandBitHigh hampir sama untuk memeriksa gerbang P3.3 Namun memproses dengan
mengeset bit CY menjadi tinggi lalu merotasi ke kiri register akumulator
termasuk bit CY.
Alamat WiegandBitSet
adalah untuk loop dengan pedoman register R7. Nilai register R7 awalnya adalah
8 untuk melaksanakan perintah ini mulai dari alamat WiegandWaitBit sebanyak 8
kali untuk 1 byte panjang data. Setelah 1 byte selesai maka selanjutnya data
akumulator disalin ke alamat yang tertulis pada register R0. Setelah menaikkan
nilai register R0 untuk menuju alamat data berikut maka program akan memeriksa
register R6 yang semula berisi 3 untuk 3 byte. Jika R6 sudah kosong, berarti 3
byte data wiegand sebanyak 24 bit sudah didapat. Pulsa berikutnya dari masukan
D0 atau D1 di abaikan. Program segera mengembalikan isi register R0 dan keluar
dari aplikasi sub-rutin.
Udah ya, makasih udah baca
postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan oleh sobat
semua. Selamat mencoba ....
Salam....
Tidak ada komentar:
Posting Komentar