Translate

Sehidup Semati Dalam Lima Menit



Kalau ingat kenapa alat ini dibuat, aku kadang sempat nyengir. Karena waktu itu aku tinggal di apartemen dan menjadi kontraktor. Keren ya. Maksudnya apartemen yang menyamping alias rumah petak yang aku kontrak. He he he.

Umumnya tinggal di apartemen petak seperti itu ada sedikit masalah, terutama aku yang sering kegerahan bahkan ketika tidur bisa mandi keringat. Solusi satu-satunya adalah dengan memasang kipas angin. Ternyata masalah tidak sampai disitu. Masalah gerah sudah teratasi, namun paginya ternyata justru kebanyakan angin alias kembung masuk angin. Solusi satu-duanya terpaksa bangun untuk mematikan kipas angin saat sudah mulai terasa dingin dan menghidupkannya lagi jika mulai semakin gerah. Masalah belum selesai karena muncul pertanyaan, kapan tidur nyenyaknya?

Untungnya apartemenku cukup lengkap ada PC dengan CPU lengkap serta mouse, keyboard, monitor dan printer. Memangnya ada yang tidak lengkap? Ada, di rumah ortu hanya ada monitor dan CPU saja itupun tidak ada hard-disknya. Di apartemen juga ada Atmel Programmer dan Kit Modul LCNS. PCB bolong-bolong, relay dan komponen transistor serta resistor bahkan ternyata sudah pernah aku buat. Solder, timah dan penyedot timah juga ada untuk jaga-jaga. Kabel rol listrik sudah siap. Kabel-kabel bahkan ternyata konektor juga sudah menunggu dipakai. Adaptor 12 volt juga seperti perangko selalu nempel pada LCNS. Sepertinya bisa.

Pertama jelas aku ambil penggerak relay dengan transistor C9012 dan C9013 di dalamnya. Lalu aku hubungkan masukannya ke gerbang Port1.7 dari AT89C2051 pada modul kit LCNS. Kabel lainnya seperti untuk catu DC juga sudah dihubungkan. Tinggal menghubungkan keluaran kontak relay ke outlet listrik. Terpaksa aku korban dengan mengubah salah satu kabel ekstension listrik yang ada.

Semua sudah siap tinggal pada kit LCNS ternyata soket IC 20 penanya masih kosong dan menunggu dipasangi AT89C2051. Tapi untuk itu harus diprogram terlebih dahulu. Maka aku tulis program dan setelah berhasil dikompilasi hasilnya seperti di bawah ini:

ON5OFF5                                                                      PAGE 1

                       1    $mod51
                       2   
0000                   3    org     0
0000 C297              4            clr     p1.7
0002 4100              5            ajmp    BolakBalik
                       6   
0200                   7    org     200h
0200                   8    BolakBalik:
0200 B297              9            cpl     p1.7
0202 7F3C             10            mov     r7, #9
0204 7E80             11    BB1:    mov     r6, #245
0206 7DA0             12    BB2:    mov     r5, #250
0208 7CE1             13    BB3:    mov     r4, #250
020A DCFE             14            djnz    r4, $
020C DDFA             15            djnz    r5, BB3
020E DEF6             16            djnz    r6, BB2
0210 DFF2             17            djnz    r7, BB1
0212 4100             18            ajmp    BolakBalik
                      19   
                      20    end

VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND

ON5OFF5                                                                      PAGE 2

BB1. . . . . . . . . . . . . . .  C ADDR  0204H 
BB2. . . . . . . . . . . . . . .  C ADDR  0206H 
BB3. . . . . . . . . . . . . . .  C ADDR  0208H 
BOLAKBALIK . . . . . . . . . . .  C ADDR  0200H 
P1 . . . . . . . . . . . . . . .  D ADDR  0090H  PREDEFINED

Hasilnya tentu saja tidak 100% akurat dalam hitungan menit masih sekitar 5 menit 9 detik dengan kristal 11.059.200 Hz.




