Translate

LED Matriks Untuk Supervisory Monitoring Lift



Lift atau elevator digunakan pada semua gedung pencakar langit. Pada sebuah Lift pastinya Sobat sering melihat tampilan yang menunjukkan posisi lantai. Jadi saat menunggu atau sedang menggunakannya kita bisa mengetahuinya.

Namun aku tidak bermaksud membahas soal tampilan yang ada di dalam kabin atau lantai gedung. Atau membahas soal Lift itu sendiri. Yang akan kita bahas adalah sistem monitoring Lift yang umumnya hanya ada pada ruang kendali.

Apa saja yang pada umumnya ditampilkan pada monitoring Lift di ruang kendali? Yang utama, sebuah perangkat monitoring adalah menampilkan posisi lantai dari keberadaan Lift tersebut. Ketika Lift sedang bergerak, monitoring harus pula menampilkan arah naik atau turun. Pada ruang kendali juga harus mengetahui status dari lift yang meliputi kondisi Normal, Service atau Trouble. Semua sinyal yang diperlukan biasanya dikeluarkan oleh perangkat kendali Lift. Namun pada Lift jenis lama sinyal tersebut biasanya berbentuk tegangan sebesar 24 volt..

Nah, aku pernah membuat sebuah peraga yang menampilkan monitoring Lift dan akan dibahas pada tulisan kali ini.

Aku membagi sinyal ke dalam 2 grup yaitu sinyal status dan sinyal penunjuk lantai. Ada 5 bit sinyal status yaitu Up (naik), Down (turun), Normal, Service dan Trouble. Dan setidaknya ada 18 bit sinyal posisi lantai meliputi Basement 1 (B1), Lantai 1, Mezanine (M), 2, 3, 3A, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17. Total masukan adalah 24 bit.

Sebelum membuat program aplikasi di samping kita mengetahui jumlah dan jenis masukan yang akan diolah, kita juga wajib mengetahui karakteristik dari setiap masukan tersebut. Tegangan sinyal yang akan diolah adalah 24 volt (namun setelah diaplikasikan ternyata hanya 5 volt saja dan kesalahan seperti ini harusnya bisa menjadi pelajaran karena terpaksa aku harus membuang semua dioda zener yang ada yang masing-masing bernilai 18 volt).

Untuk masukan status Normal, Service dan Trouble bersifat tetap. Salah satu dari dari masukan itu selalu ada. Jadi pada aplikasi tidak ada perlakuan khusus karena kita hanya perlu menampilkan salah satu sinyal tersebut pada peraga.

Untuk masukan status Up dan Down sedikit berbeda. Sinyal Up muncul saat lift akan atau sedang bergerak naik dan sinyal Down untuk turun. Ada masa ketika lift dalam keadaan diam biasanya saat parkir kedua sinyal tersebut sama sekali tidak ada. Namun untuk sinyal status, kembali tidak ada perlakukan khusus dan kita hanya perlu menampilkan sinyal tersebut apa adanya.

Pada masukan posisi lantai hampir sama dengan status Up dan Down. Pada saat lift bergerak dan pada posisi antara 2 lantai maka terjadi kekosongan sinyal. Aplikasi harus diberikan perlakuan khusus yaitu mengingat posisi lantai terakhir sebelum terjadi kekosongan tersebut.

Setelah kita mengetahui jumlah, jenis dan karakteristik setiap masukan maka selanjutnya adalah membuat diagram kerja dari rangkaian yang akan dibuat. Adapun diagram yang dimaksud seperti diperlihatkan pada gambar berikut ini.


Ada 2 bagian diperlukan untuk membuat panel monitoring, yaitu enkoder paralel ke serial dan dekoder peraga matriks. Enkoder paralel ke serial berfungsi memproses masukan yang terdiri dari 23 bit. Enkoder ini mengolah masukan yang terdiri dari 3 fungsi bagian yaitu status lift, posisi naik dan turun serta posisi lantai. Hasil dari pengolahan kemudian akan diumpankan ke dekoder melalui saluran serial RS232. Selanjutnya dekoder akan memproses masukan menjadi tampilan yang dapat dilihat.



Enkoder Paralel Ke Serial

Rangkaian enkoder dibangun menggunakan mikrokontroler AT89C51. Untuk menerima masukan digunakan 3 gerbang meliputi P0, P1 dan P2. Sementara untuk fasilitas komunikasi serialnya adalah P30 (RXD) dan P31 (TXD). Rangkaian lengkapnya seperti berikut ini.


Dalam prosesnya, rangkaian enkoder akan memberikan keluaran pada pin 11 (TXD) atau P31 yang digunakan untuk memberikan data informasi secara serial ke rangkaian dekoder peraga matriks. Pin gerbang P32 digunakan untuk indikator LED yang menunjukkan proses pengiriman data. Sementara gerbang lainnya dari P3 yaitu P33 sampai P37 digunakan untuk seting alamat. Pada aplikasi yang ditulis, dimanfaatkan untuk menentukan mode kerja dari mikrokontroler sebagai enkoder atau dekoder.

Sementara itu gerbang-gerbang lainnya, yaitu P1, P0 dan P2 digunakan sebagai jalur masukan. Khusus untuk gerbang P0, perlu kita tambahkan resistor pull-up pada setiap bit gerbang tersebut. Masukan ke-3 gerbang ini, masing-masing dihubungkan ke transistor array ULN2803 sebagai buffer tegangan membalik terhadap jalur sinyal yang masuk.

Dekoder Peraga Matriks.

Untuk peraga Lift Supervisory digunakan 2 buah komponen LED matriks 8x8 sehingga menghasilkan 16x8. Rangkaian lengkapnya seperti di bawah ini.


