Kita lanjutkan
pemrograman perangkat pewaktu 8 saluran dengan membahas mengenai subrutin
interupsi.
Kita mulai dengan
subrutin interupsi pewaktu yang diawali dengan DlyA. Perintah pada subrutin
DlyA diawali dengan memeriksa status keluaran relay pada bit gerbang RlyA (port
0.7). Jika keluaran RlyA aktif maka perintah akan bercabang ke DlyB mengabaikan
perintah selanjutnya. Sebaliknya jika tidak aktif program akan memeriksa status
indikator LedA. Jika indikator tidak aktif atau padam maka program bercabang ke
DlyB namun jika aktif maka program pewaktu dijalankan dengan mencacah turun
register ATmr0 dan seterusnya.
Sebagai catatan
karena register TH0 memerlukan 225 siklus dengan frekuensi persiklus adalah
921.600 Hz maka pencacahan turun dari ATmr0 sampai ATmr1 memerlukan waktu 1
detik dengan perhitungan 225 x 128 x 32 = 921600, ditambah dengan ATmr2 yang
bernilai 60 maka pencacahan mundur dalam hitungan menit terhadap ATmr3 yang
berisi setingan pewaktu SeTmrA.
; Sub-rutin TIMER Interupt
DlyA: jnb RlyA,
DlyB
jb LedA,
DlyB
djnz ATmr0,
DlyB
mov ATmr0,
#128
djnz ATmr1,
DlyB
mov ATmr1,
#32
djnz ATmr2,
DlyB
mov ATmr2,
#60
djnz ATmr3,
DlyB
clr RlyA
Subrutin
DlyB dan seterusnya sampai DlyH adalah sama dengan DlyA untuk saluran pewaktu
lainnya.
DlyB: jnb RlyB,
DlyC
jb LedB,
DlyC
djnz BTmr0,
DlyC
mov BTmr0,
#128
djnz BTmr1,
DlyC
mov BTmr1,
#32
djnz BTmr2,
DlyC
mov BTmr2,
#60
djnz BTmr3,
DlyC
clr RlyB
DlyC: jnb RlyC,
DlyD
jb LedC,
DlyD
djnz CTmr0,
DlyD
mov CTmr0,
#128
djnz CTmr1,
DlyD
mov CTmr1,
#32
djnz CTmr2,
DlyD
mov CTmr2,
#60
djnz CTmr3,
DlyD
clr RlyC
DlyD: jnb RlyD,
DlyE
jb LedD,
DlyE
djnz DTmr0,
DlyE
mov DTmr0,
#128
djnz DTmr1,
DlyE
mov DTmr1,
#32
djnz DTmr2,
DlyE
mov DTmr2,
#60
djnz DTmr3,
DlyE
clr RlyD
DlyE: jnb RlyE,
DlyF
jb LedE,
DlyF
djnz ETmr0,
DlyF
mov ETmr0,
#128
djnz ETmr1,
DlyF
mov ETmr1,
#32
djnz ETmr2,
DlyF
mov ETmr2,
#60
djnz ETmr3,
DlyF
clr RlyE
DlyF: jnb RlyF,
DlyG
jb LedF,
DlyG
djnz FTmr0,
DlyG
mov FTmr0,
#128
djnz FTmr1,
DlyG
mov FTmr1,
#32
djnz FTmr2,
DlyG
mov FTmr2,
#60
djnz FTmr3,
DlyG
clr RlyF
DlyG: jnb RlyG,
DlyH
jb LedG,
DlyH
djnz GTmr0,
DlyH
mov GTmr0,
#128
djnz GTmr1,
DlyH
mov GTmr1,
#32
djnz GTmr2,
DlyH
mov GTmr2,
#60
djnz GTmr3,
DlyH
clr RlyG
DlyH: jnb RlyH,
DlyEnd
jb LedH,
DlyEnd
djnz HTmr0,
DlyEnd
mov HTmr0,
#128
djnz HTmr1,
DlyEnd
mov HTmr1,
#32
djnz HTmr2,
DlyEnd
mov HTmr2,
#60
djnz HTmr3,
DlyEnd
clr RlyH
Subrutin interupsi pewaktu diakhiri dengan program untuk
menghidup-matikan Buzzer dengan periode pulsa per setengah detik.
DlyEnd:
djnz r7,
DlyOut
mov r7,
#128
djnz r6,
DlyOut
mov r6,
#16
jb Buzzer,
BuzON
setb Buzzer
reti
BuzON:
clr Buzzer
DlyOut:
reti
Berikut kita akan membahas subrutin interupsi yang berkaitan
dengan komunikasi serial dengan PC. Subrutn Serial pertama-tama mereset bit
interupsi penerima RI kemudian memindahkan isi register serial SBUF ke register
gerbang PrtLED. Penggunaan PrtLED inilah menjadi sebab mengapa saat pewaktu
sedang aktif maka komunikasi serial dinon-aktifkan.
Setelah menyimpan register serial, program selanjutnya memeriksa
isi data yang diterima. Jika data tersebut adalah karakter “<“ maka program
akan menyiapkan register penunjuk R0 dengan alamat TmpSer yang merupakan buffer
serial. Namun jika bukan karakter tersebut maka akan bercabang ke subrutin
SerTes. Karakter “<“ diidentifikasikan sebagai START.
; Sub-rutin SERIAL Interupt
Serial:
push acc
jnb ri,
$
clr ri
clr ti
mov a,
sbuf
mov PrtLED,
a
cjne a,
#'<', SerTes
mov r0,
#TmpSer
ajmp SerEnd
Subrutin SerTes memeriksa data karakter “>“ atau
diidentifikasikan sebagai STOP. Jika benar maka program akan menjalankan
perintah untuk memproses data pada buffer yang diawali dengan alamat TmpSer
menggunakan register R0.
Data pertama pada TmpSer yang diperiksa adalah kode perintah.
Pemeriksaan dimulai dengan kode perintah “I” dan jika benar maka printah akan
melompat ke Subrutin KrmIn. Namun jika bukan maka akan bercabang ke TReg.
SerTes:
cjne a,
#'>', TReg
mov r0,
#TmpSer
mov a,
@r0
cjne a,
#'I', SerO
ajmp KrmIn
Program selanjutnya memeriksa kode “O” untuk melompat ke TrmOut.
Kode “T” untuk PCTes.
SerO: cjne a,
#'O', PCTmr
ajmp TrmOut
PCTmr:
cjne a,
#'T', PCTmrA
ajmp PCTes
Selanjutnya program akan memeriksa kode “A” sampai “H” untuk
menuju subrutin PCSet.
PCTmrA:
cjne a,
#'A', PCTmrB
mov r1,
#SeTmrA
ajmp PCSet
PCTmrB:
cjne a,
#'B', PCTmrC
mov r1,
#SeTmrB
ajmp PCSet
PCTmrC:
cjne a,
#'C', PCTmrD
mov r1,
#SeTmrC
ajmp PCSet
PCTmrD:
cjne a,
#'D', PCTmrE
mov r1,
#SeTmrD
ajmp PCSet
PCTmrE:
cjne a,
#'E', PCTmrF
mov r1,
#SeTmrE
ajmp PCSet
PCTmrF:
cjne a,
#'F', PCTmrG
mov r1,
#SeTmrF
ajmp PCSet
PCTmrG:
cjne a,
#'G', PCTmrH
mov r1,
#SeTmrG
ajmp PCSet
PCTmrH:
cjne a,
#'H', SerEnd
mov r1,
#SeTmrH
ajmp PCSet
Subrutin TReg berfungsi memeriksa apakan nilai register R0
kosong atau tidak. Jika kosong maka subrutin serial akan keluar namun jika
tidak program akan dilanjutkan dengan bercabang ke XReg yang memeriksa apakah
register R0 sudah berisi 9 lokasi dari alamat awal TmpSer atau berarti sudah
berisi 8 byte data. Jika belum maka akan melanjutkan program pada subrutin
RegIn untuk menyimpan data serial yang diterima.
TReg: cjne r0,
#0, XReg
ajmp SerEnd
XReg: cjne r0,
#TmpSer+9, RegIn
mov r0,
#0
ajmp SerEnd
RegIn:
mov @r0,
a
inc r0
SerEnd:
pop acc
reti
Subrutin di bawah ini adalah pelaksanaan kode perintah “I” dari
PC untuk mengirimkan status masukan dengan format seperti berikut ini:
; Mengirim Status ZONE Input ke PC
; Format OUT:
; <Sxxxxxxxx>
Subrutin KrmIn diawali dengan mengirim karakter “<”
dilanjutkan dengan “S”. Kemudian dengan mengirim status data ke delapan gerbang
masukan PrtIn. Logika rendah direpresentasikan dengan karakter angka “0” dan
logika tinggi dengan “1”.
KrmIn:
clr ea
mov b,
#'<'
acall Kirim
mov b,
#'S'
acall Kirim
mov r7,
#8
mov a,
PrtIn
clr cy
Krm0: rrc a
jb cy,
Krm1
mov b,
#'0'
ajmp KrmBit
Krm1: mov b,
#'1'
KrmBit:
acall Kirim
djnz r7,
Krm0
Pengiriman dara serial ke PC mengenai status gerbang masukan
diakhiri dengan mengirim karekater “>” seperti berikut ini:
KrmEnd:
mov b,
#'>'
acall Kirim
setb ea
mov r0,
#0
ajmp SerEnd
Kirim:
mov PrtLED,
b
mov sbuf,
b
jnb ti,
$
clr ti
clr ri
ret
Subrutin berikut adalah program yang melakukan proses terhadap
perintah kode karakter “O” dari PC yaitu untuk mengoperasikan relay keluaran.
; Menerima Output RELAY dari PC
TrmOut:
clr ea
mov r7,
#8
mov b,
#0
Trm0: inc r0
mov a,
@r0
cjne a,
#'0', Trm1
clr cy
mov a,
b
rlc a
ajmp TrmBit
Trm1: setb cy
mov a,
b
rlc a
TrmBit:
mov b,
a
djnz r7,
Trm0
mov PrtOut,
a
setb ea
mov r0,
#0
ajmp SerEnd
Subrutin PCTes adalah proses dari perintah dengan kode “T” untuk
mengirim setingan pewaktu dari perangkat. Setingan dikirim dalam format
bilangan desimal sehingga untuk tujuan tersebut menggunakan subrutin konversi
bilangan dari heksadesimal ke desimal.
; Mengirim Timer ke PC
; Format OUT=
; <Txxx;xxx;xxx;xxx;xxx;xxx;xxx;xxx>
PCTes:
clr ea
mov b,
#'<'
acall Kirim
mov b,
#'T'
acall Kirim
mov r0,
#SeTmrA
mov r3,
#8
KrmPC:
mov
r1, #TmpSer
mov
r2, #3
ClReg:
mov
@r1, #0
inc
r1
djnz
r2, ClReg
acall HexDes
acall Angka
inc r0
mov r1,
#TmpSer
mov r2,
#3
KrmPCn:
mov a,
@r1
inc r1
mov b,
a
acall Kirim
djnz r2,
KrmPCn
mov a,
#';'
mov b,
a
acall Kirim
djnz r3,
KrmPC
Lewat:
ajmp KrmEnd
Subrutin PCSet adalah proses menyimpan data pewaktu yang dikirim
oleh PC ke masing-masing register pewaktu yang terdapat pada EEPROM. Lokasi
memori pewaktu disesuaikan dengan kode perintah yang direpresentasikan dengan
karakter dari “A” sampai dengan “H”. Karena data yang berasal dari PC adalah
desimal maka diperlukan subrutin konversi bilangan dari desimal ke
heksadesimal.
; Menyimpan Timer dari PC
PCSet:
clr ea
push 01h
mov r3,
#3
mov r0,
#TmpSer+1
PCSet1:
mov a,
@r0
anl a,
#0fh
mov @r0,
a
inc r0
djnz r3,
PCSet1
mov r3,
#3
PCSet2:
mov @r0,
#0
inc r0
djnz r3,
PCSet2
acall DesHex
pop 01h
mov @r1,
a
push 07h
acall EWEN
acall ERALL
mov r7,
#8
mov r0,
#SeTmrA
mov dpl,
#0
mov dph,
#0
Sinkr:
mov a,
@r0
acall WRByte
inc r0
inc dpl
djnz r7,
Sinkr
pop 07h
acall EWDS
setb ea
mov r0,
#0
ajmp SerEnd
Berikut adalah subrutin pendukung dari subrutin serial yang
digunakan untuk mengubah byte yang dikirim ke PC dalam format karakter angka
sesuai kode ASCII.
Angka:
mov r1,
#TmpSer
mov r2,
#3
Ascii:
mov a,
@r1
orl a,
#30h
mov @r1,
a
inc r1
djnz r2,
Ascii
ret
Khusus untuk sub rutin interupsi serial ada beberapa hal yang patut
dicatat antara lain:
- Data
serial selalu diawali dengan karakter “<” sebagai kondisi START dan
diakhiri dengan “>” sebagai kondisi STOP.
- Setelah
Start, data serial selalu diikuti oleh sebuah karakter kode baik yang
berasal dari PC sebagai permintaan maupun jawaban atau respon dari
perangkat. Setelah itu baru dilanjutkan dengan data informasi. Sehingga
format data adalah: < [kode] [data] >
- Untuk
karakter kode yang berasal dari PC dan membutuhkan respon dari perangkat
antara lain:
§ I untuk permintaan INPUT
dengan format: <I>
§ S adalah respon STATUS dari
perangkat atas permintaan INPUT di atas dengan format <S[8 byte zone]> di
mana ke delapan byte zone berupa karakter 0 untuk terpicu dan 1 untuk normal yang
dimulai dari Zone 1 sampai 8.
§ T untuk permintaan TIMER
dari PC dengan format: <T>
§ T respon dari perangkat
dengan format: <Taaa;bbb;ccc;ddd;eee;fff;ggg;hhh> di mana data aaa sampai
hhh adalah data pewaktu dalam desimal antara 000 sampai 255.
- Untuk
karakter kode yang dari PC yang merupakan perintah tanpa membutuhkan
respon antara lain:
§ O untuk permintaan OUTPUT
dengan format: <O[8 byte data keluaran]> di mana ke delapan byte keluaran
berupa karakter 0 untuk ON dan 1 untuk OFF yang dimulai dari keluaran 1 sampai
8.
§ A untuk seting pewaktu A
dengan format <Aaaa> di mana karakter aaa adalah data desimal dari
pewaktu antara 000 sampai 255. Hal ini juga berlaku untuk ketujuh pewaktu
lainnya yaitu kode B sampai dengan H.
Demikian subrutin interupsi baik pewaktu maupun serial. Program kita belum selesai masih membutuhkan beberapa subrutin lagi.
Subrutin selanjutnya akan dibahas pada bagian ke-empat. Sampai
ketemu lagi...
Udah ya, makasih
udah baca postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan
oleh sobat semua.
Salam....
Tidak ada komentar:
Posting Komentar