Udah ya, makasih udah baca postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan oleh sobat semua.

Salam....


Pewaktu 8 Saluran Dengan AT89C51, Bagian Kelima: Aplikasi Baca/Tulis Timer Dengan Visual Basic



Pada bagian ini kita akan membahas aplikasi yang dibuat menggunakan Visual Basic yang digunakan untuk mengelola atau mengatur perangkat pewaktu 8 zone masukan yang dibuat. Aplikasi yang akan disampaikan diutamakan untuk membaca dan mengirim data pewaktu yang diperlukan.

Jika Sobat mengikuti semua langkah yang akan dipaparkan maka akan menghasilkan tampilan jendela aplikasi seperti di bawah ini:



Untuk menghasilkan seperti di atas ikuti langkah-langkah berikut:

Bukalah aplikasi Visual Basic dan mari kita mulai pembuatan programnya. Hal pertama pada tampilan View Object, kita akan mulai mendesain tampilan dan obyek apa saja yang diperlukan. Oh iya, kita nama proyek yang dibuat dengan prjDelay8Zone.

Buatlah sebuah forms dengan nama frmDlyUtama. Property BorderStyle dipilih 1 – Fixed Single dengan ControlBox dipilih False. Pada Property Caption isilah “Aplikasi 8 Channel Delay”. Terkhir adalah menentukan StartUpPosition pada 2 – CenterScreen.

Agar tampilan jendela aplikasi kita terlihat lebih manis, kita perlu menambahkan Menu Bar. Pada keyboard tekan Ctrl+E untuk menampilkan Menu Editor. Mulailah membuat obyek yang diperlukan.



Pada Menu Editor buatlan menu dengan nama mnuTools dengan Caption “&Tools” dan mnuHelp dengan Caption “&Help”. Di bawah mnuTools akan kita buat beberapa sub-menu antara lain mnuBaca dengan Property Caption “&Retrieve” dan buatlah sebuah Shortcut “Ctrl+R”, kemudian mnuKirim dengan Caption “&Send data” dan Shortcut “Ctrl+S”, terakhir mnuKeluar dengan Caption “&Exit”. Pada mnuHelp hanya sebuah sub-menu yaitu mnuAbout dengan Caption “&About” dan Shortcut “Ctrl+A”. Nah bagian Menu Bar sudah selesai.

Forms yang kita buat akan diisi dengan beberapa obyek. Satu per satu akan dilengkapi hingga memperoleh seperti tampilan pada gambar awal tulisan ini.

Buatlan frame dengan fraTimer. Isilah Property Caption dengan “Timer Settings”. Pada fraTimer akan diisi dengan beberapa label bernama lblTimer yang dibuat secara array sebanyak 8 buah. Ubahlan Property Caption masing-masing dengan lblTimer(0) dengan “Timer 1”, lblTimer(1) dengan “Timer 2” dan seterusnya sampai lblTimer(7) dengan “Timer 8”. Kemudian masih label yang lain adalah lblMenit yang juga array sebanyak delapan dengan Property Caption sama yaitu “minutes” untuk lblMenit(0) sampai lblMenit(7). Yang lainnya dalam fraTimer adalah membuat beberapa TextBox, juga secara array yaitu txtTimer(0) sampai txtTimer(7). Pilihlah Property Alignment 1- Right Justify. Tetapkan MaxLength sebanyak 3 dan kosongkan isi Property Text.

Berikutnya tambahkan sebuah frame dengan nama fraReport dengan Property Caption dikosongkan. Di dalam fraReport kita akan menambahkan 2 buah label masing-masing dengan nama lblUnit dengan Caption “Disconnect” dan lblReport dengan Caption “Preparing connection to device” sebagai Property Caption Awal yang nanti semua akan diubah pada program Code. Kita juga menambahkan sebuah obyek Shape dengan nama shpTimer dengan Property Shape 0 – Rectangle.

