Translate

Modul Aplikasi Wiegand 26 Bit Pada Keluarga MCS 51


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