Pada postingan
sebelumnya, kita sudah membahas desain rangkaian dari perangkat pewaktu 8
saluran. Pada bagian kedua ini kita akan membahas mengenai aplikasi program
yang diperlukan untuk AT89C51 agar dapat berfungsi.
Kita mulai dengan
bagian program di mana parameter dari register dan gerbang yang digunakan
ditetapkan.
;Aplikasi 8 Chanel Delay dalam satuan menit
$mod51
Berikut adalah register-register yang digunakan pada aplikasi.
ATmr0 equ 08h
ATmr1 equ 09h
ATmr2 equ 0ah
ATmr3 equ 0bh
BTmr0 equ 0ch
BTmr1 equ 0dh
BTmr2 equ 0eh
BTmr3 equ 0fh
CTmr0 equ 10h
CTmr1 equ 11h
CTmr2 equ 12h
CTmr3 equ 13h
DTmr0 equ 14h
DTmr1 equ 15h
DTmr2 equ 16h
DTmr3 equ 17h
ETmr0 equ 18h
ETmr1 equ 19h
ETmr2 equ 1ah
ETmr3 equ 1bh
FTmr0 equ 1ch
FTmr1 equ 1dh
FTmr2 equ 1eh
FTmr3 equ 1fh
GTmr0 equ 20h
GTmr1 equ 21h
GTmr2 equ 22h
GTmr3 equ 23h
HTmr0 equ 24h
HTmr1 equ 25h
HTmr2 equ 26h
HTmr3 equ 27h
SeTmrA equ 28h
SeTmrB equ 29h
SeTmrC equ 2ah
SeTmrD equ 2bh
SeTmrE equ 2ch
SeTmrF equ 2dh
SeTmrG equ 2eh
SeTmrH equ 2fh
TmpSer equ 30h
RStack equ 40h
Berikut adalah penetapan dari gerbang yang digunakan.
PrtOut equ p0
RlyA bit p0.7
RlyB bit p0.6
RlyC bit p0.5
RlyD bit p0.4
RlyE bit p0.3
RlyF bit p0.2
RlyG bit p0.1
RlyH bit p0.0
PrtIn equ p1
ZnA bit p1.0
ZnB bit p1.1
ZnC bit p1.2
ZnD bit p1.3
ZnE bit p1.4
ZnF bit p1.5
ZnG bit p1.6
ZnH bit p1.7
PrtLED equ p2
LedA bit p2.0
LedB bit p2.1
LedC bit p2.2
LedD bit p2.3
LedE bit p2.4
LedF bit p2.5
LedG bit p2.6
LedH bit p2.7
Fail bit p3.3
Buzzer bit p3.4
Csel bit p3.5
CLK bit p3.6
DiDo bit p3.7
Selanjutnya kita
menetapkan alamat awal program yang diisi dengan perintah melompat menuju rutin
Mulai. Kemudian alamat interupsi timer 1 pada 0BH yang juga melompat ke
subrutin interupsi DlyA. Demikian pula dengan subrutin interupsi serial pada
alamat 23H juga melompat ke subrutin Serial.
org 0h
ajmp Mulai
org 0Bh
ljmp DlyA
org 23h
ljmp Serial
Rutin aplikasi pewaktu dimulai berikut ini. Perintah pada rutin
Mulai menetapkan isi register SP (stack pointer), mereset masukan dan keluaran
semua gerbang.
; Rutin Aplikasi
dimulai di sini
Mulai:
mov sp, #RStack-1
mov P0, #255
mov P1, #255
mov P2, #255
mov P3, #255
Selanjutnya kita akan menginisialisasi setingan pewaktu yang
tersimpan pada EEPROM untuk diisikan pada register yang bersesuaian dengan
fungsinya. Sebanyak 8 byte isi EEPROM dipindahkan ke register SeTmrA sampai
dengan SeTmrH menggunakan perintah looping DJNZ dan register penunjuk R0.
mov r7, #8
mov dph, #0
mov dpl, #0
mov r0, #SeTmrA
acall Reset
IniEE:
acall RDByte
mov @r0, a
inc r0
inc dpl
djnz r7, IniEE
Masih berkaitan dengan inisialisasi awal, berikutnya adalah
menyiapkan perangkat untuk komunikasi serial. Kecepatan ditetapkan pada 9600
bps. Inisialisasi serial ini mengaktifkan timer 1 yang digunakan sebagai
pencacah serial sementara timer 0 dinon-aktifkan.
; Inisialiasasi
Komunikasi SERIAL
IniSer:
mov pcon, #0
mov scon, #50h
mov tmod, #20h
mov ie, #90h
mov tl1, #0fdh
mov th1, #0fdh
mov r0, #0
mov PrtOut, #255
mov PrtLED, #255
setb Buzzer
setb tr1
clr tr0
Rutin IniTes dijalankan untuk memeriksa status dari LED indikator
timer. Jika ada salah satu atau lebih indikator yang aktif maka program akan
melakukan pencabangan ke rutin LupSer, sebaliknya jika seluruh indikator padam
program akan melanjutkan pada baris alamat berikutnya yaitu rutin LupIni.
IniTes:
mov a, PrtLED
cpl a
jnz LupSer
Rutin LupIni adalah program yang digunakan untuk memeriksa
setiap masukan Zona. Jika tidak ada masukan yang terpicu maka program akan
bercabang kembali ke rutin IniTes, namun jika ada masukan yang terpicu program
akan bercabang ke rutin IniTmr.
LupIni:
mov a, PrtIn
cpl a
jz IniTes
ajmp IniTmr
Berikut adalah rutin LupSer yang berfungsi memeriksa status
indikator. Aplikasi pewaktu harus memastikan bahwa kondisi indikator tidak ada
yang terhubung singkat karena bit gerbang indikator digunakan sebagai penunjuk
timer. Jika ada jalur dari indikator yang terhubung singkat maka aplikasi akan
terus bercabang ke LupSer yang terdapat pada rutin Konek. Jika indikator aman
maka program memberikan tundaan kurang lebih 2 detik.
LupSer:
mov r7, #225
mov r6, #128
mov r5, #64
mov PrtLED, #255
Konek:
mov a, PrtLED
cpl a
jnz LupSer
djnz r7, Konek
mov r7, #225
djnz r6, Konek
mov r6, #128
djnz r5, Konek
ajmp LupIni
Rutin di bawah ini adalah inisialisasi untuk pewaktu sebagai
akibat adanya salah satu masukan yang terpicu. Inisialisasi Timer juga berisi
perintah untuk mematikan fasilitas serial. Jadi selama pewaktu bekerja,
komunikasi serial dengan PC akan diblokir agar tidak mengganggu kinerja sistem
pewaktu yang akan dijalankan.
IniTmr:
mov r7, #128
mov r6, #16
mov pcon, #0
mov scon, #0
mov tcon, #0
mov th0, #255-225
mov tl0, #255-225
mov tmod, #02h
mov ie, #8ah
mov PrtOut, #255
mov PrtLED, #255
setb tr0
clr tr1
Setelah melaksanakan inisialisasi maka selanjutnya memeriksa
status masukan dari PrtIn (port 1). Pemeriksa bit mana yang terpicu dimulai
dari ZoneA.
Timer:
mov a, PrtIn
cpl a
jnz ZoneA
ajmp Iniser
Rutin ZoneA memeriksa status bit gerbang masukan ZnA (port 1.0).
Jika masukan ZnA atau Zone 1 ternyata normal program akan bercabang ke HiZnA
namun jika terpicu program melanjutkan perintah pada alamat berikutnya yang
memeriksa status LedA yaitu indikator Zone 1. Jika ternyata indikator sudah
menyala maka program bercabang ke ZoneB untuk memeriksa masukan berikutnya pada
Zone 2, namun jika indikator masih padam menandakan baru terpicu dan belum
mengaktifkan pewaktu pewaktu zone 1. Perintah selanjutnya adalah menyalakan
indikator dan menyiapkan register untuk memulai pencacahan mundur. Sebelum
prosedur penetapan register pewaktu program terlebih dahulu memeriksa register
SeTmrA jika berisi 0 maka dianggap pewaktu untuk Zone 1 tidak ada dan akan
langsung bercabang ke DirA.
ZoneA:
jb ZnA, HiZnA
jnb LedA, ZoneB
clr LedA
mov a, SeTmrA
jz DirA
mov ATmr0, #128
mov ATmr1, #32
mov ATmr2, #60
mov ATmr3, SeTmrA
ajmp ZoneB
Dua rutin berikut adalah sebagai hasil dari pemeriksaan status
masukan dan pewaktu. Rutin DirA digunakan untuk menggerakkan relay sebagai
hasil pewaktu tercapai. Sementara rutin HiZnA sebaliknya untuk mematikan relay
keluaran.
DirA: clr RlyA
ajmp ZoneB
HiZnA:
setb RlyA
setb LedA
Rutin selanjutnya dari ZoneB sampai dengan ZoneH berfungsi sama
dengan ZoneA namun untuk ketujuh saluran pewaktu lainnya.
ZoneB:
jb ZnB, HiZnB
jnb LedB, ZoneC
clr LedB
mov a, SeTmrB
jz DirB
mov BTmr0, #128
mov BTmr1, #32
mov BTmr2, #60
mov BTmr3, SeTmrB
ajmp ZoneC
DirB: clr RlyB
ajmp ZoneC
HiZnB:
setb RlyB
setb LedB
ZoneC:
jb ZnC, HiZnC
jnb LedC, ZoneD
clr LedC
mov a, SeTmrC
jz DirC
mov CTmr0, #128
mov CTmr1, #32
mov CTmr2, #60
mov CTmr3, SeTmrC
ajmp ZoneD
DirC: clr RlyC
ajmp ZoneD
HiZnC:
setb RlyC
setb LedC
ZoneD:
jb ZnD, HiZnD
jnb LedD, ZoneE
clr LedD
mov a, SeTmrD
jz DirD
mov DTmr0, #128
mov DTmr1, #32
mov DTmr2, #60
mov DTmr3, SeTmrD
ajmp ZoneE
DirD: clr RlyD
ajmp ZoneE
HiZnD:
setb RlyD
setb LedD
ZoneE:
jb ZnE, HiZnE
jnb LedE, ZoneF
clr LedE
mov a, SeTmrE
jz DirE
mov ETmr0, #128
mov ETmr1, #32
mov ETmr2, #60
mov ETmr3, SeTmrE
ajmp ZoneF
DirE: clr RlyE
ajmp ZoneF
HiZnE:
setb RlyE
setb LedE
ZoneF:
jb ZnF, HiZnF
jnb LedF, ZoneG
clr LedF
mov a, SeTmrF
jz DirF
mov FTmr0, #128
mov FTmr1, #32
mov FTmr2, #60
mov FTmr3, SeTmrF
ajmp ZoneG
DirF: clr RlyF
ajmp ZoneG
HiZnF:
setb RlyF
setb LedF
ZoneG:
jb ZnG, HiZnG
jnb LedG, ZoneH
clr LedG
mov a, SeTmrG
jz DirG
mov GTmr0, #128
mov GTmr1, #32
mov GTmr2, #60
mov GTmr3, SeTmrG
ajmp ZoneH
DirG: clr RlyG
ajmp ZoneH
HiZnG:
setb RlyG
setb LedG
ZoneH:
jb ZnH, HiZnH
jnb LedH, ZonEnd
clr LedH
mov a, SeTmrH
jz DirH
mov HTmr0, #128
mov HTmr1, #32
mov HTmr2, #60
mov HTmr3, SeTmrH
ajmp ZonEnd
DirH: clr RlyH
ajmp ZonEnd
HiZnH:
setb RlyH
setb LedH
ZonEnd:
ajmp Timer
Sampai disini rutin pewaktu selesai. Namun masih ada beberapa subrutin
yang harus dijalankan oleh program yaitu subrutin interupsi timer0 dan
interupsi serial. Termasuk juga subrutin lainnya yang berkaitan dengan program
seperti subrutin antarmuka dengan EEPROM AT93C46 dan konversi bilangan yang
diperlukan saat berkomunikasi dengan PC secara serial.
Subrutin selanjutnya akan dibahas pada bagian ketiga. 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