Setelah kita membuat 2 buah Frame, pada obyek Forms kita akan ditambahkan 3 buah CommandButton, yaitu bernama cmdBaca dengan Caption “RETRIEVE”, cmdKirim dengan Caption “SEND” dan cmdKeluar dengan Caption “EXIT”.

Nah, semua obyek sudah kita lengkapi. Sekarang kita akan menambahkan beberapa komponen yang diperlukan. Dari ToolBox General kita akan menambahkan 2 buah komponen Timer yaitu bernama Timer 1 dengan Interval 250 dalam satuan mili detik dan Timer 2 dengan Interval 100 ms.

Agar aplikasi kita dapat menjalankan perintah komunikai serial melalui gerbang RS-232 maka kita harus menambahkan komponen MSComm. Biasanya pada Tabulasi ToolBox General komponen ini belum ada. Untuk itu ada beberapa cara untuk menampilkan Kotak dialog Components. Klik kanan mouse pada ToolBox General lalu pilih Components. Cara lainnya adalah melalui Menu Bar dengan memilih Project lalu pilih Components. Atau dengan keyboard kita bisa menekan Ctrl+T. Terserah Sobat mau pilih yang mana. Yang penting akan tampil kotak dialog seperti berikut:



Pada kotak dialog Components cari dan pilihlah Microsoft Comm Control 6.0 lalu Apply.

Pada ToolBox sekarang sudah ada ikon bergambar telepon. Masukkan ikon komponen tersebut pada form kita dengan nama MSComm1. Ubahlah Property Rthreshold dengan nilai 1.

Langkah berikutnya adalah membuat beberapa modul yang berisi pernyataan yang akan dijalankan oleh aplikasi. Pada View Code, kita lanjutkan pekerjaan membuat aplikasi.

Pertama menentukan beberapa variabel yang dibutuhkan pada aplikasi yaitu variabel Status, Scan, Buffer dan Timer yang berjenis string. Sobat bisa menggunakan pernyataan As String tapi aku lebih suka dengan tanda $. Kemudian variabel lainnya adalah Integer dengan nama Nomor dan Port.

Option Explicit

Dim Status$, Scan$, Buffer$, Nomor%, Port%, Timer$(7)

Berikut adalah modul dan pertanyaan untuk CommandButton. Pada Sub cmdBaca diawali dengan penjebakan kesalahan On Error. Perintah utamanya adalah menon-aktifkan Timer2 dan mengosongkan Buffer. Yang terpenting dari cmdBaca adalah mengirim informasi serial dengan data “<T>”.

Private Sub cmdBaca_Click()
    On Error Resume Next
    lblReport.Caption = "Request data from device": Timer2.Enabled = False: Buffer = "": MSComm1.Output = "<T>"
End Sub

Pada Sub cmdKeluar, aku sedikit show-up dengan menampilkan mnuAbout_Click sebelum menututp gerbang serial dan keluar.

Private Sub cmdKeluar_Click()
    mnuAbout_Click
    If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
    End
End Sub

Pada Sub cmdKirim dimulai dengan mengisi variabel Timer$(0) sampai Timer$(7) dengan isi dari txtTimer(0).Text sampai txtTimer(7). Isi variabel timer harus berupa 3 buah karakter angka jika kurang maka akan ditambahkan dengan “0” termasuk jika isi txtTimer ternyata kosong. Pernyataan selanjutnya adalah mengisi variabel Nomor dengan 0 dan mengaktifkan Timer1 serta menon-aktifkan Timer2.

Private Sub cmdKirim_Click()
    For Nomor = 0 To 7 Step 1
        Timer(Nomor) = Right(("000" & val(txtTimer(Nomor).Text)), 3)
    Next Nomor
    Nomor = 0: lblReport.Caption = "Request to send": Timer1.Enabled = True: Timer2.Enabled = False
End Sub

Inilah modul yang pertama akan dilaksanakan saat aplikasi dijalankan. Ini akan menon-aktifkan hampir semua obyek kecuali cmdKeluar dan fraReport.

