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