Translate

Pewaktu 8 Saluran Dengan AT89C51, Bagian Kedua: Parameter dan Rutin Aplikasi



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