Translate

Pewaktu 8 Saluran Dengan AT89C51, Bagian Ketiga: Subrutin Interupsi Timer Dan Serial



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:

  1. Data serial selalu diawali dengan karakter “<” sebagai kondisi START dan diakhiri dengan “>” sebagai kondisi STOP.
  2. 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] >
  3. 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.
  1. 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