Masukan baris dari kedua LED matriks terhubung langsung ke gerbang P0 dan P2 dari AT89C51. Penulis memang tidak menggunakan penahan resistor karena secara internal, setiap gerbang memiliki pembatas arus sebesar 20mA.

Masing-masing kolom dari kedua LED matriks dihubung secara paralel ke Led Driver yang dibangun menggunakan transistor C9012.

DATA IN digunakan untuk menerima data informasi yang akan ditampilkan pada peraga.



Format Dan Bentuk Tampilan Pada LED Matriks

Sebelum kita melangkah pada pembahasan program aplikasi yang harus dibuat untuk diisikan pada mikrokontroler AT89C51, kita rancang terlebih dahulu mengenai bentuk dari informasi yang akan ditampilkan pada LED matriks. Sebagai dasar pijakan adalah ukuran dari LED matriks yaitu 16x8. Ini menunjukkan bahwa data tampilan tidak boleh melebihi 16 kolom dan 8 baris, bahkan penulis menetapkan jumlah data baris hanya 7 bit saja.

Kita mulai dengan bentuk karakter untuk penampilan dari 19 lantai. Jumlah data yang dibutuhkan untuk setiap karakter lantai adalah 9 byte.


Selanjutnya adalah bentuk informasi berbentuk penunjuk yang mengindikasikan posisi arah lift naik dan turun. Untuk indikasi naik dan turun memerlukan setidaknya 5 byte yang akan ditempatkan pada bagian akhir dari data peraga LED matriks terakhir. Tampilan status naik dan turun juga akan dibuat secara animasi.


Nah, sebagai contoh jika posisi lantai pada Basement 1 dan arah lift akan naik, maka tampilan awalnya akan seperti berikut ini.



Untuk status NORMAL, SERVICE dan TROUBLE tidak dimasukkan dalam LED matriks tapi menggunakan LED yang terpisah di mana untuk Normal menggunakan LED berwarna hijau, Service dengan LED kuning dan Trouble menggunakan merah.

Dari tulisan di atas sudah kita ulas mengenai gambar rangkaian dan format tampilan karakter. Pada kesempatan artikel kali ini, sengaja penulis lampirkan bentuk PCB (printed circuit board) dari rangkaian Supervisory Lift Monitoring.

Kita mulai dengan rancangan PCB untuk rangkaian enkoder paralel ke serial. Gambar sebelah atas adalah layout PCB bagian yang disolder. Sementara di bawahnya adalah tata letak komponennya.




Pada rancangan di atas yaitu pada bagian masikannya dapat dilihat penggunaan dioda zener yang berfungsi mengurangi tegangan masuk sebesar 24 volt. Tapi jika tegangan masuknya adalah 5 volt maka dioda-dioda zeder di atas dapat diganti dengan kawal jumper.

Berikut adalah PCB untuk rangkaian dekodernya.




Gambar PCB terakhir berikut adalah untuk rangkaian penampil LED matriks.




Pada tulisan di atas sudah kita bahas mengenai rancangan rangkaian, format tampilan dan PCB dari Supervisory Monitoring Lift yang dibuat. Setelah semua rangkaian di atas dibuat dan jadi, maka selanjutnya diperlukan program aplikasi untuk dijalankan oleh mikrokontroler AT89C51.

Penulis, waktu itu membuat rancangan tersebut untuk memonitor sebanyak 7 lift. Hasil rancangan yang sudah jadi dan digunakan seperti berikut ini.


Jangan ditanya, berapa kabel yang harus penulis rakit karena cukup banyak. Bayangkan saja untuk sebuah lift saja memerlukan 24 kabel belum termasuk grounding sebanyak 2 buah. Jadi total ada sekitar 182 kabel. Ya, ini sekedar curhat saja.

Untuk memonitor kondisi lift sesuai rancangan kita terdahulu, setidaknya memerlukan 2 buah mikrokontroler AT89C51 masing-masing untuk rangkaian enkoder dan lainnya untuk dekoder. Tapi dalam rancangan aplikasi, penulis hanya membuat sebuah saja. Penulis sengaja membuat aplikasi enkoder dan dekoder menjadi satu kesatuan agar mempermudah pemasangan komponen mikrokontroler. Jadi mikrokontroler yang dipasang pada enkoder dapat saling bertukar tempat dengan rangkaian dekoder. Untuk membedakan proses kerjanya maka pada pin gerbang P33 akan diperiksa. Jika terhubung ke ground atau berlogika 0 maka program akan menjalankan aplikasi enkoder paralel ke serial. Sementara jika diambangkan atau dihubungkan ke catu 5 volt sehingga berlogika 1 maka program akan menjalankan aplikasi dekoder. Sederhana dan praktis bukan dalam hal pemasangan dan terlebih untuk perawatannya.

Penulis membuat aplikasi dengan membagi ke dalam 4 bagian file penulisan yaitu LIFTSPV.ASM, ENKODER.TXT, DEKODER.TXT dan DISPLAY.TXT. File bernama Liftspv.ASM adalah aplikasi utama yang nantinya akan dikompilasi.

Kita mulai dengan melihat aplikasi Liftspv.asm berikut ini.

$mod51

EncLED            bit   p3.2
EncMode           bit   p3.3

RegData     data  08h
RegUpDown   data  18h
RegUnitNo   data  19h
RegFloor    data  1ah
RegStatus   data  1bh
Matriks1    data  p2
Matriks2    data  p0
Scanner     data  p1
Flag        data  21h
      EncDirBit   bit   Flag.0
      EnStatBit   bit   Flag.1
      BitUpDn     bit   Flag.2
StackPointer      equ   27h