Private Sub Form_Load()
    On Error Resume Next
    Scan = "OK": fraTimer.Enabled = False: Port = 1
    cmdBaca.Enabled = False: cmdKirim.Enabled = False
    mnuBaca.Enabled = False: mnuKirim.Enabled = False
    For Nomor = 0 To 7 Step 1
        txtTimer(Nomor).Enabled = False: lblTimer(Nomor).Enabled = False
        lblMenit(Nomor).Enabled = False
    Next Nomor
End Sub

Di bawah adalah Sub mnuAbout yang berfungsi menampilkan keterangan tentang aplikasi dan pembuatnya dengan MessageBox.

Private Sub mnuAbout_Click()
    MsgBox "Remote 8 Channels Delay Trigger Software, Ver. 0.1" & vbCrLf & _
        "Create by Sigit Widodo" & vbCrLf & _
        "Powered by ARSYTEC" & vbCrLf & vbCrLf & _
        "Thank 's for use our product.", , "About Me"
End Sub

Menu-menu selanjutnya hanya akan menjalankan perintah dari modul CommandButton. Ketiga menu tersebut adalah seperti berikut ini:

Private Sub mnuKeluar_Click()
    cmdKeluar_Click
End Sub

Private Sub mnuKirim_Click()
    cmdKirim_Click
End Sub

Private Sub mnuBaca_Click()
    cmdBaca_Click
End Sub

Sub MSComm1_OnComm adalah semacam jebakan yang akan dijalankan bilamana adanya data yang diterima melalui gerbang serial. Seluruh data akan ditampung pada Buffer dan baru akan diproses setelah menjumpai karakter “>”. Karakter kode pertama dari perangkat yang diperiksa adalah “T” untuk isi dari Timer perangkat dan disimpan pada variabel Timer. Kode lainnya adalah “S” namun hanya akan digunakan untuk menentukan isi variabel Status dengan “OK”. Sub ini juga membatasi data serial yang masuk sampai dengan 35 byte pada Buffer.

Private Sub MSComm1_OnComm()
    On Error Resume Next
    Buffer = Buffer & MSComm1.Input
    If Right(Buffer, 1) = ">" Then
        If Mid(Buffer, 2, 1) = "T" Then
            Timer(0) = Mid(Buffer, 3, 3): Timer(1) = Mid(Buffer, 7, 3): Timer(2) = Mid(Buffer, 11, 3)
            Timer(3) = Mid(Buffer, 15, 3): Timer(4) = Mid(Buffer, 19, 3): Timer(5) = Mid(Buffer, 23, 3)
            Timer(6) = Mid(Buffer, 27, 3): Timer(7) = Mid(Buffer, 31, 3)
            For Nomor = 0 To 7 Step 1
                txtTimer(Nomor).Text = Val(Timer(Nomor))
            Next Nomor
            Buffer = "": lblReport.Caption = "Received data complete": Timer2.Enabled = True
        ElseIf Mid(Buffer, 2, 1) = "S" Then
            Status = "OK"
        End If
    Else
        If Len(Buffer) > 35 Then Buffer = ""
    End If
End Sub

Sub Timer1 adalah modul untuk mengirimkan data pewaktu ke perangkat dimulai dari pewaktu A sampai dengan H. Setelah selesai Sub ini akan menon-aktifkan dirinya sendiri dan menjalankan Timer2.