Pada penulisan konfigurasi di atas kita tetapkan pin-pin gerbang yang digunakan. Untuk enkoder kita perlu mengkonfigurasikan P32 (EncLED) untuk indikator Serial dan P33 (EncMode) untuk seting mode enkoder. Kita juga perlu mengkonfigurasi register bit (Flag) untuk bit-bit status EncDirBit, EnStatBit dan BitUpDn.

Untuk dekoder, konfigurasi diperlukan untuk gerbang P0, P1 dan P2 serta beberapa register yang diperlukan.

org   0
      mov   sp, #StackPointer
      mov   scon, #50h
      mov   tmod, #20h
      mov   tl1, #0fdh
      mov   th1, #0fdh
      setb  tr1
      mov   pcon, #0
      mov   ie, #90h
      mov   RegData, #0
      jnb   EncMode, AppEnc
      ajmp  AppDsp

Pada awal program di atas dimulai pada alamat 0000H, hal pertama yang akan dijalankan oleh mikrokontroler adalah inisialisasi mode serial. Kecepatan baudrate ditetapkan pada 9600 bps. Usai inisialisasi, akhirnya program akan memeriksa status pin P33 atau EndMode di mana jika bernilai 0 akan bercabang ke AppEnc, sedangkan jika bernilai 1 akan dicabangkan ke AppDsp.

Subrutin berikut adalah program interupsi serial yang dijalankan baik oleh rangkaian enkoder maupun dekoder. Pada mode dekoder, program akan dicabangkan ke DspSer, sementara pada mode enkoder maka subrutin akan menjalankan pemeriksaan register akumulator dengan membandingkannya dengan isi dari lokasi data RegUnitNo.

Sebagai informasi saja bahwa penulis merancang rangkaian enkoder untuk dapat dihubungkan ke perangkat PC. Tujuannya tidak lain adalah jika ada keinginan untuk menghubungkan keaplikasi Supervisory Monitoring pada PC maka perangkat dapat melakukan hal tersebut. Jika ini terjadi maka tidak perlu lagi adanya rangkaian dekoder.

org   23h
      push  acc
      push  b
      push  06h
      push  07h
      jnb   ri, $
      clr   ri
      clr   ti
      jb    EncMode, DspSer
      mov   a, sbuf
      mov   b, RegUnitNo
      xrl   a, b
      jnz   EndSer
      clr   EncLED
      mov   a, RegFloor
      acall SendIP
      mov   a, RegStatus
      acall SendIP
      setb  EncLED
      ajmp  EndSer

SendIP:
      clr   ea
      mov   sbuf, a
      jnb   ti, $
      clr   ti
      setb  ea
      ret

Interupsi komunikasi serial untuk dekoder dijalankan pada subrutin berikut ini. Data yang masuk pada buffer serial setelah dipindahkan ke register akumulator selanjutnya diperiksa status bit ke-7 yaitu ACC.7 untuk menentukan status proses yang akan dijalankan. Jika ACC.7 berisi 0 maka program akan menjalankan subrutin AppDec dengan menyalin data akumulator ke register R2, sebaliknya jika 1 maka subrutin AppSta yang akan dijalankan setelah menyalin data akumulatorke register R3.

DspSer:
      mov   a, sbuf
      jb    acc.7, SerDir
      mov   r2, a
      acall AppDec
      ajmp  EndSer

SerDir:
      mov   r3, a
      acall AppSta

EndSer:
      pop   07h
      pop   06h
      pop   b
      pop   acc
      reti

File program aplikasi yang dibutuhkan untuk menjalankan rangkaian enkoder atau dekoder diset pada baris perintah berikut.

$include (C:\tesasm\Encoder.txt)
$include (C:\tesasm\Decoder.txt)
$include (C:\tesasm\Display.txt)

Data tampilan berupa karakter ditetapkan pada PROM ditunjukkan seperti di bawah ini. Data meliputi animasi status naik dan turun serta tampilan penunjuk lantai. ChrUp1 – ChrUp4 adalah data untuk tampilan bergerak lift menuju ke atas atau naik. ChrDn1 – ChrDn4 untuk tampilan bergerak status turun. ChrB – Chr17 untuk tampilan posisi lantai. ChrStop untuk tampilan kosong dari tampilan status naik atau turun pada LED matriks. ChrBlank untuk menampilkan “––“ pada lantai saat status “service”.

ChrUp1:     db 221, 187, 119, 187, 221
ChrUp2:     db 187, 119, 239, 119, 187
ChrUp3:     db 119, 239, 221, 239, 119
ChrUp4:     db 239, 221, 187, 221, 239
ChrDn1:     db 119, 187, 221, 187, 119
ChrDn2:     db 187, 221, 239, 221, 187
ChrDn3:     db 221, 239, 119, 239, 221
ChrDn4:     db 239, 119, 187, 119, 239
ChrStop:    db 255, 255, 255, 255, 255
ChrB:       db   1, 109, 109, 109, 147, 255, 255, 255, 255
Chr1:       db 255, 189,   1, 253, 255, 255, 255, 255, 255
ChrM:       db   1, 191, 199, 191,   1, 255, 255, 255, 255
Chr2:       db 189, 121, 117, 109, 157, 255, 255, 255, 255
Chr3:       db 187, 125, 109, 109, 147, 255, 255, 255, 255
Chr3A:      db 187, 109, 109, 147, 255, 129, 119, 119, 129
Chr5:       db  27,  93,  93,  93,  99, 255, 255, 255, 255
Chr6:       db 131, 109, 109, 109, 179, 255, 255, 255, 255
Chr7:       db 127, 127,  97,  95,  63, 255, 255, 255, 255
Chr8:       db 147, 109, 109, 109, 147, 255, 255, 255, 255
Chr9:       db 155, 109, 109, 109, 131, 255, 255, 255, 255
Chr10:      db 189,   1, 253, 255, 131, 125, 125, 125, 131
Chr11:      db 189,   1, 253, 255, 255, 255, 189,   1, 253
Chr12:      db 189,   1, 253, 255, 189, 121, 117, 109, 157
Chr13:      db 189,   1, 253, 255, 187, 125, 109, 109, 147
Chr14:      db 189,   1, 253, 255, 247, 231, 215, 183,   1
Chr15:      db 189,   1, 253, 255,  27,  93,  93,  93,  99
Chr16:      db 189,   1, 253, 255, 131, 109, 109, 109, 179
Chr17:      db 189,   1, 253, 255, 127, 127,  97,  95,  63
ChrBlank:   db 239, 239, 239, 255, 255, 239, 239, 239, 255

end

Aplikasi program enkoder yang terdapat pada file ENKODER.TXT diawali dengan rutin AppEnc. Pada rutin ini, pertama kali adalah mengambil informasi alamat yang terdapat pada gerbang P3 pada nible MSB (most significant bit) yaitu P37 sampai P34 yang merupakan data alamat fisik. Informasi alamat tersebut kemudian dipindah ke nible LSB sebelum dimasukkan ke register RegUnitNo. Jika perangkat enkoder terhubung pada PC maka nilai RegUnitNo tidak boleh kosong. Unit harus ditetapkan pada alamat 1 sampai 15.

AppEnc:
      mov   a, p3
      cpl   a
      anl   a, #0f0h
      jnz   PCLink
      clr   ea
      ajmp  FloorA

PCLink:
      swap  a
      mov   RegUnitNo, a

Rutin selanjutnya adalah memeriksa masukan pada gerbang-gerbang P1, P0 dan P2 untuk memeriksa posisi lantau dan status. Rutin FloorA digunakan untuk memeriksa gerbang P1 yang berisi informasi lantai Basement (B1) sampai Lantai 6. Informasi ini disimpan pada register R5 dan jika kosong maka program akan bercabang ke gerbang berikut pada rutin FoorB. Jika informasi menunjukkan bahwa posisi lift pad lantai sesuai gerbang P1 maka data akan dibandingkan dengan register R0 yang berisi data sebelumnya. Jika ada perubahan karena lift sudah berpindah lantai maka informasi akan diproses.

FloorA:
      clr   c
      mov   a, p1
      cpl   a
      mov   r5, a
      jz    FloorB
      xrl   a, r0
      jz    EncDir
      acall FloorX
      mov   r0, a
      mov   r5, #0
      ajmp  FloorE

Rutin FloorB hampir sama dengan di atas, hanya saja gerbang masukan yang diperiksa adalah P0 untuk informasi Lantai 7 sampai 14 dan data sebelumnya disimpan pada register R1.

FloorB:
      mov   a, p0
      cpl   a
      mov   r5, a
      jz    FloorC
      xrl   a, r1
      jz    EncDir
      acall FloorX
      mov   r1, a
      mov   r5, #8
      ajmp  FloorE

Pada rutin FloorC gerbang P2 untuk 3 lantai terakhir yaitu Lantai 15 sampai 17 yang terdapat pada P27 sampai P25 sehingga diperlukan perintah logika AND dengan data 11100000b. Disini pembanding informasi masukan terdahulu terdapat pada register R2.

FloorC:
      mov   a, p2
      cpl   a
      anl   a, #0e0h
      mov   r5, a
      jz    EncDir
      xrl   a, r2
      jz    EncDir
      acall FloorX
      mov   r2, a
      mov   r5, #16

Rutin FloorD digunakan untuk menentukan posisi lantai sebenarnya. Register R5 berisi informasi lantai sebelumnya yaitu Lantai 14 dengan data 16 atau 10H. Penggunaan perintah RLC dikarenakan pada P2 urutan data lantai diawali dari MSB. Hasil dari rutin ini adalah penunjukkan informasi antara 11H sampai 13H.

FloorD:
      inc   r5
      rlc   a
      jnc   FloorD
      ajmp  FloorF

Sementara, rutin FloorE digunakan untuk memperoleh informasi sebenarnya lantai. Di sini digunakan perintah RRC karena urutan lantai dimulai dari LSB. Pada rutin FloorA sebelumnya nilai register R5 adalah 0 sehingga hasil yang mungkin pada register R5 adalah nilai 01H sampai 08H. Sementara jika rutin ini berasal dari rutin FloorB dengan nilai register R5 awal 08H maka hasil yang mungkin adalah 09H sampai 10H.

FloorE:
      inc   r5
      rrc   a
      jnc   FloorE

Hasil dari rutin FloorD dan FloorE kemudian disimpan pada RegFloor. Program selanjutnya memeriksa RegUnitNo di mana jika 0 maka informasi akan langsung dikirim melalui gerbang serial.

FloorF:
      mov   RegFloor, r5
      mov   a, RegUnitNo
      jnz   EncDir
      acall SerTxD
      ajmp  EncDir

FloorX:
      mov   r0, #0
      mov   r1, #0
      mov   r2, #0
      mov   a, r5
      ret

Rutin EncDir adalah rutin untuk memeriksa status. Rutin ini akan menetapkan bit ACC.7 berlogika 1 untuk bit penunjuk dari RegStatus. Status yang pertama diperiksa adalah informasi bit P24 dan P23 atau status naik atau turun. Jika status naik-turun ada maka bit EncDirBit akan diset 1. Pemeriksaan status dilanjutkan pada rutin EnStat untuk status normal, service dan trouble dari P22 sampai P20. Jika informasi tidak kosong maka bit EnStatBit diset 1. Logikanya, seharusnya EncStatBit akan selalu 1 kecuali ada kabel untuk salah satu status tersebut terputus.