Private Sub Timer1_Timer()
    On Error Resume Next
    lblReport.Caption = "Sending to Timer " & Nomor + 1 & " with value " & Val(Timer(Nomor))
    Select Case Nomor
        Case 0: MSComm1.Output = "<A" & Timer(Nomor) & ">": Nomor = Nomor + 1
        Case 1: MSComm1.Output = "<B" & Timer(Nomor) & ">": Nomor = Nomor + 1
        Case 2: MSComm1.Output = "<C" & Timer(Nomor) & ">": Nomor = Nomor + 1
        Case 3: MSComm1.Output = "<D" & Timer(Nomor) & ">": Nomor = Nomor + 1
        Case 4: MSComm1.Output = "<E" & Timer(Nomor) & ">": Nomor = Nomor + 1
        Case 5: MSComm1.Output = "<F" & Timer(Nomor) & ">": Nomor = Nomor + 1
        Case 6: MSComm1.Output = "<G" & Timer(Nomor) & ">": Nomor = Nomor + 1
        Case 7: MSComm1.Output = "<H" & Timer(Nomor) & ">": Nomor = Nomor + 1
        Case 8: lblReport.Caption = "Download data completed": Timer1.Enabled = False: Timer2.Enabled = True
    End Select
End Sub

Sub Timer2 diperlukan untuk mendeteksi keberadaan perangkat dengan melakukan penyisiran atau scan pada COM1 sampai COM10. Tadinya aku sempat buat hingga 99 karena menggunakan konverter USB ke RS-232 dan mendapat jatah COM55. Meski bisa diubah menjadi COM4 tapi setiap kali baru dikonfigurasi secara otomatis oleh PC selalu kembali ke COM55. Pada saat scan Timer2 menggunakan Interval 500ms. Setelah perangkat diketemukan maka Timer2 akan melakukan penyegaran dengan Interval 5s. Baik scan atau penyegaran dengan mengirim data “<I>” ke perangkat.

Private Sub Timer2_Timer()
    On Error Resume Next
    If Status = "OK" Then
        If Scan = "OK" Then
            Scan = "": fraTimer.Enabled = True
            lblUnit.Caption = "Connected": shpTimer.FillColor = vbGreen
            lblReport.Caption = "Found device on COM" & Port - 1: Timer2.Interval = 5000
            cmdBaca.Enabled = True: cmdKirim.Enabled = True
            mnuBaca.Enabled = True: mnuKirim.Enabled = True
            For Nomor = 0 To 7 Step 1
                txtTimer(Nomor).Enabled = True: lblTimer(Nomor).Enabled = True: lblMenit(Nomor).Enabled = True
                Next Nomor
        End If
    Else
        If Scan = "" Then Form_Load
        If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
        If Port > 10 Then Port = 1
        Timer2.Interval = 500
        lblUnit.Caption = "Disconnect": shpTimer.FillColor = vbRed
        lblReport.Caption = "Looking for device on COM" & Port
        MSComm1.CommPort = Port: MSComm1.Settings = "9600,n,8,1": MSComm1.PortOpen = True: Port = Port + 1
    End If
    Buffer = "": Status = "": MSComm1.Output = "<I>"
End Sub

Modul berikut untuk mengatur masukan pada TextBox dari txtTimer. Kita akan melakukan jebakan untuk membatasi masukan pada nilai 0 sampai 255 sesuai dengan nilai byte yaitu yaitu maksimal 255 (FFH).

Private Sub txtTimer_Change(Index As Integer)
        If Val(txtTimer(Index).Text) > 255 Then
            MsgBox "Please set timer value from 0 to 255", , "Entry Failure": txtTimer(Index) = Val(Timer(Index))
        End If
        txtTimer(Index).Text = Val(txtTimer(Index).Text)
End Sub

Demikian aplikasi untuk perangkat pewaktu 8 saluran yang dibuat. Sekarang kita bisa mengatur nilai pewaktu dari perangkat. Aplikasi lain yang berkaitan dengan perangkat akan dibahas pada kesempatan lain. Setidaknya sekarang perangkat sudah dapat dioperasikan dan dikelola.

Untuk koneksi antara Serial Port PC dengan perangkat, perhatikan gambar berikut:



Pada konektor sebelah kanan, hubungkan terminal TXD dengan pena 2 dari konektor DB9, RXD dengan pena 3 dan GND pada pena 5.




Udah ya, makasih udah baca postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan oleh sobat semua.

Salam....

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....