EncDir:
      mov   a, p2
      cpl   a
      anl   a, #1fh
      orl   a, #80h
      mov   RegStatus, a
      mov   r5, a
      anl   a, #18h
      jz    EnStat
      setb  EncDirBit

EnStat:
      mov   a, r5
      anl   a, #07h
      jz    EncEnd
      setb  EnStatBit

EncEnd:
      jnb   EncDirBit, EncTmr
      jnb   EnStatBit, EncTmr
      mov   a, r5
      xrl   a, r3
      jz    EncRst
      mov   a, r5
      mov   r3, a
      ajmp  EncOke

EncTmr:
      djnz  r7, EncDly
      mov   r7, #255
      djnz  r6, EncDly

Kemudian nilai RegUnitNo kembali diperiksa untuk menentukan apakah data langsung dikirim atau tidak.

EncOke:
      mov   a, RegUnitNo
      jnz   EncDly
      acall SerTxD

EncRst:
      mov   r6, #255
      mov   r7, #255

EncDly:
      mov   Flag, #0
      ajmp  FloorA

SerTxD:
      clr   EncLED
      mov   sbuf, r5
      jnb   ti, $
      clr   ti
      setb  EncLED
      ret

Untuk aplikasi dekoder yang terdapat pada file DEKODER.TXT berisi beberapa subrutin. Diawali dengan subrutin AppDec di mana mula-mula register DPTR ditetapkan berisi alamat ChrBlank kemudian akan diproses jika nilai register R2 kosong. Jika register R2 tidak kosong maka register DPTR diisi alamat awal dari karakter tampilan lantai yaitu ChrB. Selanjutnya dengan rutin LupDec, posisi alamat karakter lantai yang sesuai akan dicari menggunakan rutin NxtDec dan NxtAdd. Setelah alamat ditentukan maka selanjutnya adalah melakukan pengesetan peraga menggunakan subrutin SetDsp.

AppDec:
      push  02h
      mov   dptr, #ChrBlank
      mov   a, r2
      jz    SetLvl
      mov   dptr, #ChrB
      ajmp  LupDec

NxtDec:
      mov   r4, #9

NxtAdd:
      inc   dptr
      djnz  r4, NxtAdd

LupDec:
      djnz  r2, NxtDec

SetLvl:
      acall SetDsp
      pop   02h
      ret

Subrutin AppSta digunakan untuk memeriksa informasi status. Yang pertama diperiksa adalah bit ACC.2 atau status normal dengan indikator pada P35. Jika bit status normal 0 maka pemeriksaan dilanjutkan pada bit lainnya yaitu ACC.1 untuk status service dan indikator P36 dan seterusnya untuk ACC.0 untuk status trouble dengan indikator P37.

AppSta:
      mov   a, r3
      jnb   acc.2, StServ
      mov   p3, #11011111b
      ret

StServ:
      jnb   acc.1, StTrbl
      mov   p3, #10111111b
      ret

StTrbl:
      jnb   acc.0, StBlnk
      mov   p3, #01111111b
      ret

StBlnk:
      mov   p3, #255
      ret

Subrutin SetDsp digunakan untuk mengisi buffer RegData sesuai alamat yang ditunjuk register DPTR. Selama pemutakhiran data sebanyak 9 byte berdasarkan register R7, register 00H diamankan agar tidak mengganggu rutin utama. Pemutakhiran dilakukan menggunakan subrutin Rd_ROM. Selanjutnya subrutin SetDsp diakhiri dengan mengisi byte ke 10 (RegData+9) dan 11 (RegData+10) dengan 255 sehingga pada kolom yang sesuai dari penampil LED matriks akan padam.

SetDsp:
      mov   r7, #9
      push  0h
      mov   r0, #RegData
      acall Rd_ROM
      pop   0h
      mov   RegData+9, #255
      mov   RegData+10, #255
      ret

Fungsi subrutin SetDir sama dengan di atas tapi untuk tampilan arah naik atau turun yang dimulai pada byte ke-12 atau RegData+11 sebanyak 5 byte.

SetDir:
      mov   r7, #5
      push  0h
      mov   r0, #RegData+11
      acall Rd_ROM
      pop   0h
      ret

Subrutin Rd_ROM berguna untuk memindahkan data sesuai alamat PROM yang ditunjuk oleh register DPTR ke register yang ditunjuk oleh R0 sebanyak nilai register R7.

Rd_ROM:
      clr   a
      movc  a, @a+dptr
      mov   @r0, a
      inc   dptr
      inc   r0
      djnz  r7, Rd_ROM
      ret

Subrutin Rd_Dsp berguna untuk menetapkan keluaran gerbang Matriks1 dengan register R0 dan gerbang Matriks2 dengan R1. Sebelum proses pengisian tersebut gerbang Scanner ditetapkan ke 255 untuk mematikan keluarannya. Nilai-nilai register R6 dan R7 adalah untuk menentukan lamanya tundaan dari pergeseran byte yang ditampilkan selama kurang lebih 2,2 ms. Untuk 8 kolom maka diperoleh perioda mendekati 18 ms sehingga frekuensi kedipan LED sebesar 55,6 Hz.  

Rd_Dsp:
      djnz  r7, $
      mov   r7, #255
      djnz  r6, Rd_Dsp
      mov   r6, #4
      mov   Scanner, #255
      mov   a, @r0
      inc   r0
      mov   Matriks1, a
      mov   a, @r1
      inc   r1
      mov   Matriks2, a
      ret

Aplikasi display pada DISPLAY.TXT adalah merupakan aplukasi utama dari mode dekoder. Program AppDsp dan seterusnya akan menampilkan isi dari buffer RegData ke penampil LED matriks. Saat pertama kali dijalankan, program akan mengosongkan penampil.

AppDsp:
      mov   r0, #RegData
      mov   r7, #16

ClrDsp:
      mov   @r0, #255
      inc   r0
      djnz  r7, ClrDsp
      mov   r7, #1
      mov   r6, #1

LupDsp:
      mov   r5, #40

Pada rutin LupDsp, isi register R5 adalah 40, ini berhubungan dengan rutin berikut yaitu Disply yang berfungsi menampilkan isi RegData pada LED matriks. Nilai tersebut menetapkan pergerakan animasi penunjuk naik dan turun sekitar 0,7 ms.

Disply:
      mov   r0, #RegData
      mov   r1, #RegData+8
      acall Rd_Dsp
      mov   Scanner, #254
      acall Rd_Dsp
      mov   Scanner, #253
      acall Rd_Dsp
      mov   Scanner, #251
      acall Rd_Dsp
      mov   Scanner, #247
      acall Rd_Dsp
      mov   Scanner, #239
      acall Rd_Dsp
      mov   Scanner, #223
      acall Rd_Dsp
      mov   Scanner, #191
      acall Rd_Dsp
      mov   Scanner, #127
      djnz  r5, Disply

Sampai disini setelah perintah looping untuk scaning selesai, perintah dilanjutkan dengan pemeriksaan informasi status yang disimpan pada register R3. Status yang diperiksa adalah posisi naik (bit 4) atau turun (bit 3). Jika salah satu bit tersebut tinggi maka program akan bercabang ke rutin yang sesuai. Tapi jika tidak ada maka program akan menjalankan perintah untuk mengosongkan peraga.

      mov   a, r3
      jb    acc.4, Dsp_Up
      jb    acc.3, Dsp_Dn
      mov   dptr, #ChrStop
      mov   RegUpDown, #1
      ajmp  DspDir

Rutin Dsp_Up adalah program yang dijalankan untuk memperagakan secara animasi arah lift naik. Untuk menentukan prosedur awal animasi digunakan BitUpDn di mana untuk arah naik harus bernilai 1, sementara untuk menentukan informasi pergerakan dengan data tampilan yang sesuai digunakan register RegUpDn. Register DPTR dapat berisi alamat PROM ChrUp1, ChrUp2, ChrUp3 dan ChrUp4.

Dsp_Up:
      jb    BitUpDn, Set_Up
      setb  BitUpDn
      mov   RegUpDown, #1           ;Start animasi

Set_Up:
      mov   a, RegUpDown
      cjne  a, #1, DspUp1
      mov   dptr, #ChrUp1           ;Display #1
      ajmp  DspDir

DspUp1:
      cjne  a, #2, DspUp2
      mov   dptr, #ChrUp2           ;Display #2
      ajmp  DspDir

DspUp2:
      cjne  a, #3, DspUp3
      mov   dptr, #ChrUp3           ;Display #3
      ajmp  DspDir

DspUp3:     mov   RegUpDown, #0
      mov   dptr, #ChrUp4           ;Display #4
      ajmp  DspDir

Rutin Dsp_Dn berfungsi sama dengan rutin di atas hanya saja BitUpDn dibuat bernilai 0 untuk animasi turun dan register DPTR bisa berisi ChrDn1, ChrDn2, ChrDn3 ddan ChrDn4.

Dsp_Dn:
      jnb   BitUpDn, Set_Dn
      clr   BitUpDn
      mov   RegUpDown, #1

Set_Dn:
      mov   a, RegUpDown
      cjne  a, #1, DspDn1
      mov   dptr, #ChrDn1
      ajmp  DspDir

DspDn1:
      cjne  a, #2, DspDn2
      mov   dptr, #ChrDn2
      ajmp  DspDir

DspDn2:
      cjne  a, #3, DspDn3
      mov   dptr, #ChrDn3
      ajmp  DspDir

DspDn3:
      mov   RegUpDown, #0
      mov   dptr, #ChrDn4

DspDir:
      acall SetDir
      inc   RegUpDown
      ajmp  LupDsp

Pada program Enkoder.txt, ada sedikit tambahan fasilitas yang penulis berikan yaitu komunikasi ke PC. Implementasinya, menurut penulis, bisa diaplikasikan untuk penampilan menggunakan layar monitor pada PC sebagai dekoder peraganya. Untuk keperluan komunikasi dengan PC tentu memerlukan aplikasi yang dijalankan, maka dibuatkan sebuah aplikasi simulasi menggunakan pemrograman Visual Basic. Aplikasi simulasi yang dibuat ternyata ada juga manfaatnya, yaitu untuk menguji perangkat enkoder dan dekoder.

Nah, tampilan dari aplikasi simulasi seperti berikut ini.


Persiapan yang perlu dilakukan untuk menghasilkan tampilan aplikasi di atas adalah membuat sebuah proyek yang diberi nama pjkDisplay. Kemudian membuat sebuah form frmDisplay dengan caption kita isi “Serial RS232 Encoder/Decoder Display Simulation”. Kemudian setidaknya ada 4 frame yaitu fraLevel dengan caption “Floor Level”, fraUpDown dengan caption “Up?Down”, fraStatus dengan caption “Status” dan fraMode dengan caption “Simulation”.

Pada fraLevel, kita isi dengan sebuah label bernama lblLevel dengan ukuran font Arial berukuran 36. Pada fraUpDown, kita isi dengan 2 buah OptionButton, masing-masing optUp dengan caption “Up” dan optDown dengan caption “Down”. Kemudian pada fraStatus diisi dengan 3 buah OptionButton masing-masing adalah optNormal, optService dan optTrouble dengan caption sesuai fungsinya. Terakhir adalah fraMode berisi sebuah label bernama lblMode dengan font standar MS Sans Serif berukuran 18.

Untuk melihat proses komunikasi yang sedang berlangsung, ditambahkanlah sebuah TextBox bernama txtProses. Kemudian dilengkapi pula dengan 2 buah CommandButton, masing-masing cmdStart dengan caption awal “DECODER” dan cmdKeluar dengan caption “E X I T”.

Melengkapi aplikasi juga ditambahkan sebuah Timer dengan nama tmrEnkoder karena hanya berlaku untuk aplikasi simulasi enkoder saja. Kemudian dengan menambahkan komponen pada tab General yaitu “Microsoft Comm Control 6.0” kita bisa menambahkan sebuah MSComm1 untuk keperluan komunikasi melalui port serial RS232.

Jika persiapan di atas sudah selesai selanjutnya tinggal menuliskan beberapa perintah berikut yang akan dilaksanakan.

Setelah Option Explicit kita perlu mendeklarasikan 3 buah variable yang akan digunakan dalam proses yaitu Level dengan format integer dan variabel teks yaitu Floor dan Serial.

Option Explicit

Dim Level%, Floor$, Serial$

Private Sub cmdKeluar_Click()
    End
End Sub

Subrutin untuk cmdKeluar digunakan untuk keluar dari aplikasi.

Selanjutnya cmdStart digunakan untuk memilih mode simulasi yang akan dijalankan yaitu enkoder atau dekoder. Isi dari kotak perintah ini berlawanan dengan mode aplikasi yang dijalankan. Pada mode enkoder, aplikasi berfungsi seperti sebuah enkoder yang akan menghasilkan keluaran serial dengan data informasi lanatai atau status. Pada mode dekoder, aplikasi berfungsi seperti dekoder yang akan menampilkan posisi lantai dan status sesuai data serial yang diterima.

Jika cmdStart adalah “ENCODER”, maka aplikasi akan berfungsi dalam mode dekoder dengan mematikan fungsi tmrEnkoder dan lblMode berisi “DECODER MODE”. Sebaliknya jika cmdStart adalah “DECODER” maka aplikasi berfungsi dalam mode enkoder dengan mengaktifkan tmrEnkoder dan lblMode berisi “ENCODER MODE”.

Private Sub cmdStart_Click()
    txtProses.Text = ""
    If cmdStart.Caption = "ENCODER" Then
        cmdStart.Caption = "DECODER": tmrEnkoder.Enabled = True: lblMode.Caption = "ENCODER MODE"
        Else
            cmdStart.Caption = "ENCODER": tmrEnkoder.Enabled = False: lblLevel.Caption = "- -"
            lblMode.Caption = "DECODER MODE"
        End If
End Sub

Saat pertama kali aplikasi dijalankan kita perlu melakukan sedikut persiapan. Pertama kita mengatur nilai Level menjadi “1”. Kemudian kita perlu mengaktifkan gerbang serial. Label lblLevel diisi dengan caption “– –“ dan lblMode dengan “ENCODER MODE”.

Private Sub Form_Load()
    Level = 1: If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
    lblLevel.Caption = "- -": lblMode.Caption = "ENCODER MODE"
    txtProses.Text = "Serial Encoder/Decoder"
End Sub

Kita menggunakan fasilitas komunikasi serial, maka PC setiap kali menerima sebuah data masuk akan memanggil subrutin berikut. Subrutin ini hanya berlaku pada mode dekoder. Pada mode dekoder maka data serial yang masukan akan disimpan pada variabel Serial dan nilainya akan ditampilkan pada txtProses dalam format heksadesimal.

Private Sub MSComm1_OnComm()
    On Error Resume Next
    If cmdStart.Caption = "DECODER" Then Exit Sub
    Serial = MSComm1.Input: txtProses.Text = "Receiving : " & Hex(Asc(Serial)) & "H"

Data serial yang diterima masih berbentuk ASCII sehingga agar dapat diproses akan dikonversikan ke dalam bentuk integer pada variabel Level.

    For Level = 0 To 255
        If Chr(Level) = Serial Then Exit For
    Next Level

Hasil konversi kemudian diperiksa. Jika nilai Level lebih rendah dari 128 maka itu berarti menunjukkan data yang masuk adalah posisi lantai. Jika lebih tinggi dari 128 adalah data status. Ada 5 bit dari status yang akan diperiksa yaitu bit 0 sampai bit 4. Sebagai contoh jika nilai biner data adalah 10010100 berarti bit 7 tinggi sehingga nilai pasti lebih tinggi dari 128, bit 4 tinggi yang berartu posisi lift naik dan bit 2 tinggi menunjukkan status normal. Nilai biner ini setara dengan 148.

    If Level < 128 Then GoTo Lantai
    Select Case Level
        Case 129: optTrouble.Value = True
        Case 130: optService.Value = True
        Case 132: optNormal.Value = True
        Case 136: optDown.Value = True
        Case 137: optDown.Value = True: optTrouble.Value = True
        Case 138: optDown.Value = True: optService.Value = True
        Case 140: optDown.Value = True: optNormal.Value = True
        Case 144: optUp.Value = True
        Case 145: optUp.Value = True: optTrouble.Value = True
        Case 146: optUp.Value = True: optService.Value = True
        Case 148: optUp.Value = True: optNormal.Value = True
    End Select
    Exit Sub

Untuk nilai Level dibawah 128 adalah penunjukan informasi lantai yang bernilai 1 sampai. Nilai tersebut kemudian digunakan untuk mendefinisikan informasi posisi lantai yang ditempatkan pada variabel Floor yang kemudian ditampilkan pada label lblLevel.
   
Lantai:
    Select Case Level
        Case 1: Floor = "B1"
        Case 2: Floor = "1"
        Case 3: Floor = "M"
        Case 4: Floor = "2"
        Case 5: Floor = "3"
        Case 6: Floor = "3A"
        Case 7: Floor = "5"
        Case 8: Floor = "6"
        Case 9: Floor = "7"
        Case 10: Floor = "8"
        Case 11: Floor = "9"
        Case 12: Floor = "10"
        Case 13: Floor = "11"
        Case 14: Floor = "12"
        Case 15: Floor = "13"
        Case 16: Floor = "14"
        Case 17: Floor = "15"
        Case 18: Floor = "16"
        Case 19: Floor = "17"
    End Select
    lblLevel.Caption = Floor
End Sub

Pada fraStatus terdapat 3 buah OptionButton yaitu optNormal, optService dan optTrouble. Kita dapat memilih salah satunya dan pada mode enkoder. Pilihan kita akan segera diproses dengan mengirimkan informasi pada gerbang serial dengan nilai Serial bersesuaian dengan bit 0 sampai dengan bit 2. Pemilihan optNormal akan memeriksa status optUp pada saat pengiriman informasi status. Sementara pada pilihan optService dan optTrouble maka status naik-turun dikosongkan.

Private Sub optNormal_Click()
    If cmdStart.Caption = "ENCODER" Then Exit Sub
    If optUp.Value = True Then Serial = Chr(148) Else Serial = Chr(140)
    MSComm1.Output = Serial: txtProses.Text = "Sending Status: " & Hex(Asc(Serial)) & "H"
    tmrEnkoder.Enabled = True
End Sub
Private Sub optService_Click()
    If cmdStart.Caption = "ENCODER" Then Exit Sub
    lblLevel.Caption = "--": tmrEnkoder.Enabled = False
    Serial = Chr(130): MSComm1.Output = Serial: txtProses.Text = "Sending Status: " & Hex(Asc(Serial)) & "H"
End Sub

Private Sub optTrouble_Click()
    If cmdStart.Caption = "ENCODER" Then Exit Sub
    lblLevel.Caption = Floor: tmrEnkoder.Enabled = False
    Serial = Chr(129): MSComm1.Output = Serial: txtProses.Text = "Sending Status: " & Hex(Asc(Serial)) & "H"
End Sub

Pada fraUpDown terdapat 2 OptionButton yang dapat dipilih untuk penunjukan status naik-turun. Jika salah satu dipilih maka aplikasi akan mengirimkan status naik atau turun. Pemilihan salah satu tombol ini akan menyebabkan status pada kondisi normal dengan mengaktifkan optNormal.

Private Sub optUp_Click()
    Serial = Chr(148): MSComm1.Output = Serial: txtProses.Text = "Sending Status: " & Hex(Asc(Serial)) & "H"
    optNormal.Value = True
End Sub

Private Sub optDown_Click()
    Serial = Chr(140): MSComm1.Output = Serial: txtProses.Text = "Sending Status: " & Hex(Asc(Serial)) & "H"
    optNormal.Value = True
End Sub

Terakhir adalah subrutin timer yaitu tmrEnkoder yang hanya aktif atau dijalankan pada mode enkoder. Variabel yang diproses adalah Level untuk menunjukkan posisi lantai. Posisi tertinggi dari variabel ini yaitu 19 akan mengaktifkan optDown, sebaliknya posisi terendah yaitu 1 akan mengaktifkan optUp. Secara otomatis nilai Level akan bertambah atau berkurang untuk menunjukkan simulasi bahwa lift sedang bergerak naik atau turun. Setiap perubahan posisi lantai maka aplikasi akan mengirimkan data secara serial.

Private Sub tmrEnkoder_Timer()
    If optUp.Value = True Then
        If Level = 19 Then
        optUp.Value = False: optDown.Value = True: Exit Sub
        Else
            Level = Level + 1
        End If
    ElseIf Level = 1 Then
        optUp.Value = True: optDown.Value = False: Exit Sub
        Else
            Level = Level - 1
    End If
   
    Select Case Level
        Case 1: Floor = "B1"
        Case 2: Floor = "1"
        Case 3: Floor = "M"
        Case 4: Floor = "2"
        Case 5: Floor = "3"
        Case 6: Floor = "3A"
        Case 7: Floor = "5"
        Case 8: Floor = "6"
        Case 9: Floor = "7"
        Case 10: Floor = "8"
        Case 11: Floor = "9"
        Case 12: Floor = "10"
        Case 13: Floor = "11"
        Case 14: Floor = "12"
        Case 15: Floor = "13"
        Case 16: Floor = "14"
        Case 17: Floor = "15"
        Case 18: Floor = "16"
        Case 19: Floor = "17"
    End Select
    Serial = Chr(Level)
    lblLevel.Caption = Floor: MSComm1.Output = Serial
    txtProses.Text = "Sending Floor: " & Hex(Asc(Serial)) & "H"

End Sub

Demikian perangkat Sipervisory Monitoring Lift yang penulis buat dengan tampilan LED matriks. Ini sekedar contoh implementasi yang mungkin dapat dikembangkan lagi untuk fungsi dan kegunaan lainnya.



Sudah ya, terima kasih sudah membaca artikel ini. Semoga apa yang penulis sampaikan bermanfaat dan bisa diterapkan oleh sobat semua.

Salam....

Tidak ada komentar:

Posting Komentar