Pengendalian 8 buah Motor oleh DST-51
Pada aplikasinya, seringkali suatu sistem mikrokontroler digunakan untuk mengendalikan beberapa buah motor secara bersamaan. Berikut ini adalah pengendalian delapan buah motor DC oleh DST-51, sebuah sistem berbasis AT89C51 di mana proses pengendalian yang dilakukan adalah berupa pengaturan kecepatan dan keaktifan motor dengan arah putar yang searah.
Rangkaian Pengendali
Rangkaian pengendali pada setiap motor terdiri dari dua buah transistor yaitu BD139 yang terhubung dengan motor dan C9014 yang mengatur keaktifan BD139.
I
MotorI
b2Gambar 1
Aliran arus pada Transistor BD139
Transistor BD139 mempunyai arus kolektor maksimum (I
Cmax) sebesar 1A sesuai data sheet, namun pada aplikasinya sebaiknya digunakan 0,5A. Arus kolektor maksimum dari transistor BD139 adalah arus yang mengalir melalui Motor DC oleh karena itu dapat juga disebut sebagai I
Motor. Dengan arus motor sebesar 0,5A maka maksimal arus motor DC yang dapat dikendalikan oleh rangkaian ini juga 0,5A.
Transistor BD139 mempunyai penguatan (H
FE) sebesar 40 maka sesuai persamaan berikut:
I
Motor= I
b1* H
FE……….. (1)
0,5A = I
b1* 40 I
b1= 12,5 mA
maka arus basis dari Q1 BD139 yang diperlukan untuk mengaktifkan transistor ini adalah sebesar 12,5 mA
Untuk memberikan arus sebesar ini pada basis Q1 BD139 maka harga R2 yang terhubung pada basis transistor ini adalah:
……… (2)
maka akan diperoleh harga R2 adalah 344 ohm atau 330 ohm yang biasa digunakan di
pasaran. Arus sebesar 12,5 mA masih terlalu besar untuk Port AT89C51 yang
mempunyai kemampuan maksimum I
OL10 mA, oleh karena itu transistor Q2 C9014
perlu ditambahkan sebagai penguat.
I
b2I
C2Gambar 2 Aliran arus pada C9014
Dengan R2 sebesar 330 ohm maka I
C2yang terjadi saat transistor Q1 C9014 berada pada kondisi aktif (saturasi) adalah:
………... (3)
Dengan persamaan ini, maka diperoleh IC2 adalah 15mA. Dengan H
FEC9014 sebesar 60 dan digunakannya persamaan 1, maka I
b1yaitu arus basis Q2 C9014 yang diambil dari Port 1 AT89C51 cukup sebesar 250 uA saja.
Agar Port 1 AT89C51 mengeluarkan arus sebesar 250 uA saat kondisi high maka harga R1 diperoleh dengan persamaan berikut
………. (4)
V
OHadalah tegangan output Port 1 AT89C51 saat kondisi high yaitu minimal 2,4 Volt. Dengan persamaan ini maka harga R1 yang diperoleh adalah 6,8 K
Dengan rangkaian ini, maka pada saat kondisi P1.0 berlogika high maka transistor Q2 C9014 akan saturasi sehingga arus I
C2mengalir dari R2 langsung menuju ke ground. Transistor Q1 BD139 tidak mendapat bias arus pada basisnya dan berada pada kondisi cut off. Hal ini menyebabkan arus motor tidak mengalir dan motor tidak berputar., namun bila kondisi P1.0 berlogika low maka transistor Q2 C9014 akan cut off dan arus dari R2 tidak langsung menuju ke ground melainkan mengalir ke basis I
b1sehingga transistor Q1 BD139 berada pada pada kondisi saturasi.
Arus I
Motorakan mengalir dan menggerakkan motor DC. Diode D1 IN4001 berfungsi sebagai penahan adanya tegangan balik dari kumparan motor.
Maka dapat disimpulkan bahwa, motor DC akan berputar setiap kali kondisi
P1.0 low dan berhenti berputar setiap kondisi P1.0 high.
Pengaturan kecepatan
Proses pengaturan kecepatan dilakukan dengan menggunakan Teknik PWM (Pulse Width Modulation) yaitu dengan mengatur lebar pulsa ON (pulsa untuk mengaktifkan motor) dalam periode tertentu. Semakin lebar pulsa ON atau kondisi low pada P1.0 maka kecepatan putar motor akan semakin bertambah hingga pada batas maksimumnya maka kondisi P1.0 akan berlogika low terus, sebaliknya semakin sempit pulsa ON atau kondisi low pada P1.0 maka kecepatan putar motor akan semakin berkurang hingga pada batas maksimumnya maka kondisi P1.0 akan berlogika high terus.
Periode T ON
Motor bertambah cepat
Putaran paling cepat
]
Gambar 3 Bentuk sinyal PWM
8 buah rangkaian driver seperti yang tampak pada gambar 1 terhubung pada
Port 1 AT89C51, oleh karena itu untuk menghasilkan sinyal PWM seperti pada
gambar di atas pada masing-masing port dari Port 1 maka dibuat sebuah program
yang mengeluarkan data dari tabel yang dibentuk dalam memori RAM Internal
AT89C51.
0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1
Kecepatan
Motor 8 7 6 5 4 3 2 1
52H 51H
54H 55H 56H 57H 58H 59H 53H 50H
TABEL KECEPATAN
Motor 1 Motor 2 Motor 3 Motor 4 Motor 5 Motor 6 Motor 7 Motor 8
Gambar 4 Tabel Kecepatan
Gambar 4 menunjukkan hubungan antara tabel kecepatan dan sinyal PWM yang dihasilkan. Seperti telah dijelaskan sebelumnya, bahwa untuk mengaktifkan motor dilakukan dengan memberikan kondisi low pada port yang berhubungan, oleh karena itu semakin lebar kondisi low maka akan semakin banyak logika 0 pada tabel kecepatan tiap motor.
Tabel Kecepatan pada gambar 4 menunjukkan bahwa tiap kolom berisi dengan data kecepatan motor. Tampak pada tabel tersebut bahwa data kecepatan motor berada di tiap-tiap bit dari 10 buah lokasi memori, hal ini menunjukkan bahwa terdapat 10 step perubahan kecepatan untuk tiap-tiap motor. Oleh karena itu dapat disimpulkan sesuai dengan data pada gambar 4 bahwa:
Motor 1 menempati kecepatan pada step 1 Motor 2 menempati kecepatan pada step 4 Motor 3 menempati kecepatan pada step 2 Motor 4 menempati kecepatan pada step 4 Motor 5 berhenti
Motor 6 menempati kecepatan pada step 6
Motor 7 menempati kecepatan pada step 10 (tertinggi) Motor 8 menempati kecepatan pada step 8
Dengan sebuah program looping yang mengambil data-data di tabel tersebut dan mengirimkan ke Port1 secara paralel dengan berurutan maka sinyal-sinyal PWM akan muncul pada Port 1 seperti yang tampak pada sinyal-sinyal PWM pada gambar 4.
Listing 1 Loop2Motor:
Mov R0,#TabelKecepatan ;R0 menuju ke tabel data
;kecepatan motor
Mov R7,#StepKecepatan ;R7 diisi dengan jumlah step
;kecepatan
LoopMotor:
Mov A,@R0 ;Ambil data di tabel keceptan
;motor
Mov B,EnableMotor ;OR kan dengan keaktifan motor Orl A,B ;
Mov P1,A ;Kirim ke P1
Inc R0 ;Tunjuk tabel kecepatan
;berikutnya
Djnz R7,LoopMotor ;Lakukan hingga sejumlah step
;kecepatan
Ajmp Loop2Motor ;Kembali ke loop2Motor
Perubahan kecepatan dilakukan dengan mengubah isi tabel data kecepatan pada motor yang akan dirubah. Misalkan untuk menambah kecepatan motor 1 ke step berikutnya, dapat dilakukan dengan memberikan logika 0 pada bit 0 alamat 51H, maka kecepatan motor 1 akan berubah menuju ke step 2.
Untuk merubah data-data kecepatan pada tabel maka diperlukan sebuah tabel lain yang berfungsi untuk menyimpan pointer dari data kecepatan tiap motor. Pada tabel gambar 4, saat itu pointer dari motor 1 sedang berada di alamat 51H dan pointer motor 2 di alamat 54H. Pointer-pointer ini disimpan pada sebuah tabel pointer data kecepatan di mana pointer ini digunakan oleh program pada saat akan dilakukan perubahan kecepatan pada motor.
0 1 0 1 0 0 0 1
0 1 0 1 0 1 0 0
0 0 1 0
0 1 0 0
0 0 0 0
0 1 1 0
1 0 1 0
1 0 0 0
Motor 1 2 3 4 5 6 7 8
TABEL POINTER DATA KECEPATAN
0 1 0 1
0 1 0 1
0 1 0 1
0 1 0 1
0 1 0 1
0 1 0 1
Gambar 5
Tabel Pointer Data Kecepatan berdasar data pada tabel 4
Misalkan akan dilakukan penambahan kecepatan pada motor 1, maka program akan melihat motor 1 pada tabel pointer. Karena pointer pada motor 1 menunjukkan alamat 51H maka bit 0 (urutan bit dari motor 1) pada alamat tersebut diberi logika 0 dan pointer menunjukkan ke alamat 52H serta disimpan kembali ke tabel pointer data kecepatan.
Listing 2:
;Penambahan kecepatan
;- Ambil pointer kecepatan motor di alamat ini ditunjuk oleh kode
; yang diterima (R0)
;- Apabila pointer menunjuk ke akhir tabel maka pointer tidak berubah
;- Apabila pointer belum menunjuk ke akhir tabel maka pointer akan menuju ke
; alamat berikutnya
;- Proses penambahan kecepatan dilakukan dengan meng-clear bit-bit dari motor
; yang diakses di alamat yang ditunjuk oleh pointer data kecepatan
;---
TambahKecepatan:
Mov A,@R0 ;Ambil Pointer data kecepatan di tabel ;pointer
Cjne A,#StepKecepatan+TabelKecepatan,TidakResetAlamat
;Bila alamat
;terakhir, pointer bertahan Mov @R0,A ;
Ret
TidakResetAlamat:
Push A ;Pointer menunjuk ke alamat berikut Inc A ;dan simpan kembali di tabel pointer Mov @R0,A ;
Pop A ; Ret
;---
;- Ambil pointer data kecepatan dan bila belum mencapai
; alamat awal, tunjuk ke alamat sebelumnya dan simpan kembali ke tabel
;- Bila mencapai alamat awal, maka tetap tahan di alamat tersebut KurangiKecepatan:
Mov A,R0 ;Ambil Kode yang diterima Clr C ;
Subb A,#JumlahMotor ;Kode yg diterima - JumlahMotor = alam ;pointer data kecepatan dari motor ;yang diakses
Mov R0,A ;Ambil pointer data kecepatan dari mot Mov A,@R0 ;
Cjne A,#TabelKecepatan,Tidak2resetAlamat ;Bila alamat bukan ;step awal, maka menuju alamat step ;sebelumnya
LihatCarry2:
Mov A,#TabelKecepatan ;bila alamat awal maka, tahan pointer Mov @R0,A ;tersebut
Ret Tidak2ResetAlamat:
Dec A ;Pointer menuju ke alamat step sebelum-
;nya
Mov @R0,A ;simpan di Tabel Pointer Data
Ret ;Kecepatan
Potongan program di atas berfungsi untuk mengambil data Pointer Data Kecepatan, menunjuk ke alamat selanjutnya dan menyimpannya kembali ke tabel pointer pada saat terjadi penambahan kecepatan atau menunjuk ke alamat sebelumnya dan menyimpan kembali ke tabel pointer pada saat terjadi pengurangan kecepatan.
Setelah pointer yang menunjukkan alamat dari data kecepatan terakhir yang diakses oleh motor yang dipilih diketahui maka selanjutnya bit yang menunjukkan motor yang dipilih saat itu akan di set (untuk mengurangi kecepatan) atau di clear (untuk menambah kecepatan). Hal ini dilakukan dengan melakukan loncatan ke lokasi-lokasi tertentu dari program yang berisi perintah SET atau CLR dari bit-bit berdasarkan motor yang dipilih.
Listing 3:
Mov R0,A ;R0 diisi alamat step kecepatan yang
;akan diubah
Mov DPTR,#AksiMotor ;DPTR ke alamat awal tabel aksi motor Mov A,R5 ;Kode yg diterima - 'A' = Urutan
Clr C ;aksi motor
Subb A,#'A' ;
Mov B,#07 ;Urutan aksi motor * 7 (area yg
;digunakan
Mul AB ;setiap urutan)
Jmp @A+DPTR ;Lompat ke alamat urutan aksi motor
Kembali:
………
AksiMotor
;Tambah Kecepatan/aktifkan Motor 1 Mov A,@R0
Clr A.0 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 2 Mov A,@R0
Clr A.1 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 3 Mov A,@R0
Clr A.2 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 4 Mov A,@R0
Clr A.3 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 5 Mov A,@R0
Clr A.4 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 6 Mov A,@R0
Clr A.5 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 7 Mov A,@R0
Clr A.6 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 8 Mov A,@R0
Clr A.7 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 1 Mov A,@R0
Setb A.0 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 2 Mov A,@R0
Setb A.1 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 3 Mov A,@R0
Setb A.2 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 4 Mov A,@R0
Setb A.3 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 5 Mov A,@R0
Setb A.4 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 6 Mov A,@R0
Setb A.5 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 7 Mov A,@R0
Setb A.6 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 8 Mov A,@R0
Setb A.7 Mov @R0,A Ljmp Kembali
Pada listing 3 nilai Akumulator A sebelumnya telah terisi dengan pointer data kecepatan yang telah didapatkan setelah listing 2 dijalankan. Nilai akumulator A ini disimpan dalam R0 dan program akan melakukan lompatan ke lokasi tertentu berdasarkan motor yang dipilih dan perintah yang diberikan. Misalkan perintah yang diberikan adalah perintah penambahan kecepatan pada motor 3, maka sesuai tabel di bawah perintah “>C” yang diterima oleh sistem.
Pengaturan Kecepatan Kode Keterangan
>A Tambah Kecepatan Motor 1
>B Tambah Kecepatan Motor 2
>C Tambah Kecepatan Motor 3
>D Tambah Kecepatan Motor 4
>E Tambah Kecepatan Motor 5
>F Tambah Kecepatan Motor 6
>G Tambah Kecepatan Motor 7
>H Tambah Kecepatan Motor 8
>I Kurangi Kecepatan Motor 1
>J Kurangi Kecepatan Motor 2
>K Kurangi Kecepatan Motor 3
>L Kurangi Kecepatan Motor 4
>M Kurangi Kecepatan Motor 5
>N Kurangi Kecepatan Motor 6
>O Kurangi Kecepatan Motor 7
>P Kurangi Kecepatan Motor 8
Pengaturan Keaktifan Kode Keterangan
!A Aktifkan Motor 1
!B Aktifkan Motor 2
!C Aktifkan Motor 3
!D Aktifkan Motor 4
!E Aktifkan Motor 5
!F Aktifkan Motor 6
!G Aktifkan Motor 7
!H Aktifkan Motor 8
!I Nonaktifkan Motor 1
!J Nonaktifkan Motor 2
!K Nonaktifkan Motor 3
!L Nonaktifkan Motor 4
!M Nonaktifkan Motor 5
!N Nonaktifkan Motor 6
!O Nonaktifkan Motor 7
!P Nonaktifkan Motor 8
Tabel 1
Tabel Perintah-perintah Pengendalian Motor
Perintah “>” digunakan untuk membedakan perintah pengaturan kecepatan
dan perintah pengaturan keaktifan (lihat pada listing program lengkap), sedangkan
perintah “C” yang diterima oleh serial port dalam bentuk hexa adalah 43H, data tersebut dikurangi dengan “A” atau 41H sehingga menjadi 2. Hal ini diperlukan karena program harus melompat ke urutan ketiga (0 adalah urutan pertama) dari tabel aksi motor. Setiap urutan aksi motor menempati 7 byte lokasi memori oleh karena itu, nilai 2 terlebih dahulu harus dikali dengan 7 lompatan dilakukan.
Sedangkan nilai DPTR sebelumnya telah diisi dengan alamat dari Tabel Aksi Motor, maka pada saat instruksi JMP @A+DPTR program akan melompat ke alamat Tabel Aksi Motor + 2*7 yaitu bagian penambahan kecepatan motor 3. Di sini bit ke nol yang merupakan bit pengatur kecepatan motor 3 di clear sehingga kecepatan motorpun bertambah.
Input Perintah
Input perintah untuk pengendalian motor ini diperoleh dari serial port. Proses pengendalian motor dilakukan dengan mengirimkan data di tabel kecepatan ke Port 1 secara terus menerus, oleh karena itu apabila terjadi pengiriman perintah baik untuk merubah kecepatan atau mengatur keaktifan motor, harus dilakukan dengan menggunakan sistem interrupt, sehingga walaupun program sedang sibuk melakukan looping pengiriman data ke Port 1, pada saat terjadi pengiriman perintah melalui serial port, maka program akan berhenti melakukan pengiriman data dan meloncat ke alamat vektor interrupt terlebih dahulu.
Pada alamat tersebut, data perintah yang diterima akan dibedakan antara perintah pengaturan kecepatan “>” dan perintah pengaturan keaktifan motor “!”.
Selanjutnya dilanjutkan dengan data perintah yang menunjukkan motor berapa yang diatur keaktifan ataupun kecepatannya (Lihat tabel 1).
Setelah melayani interrupt, maka program akan kembali ke alamat letak terjadinya interrupt dan melanjutkan pengiriman data ke Port 1.
Pengaturan Keaktifan
Pengaturan keaktifan dilakukan dengan melakukan SET/CLR pada bit-bit yang terdapat pada variabel EnableMotor.
Motor 8 7 6 5 4 3 2 1 Variabel EnableMotor
1 = non aktif 2 = aktif
Gambar 6 Variabel EnableMotor
Variabel ini selanjutnya akan di OR kan dengan data yang akan dikeluarkan
pada Port 1. Sesuai sifat Gerbang OR maka setiap bit yang di OR dengan kondisi 1
(non aktif) maka akan menghasilkan kondisi logika 1 pula, sehingga motor yang
terhubung dengan Port 1 melalui rangkaian driver akan berhenti berputar, namun bila
bit tersebut di OR dengan kondisi 0 (aktif) maka data kecepatan akan terkirim keluar
melalui Port 1.
Variabel Enable Motor Tabel Data
Kecepatan
1
0 0
0
0 0
0 0
P1.0 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1
Gambar 7
Proses Kerja Variable Enable Motor untuk mengatur keaktifan
Aktifkan Serial Port Isi Tabel Kecepatan Isi Tabel Alamat Step Kecepatan
R0 = Alamat Awal Tabel Kecepatan R7 = Jumlah Step Kecepatan
Ambil data di Tabel Kecepatan Aktifkan Motor sesuai EnableMotor
Tunjuk Tabel Kecepatan berikut R7 = R7-1
R7 = 0?
No
Gambar 8
Flowchart Main Program
Disable Serial Interrupt Ambil Data Serial
'>'? '!'?
Ambil Data Serial
Data Serial >
H?
Kurangi Kecepatan Tambah Kecepatan
Ambil Data Serial
Aktifkan/
Nonaktifkan Motor sesuai data yg
diterima
Kembali dari Interrupt
SERIAL INTERRUPT
Gambar 9
Flowchart Serial Interrupt
12VDC VCC
12VDC VCC
12VDC VCC
12VDC VCC
12VDC VCC
12VDC VCC
12VDC VCC
12VDC
VCC
VCC
12VDC P1.0
P1.1
P1.0 P1.1
P1.2 P1.3
P1.4 P1.5
P1.6 P1.7
P1.2
P1.3P1.4P1.5 P1.6P1.7
M2 MOTOR DC
Q3BD139 Q4C9014
R3
33K
D2 IN4001 R4 330R
M3 MOTOR DC
Q5BD139 Q6C9014
R5
33K
D3 IN4001 R6 330R
M4 MOTOR DC
Q7 BD139 Q8
C9014 R7
33K
D4 IN4001 R8 330R
M5 MOTOR DC
Q9 BD139 Q10
C9014 R9
33K
D5 IN4001 R10 330R
M6 MOTOR DC
Q11 BD139 Q12
C9014 R11
33K
D6 IN4001 R12 330R
M7 MOTOR DC
Q13 BD139 Q14
C9014 R13
33K
D7 IN4001 R14 330R
M8 MOTOR DC
Q15 BD139 Q16
C9014 R15
33K
D8 IN4001 R16 330R
JP1
PORT1 DST51
1 2
3 4
5 6
7 8
9 10
J1
12VOLT 5A 1 2 M1
MOTOR DC
Q1BD139 Q2C9014
R1
33K
D1 IN4001 R2 330R
Gambar 10
Skema lengkap Antar Muka Pengendali 8 Motor dengan DST-51
Program lengkap Pengendali 8 Motor dengan DST-51 melalui Serial Port Program ini menggunakan Built In Routine DST-51 yaitu init_serial yang terletak di alamat 1B8H pada DST-51 Monitor
.DATA Org 70H
EnableMotor Ds 1 ;Variabel pengaktif motor .CODE
Init_Serial EQU 1B8H ;BUILT IN ROUTINE DST-51
ROM EQU 2000H
TabelKecepatan EQU 50H PointerKecepatan EQU 41H JumlahMotor EQU 8 StepKecepatan EQU 10
Org ROM ;Reset Vector
Ajmp Start ;
Org ROM+3H ;External Interrupt 0 Vector
Reti ;
Org ROM+0BH ;Timer 0 Interrupt Vector
Reti ;
Org ROM+13H ;External Interrupt 1 Vector
Reti ;
Org ROM+1BH ;Timer 1 Interrupt Vector
Reti ;
Org ROM+23H ;Serial Interrupt Vector Ajmp Serial_Interrupt
;---
;- Aktifkan Serial Interrupt
;- Isi Tabel Kecepatan dan Tabel Pointer Data Kecepatan
;- Kirim seluruh isi tabel kecepatan ke P1 berulang-ulang
;- Keaktifan motor atau perubahan motor akan terjadi setiap terjadi serial
; interrupt
;--- Start:
Lcall Init_Serial ;Inisial Serial Port 9600 bps
Setb EA ;Aktifkan Serial Interrupt
Setb ES ;
Mov EnableMotor,#00H ;Aktifkan semua motor
Acall IsiTabel ;Isi Tabel Kecepatan dan Pointer data kecepatan
Loop2Motor:
Mov R0,#TabelKecepatan ;R0 menuju ke tabel data kecepatan motor
Mov R7,#StepKecepatan ;R7 diisi dengan jumlah step kecepatan
LoopMotor:
Mov A,@R0 ;Ambil data di tabel keceptan motor Mov B,EnableMotor ;OR kan dengan keaktifan motor
Orl A,B ;
Mov P1,A ;Kirim ke P1
Inc R0 ;Tunjuk tabel kecepatan berikutnya Djnz R7,LoopMotor ;Lakukan hingga sejumlah step kecepatan Ajmp Loop2Motor ;Kembali ke loop2Motor
;---
;Isi Tabel Kecepatan dengan FF atau tidak ada kecepatan
;Isi Tabel Alamat Step Kecepatan dengan alamat awal dari Tabel Kecepatan
;---
IsiTabel:
Mov R0,#TabelKecepatan ;R0 ke alamat awal tabel ke
;cepatan motor
Mov R7,#StepKecepatan ;R7 diisi dengan jumlah step
;kecepatan
LoopKecepatanAwal:
Mov @R0,#0FFH ;Isi FFH di seluruh data
Inc R0 ;kecepatan motor
Djnz R7,LoopkecepatanAwal ;
Mov R0,#PointerKecepatan ;R0 ke alamat awal tabel alamat
;step kecepatan motor Mov R7,#JumlahMotor ;R7 dengan jumlah motor
IsiAlamatMotor:
Mov @R0,#TabelKecepatan ;Isi tabel pointer data kecepatan
Inc R0 ;dengan alamat awal pointer
kecepatan
Djnz R7,IsiAlamatMotor ; Ret
;---
;Penambahan kecepatan
;- Ambil pointer kecepatan motor di alamat ini ditunjuk oleh kode
; yang diterima (R0)
;- Apabila pointer menunjuk ke akhir tabel maka pointer tidak berubah
;- Apabila pointer belum menunjuk ke akhir tabel maka pointer akan menuju ke
; alamat berikutnya
TambahKecepatan:
Mov A,@R0 ;Ambil alamat data kecepatan terakhir dari
;motor tersebut
Cjne A,#StepKecepatan+TabelKecepatan,TidakResetAlamat ;Bila alamat
;terakhir, kembali ke alamat awal Mov @R0,A
Ret
TidakResetAlamat:
Push A ;Pointer menunjuk ke alamat berikut
Inc A ;
Mov @R0,A ;
Pop A ;
Ret
;---
;- Ambil alamat step kecepatan yang terakhir dan bila belum mencapai
; alamat awal, tunjuk ke alamat sebelumnya dan simpan kembali ke tabel
;- Bila mencapai alamat awal, maka tetap tahan di alamat tersebut
KurangiKecepatan:
Mov A,R0 ;Ambil Kode yang diterima
Clr C ;
Subb A,#JumlahMotor ;Kode yg diterima - JumlahMotor =
;alamat
;tabel pointer data kecepatan terakhir
;dari motor
;yang diakses
Mov R0,A ;Ambil pointer data kecepatan terakhir Mov A,@R0 ;tersebut
Cjne A,#TabelKecepatan,Tidak2resetAlamat ;Bila alamat bukan
;pointer awal, maka menuju alamat step
;sebelumnya LihatCarry2:
Mov A,#TabelKecepatan ;bila alamat awal maka, tahan di alamat Mov @R0,A ;tersebut
Ret
Tidak2ResetAlamat:
Dec A ;Menuju ke alamat step sebelumnya Mov @R0,A ;simpan di tabel alamat step Ret
;---
;INTERRUPT SERVICE ROUTINE
;---
Serial_Interrupt:
Clr ES ;Disable Interrupt
Mov P1,#0FFH ;Matikan semua motor sejenak Mov A,SBUF ;Simpan perintah di R5
;---
;Terjemahkan perintah yang diterima dari serial
;- Perintah '>' untuk pengaturan kecepatan
; A...H = Motor 1...Motor 8 ditambah kecepatan
; I...P = Motor 1...Motor 8 dikurangi kecepatan
; Contoh:
; - Menaikkan kecepatan motor 1: >A
; - Mengurangi kecepatan motor 8: >P
;
; Bila kecepatan mencapai maksimal atau minimal maka kecepatan akan bertahan
; di sana
;- Perintah '!' untuk mengatur keaktifan motor
; A...H = Motor 1...Motor 8 aktif
; I...P = Motor 1...Motor 8 non aktif
; Contoh:
; - Mengaktifkan motor 7: !G
; - Menonaktifkan motor 3: !K
;---
Cjne A,#'>',Bukan_Kecepatan ; Ajmp Kecepatan
Bukan_Kecepatan:
Cjne A,#'!',Kembali
;---
;Mengatur keaktifkan Motor
;Keaktifan motor diatur oleh variabel EnableMotor
;Variabel ini terdiri dari 8 bit di mana bit 0 adalah Motor 1 hingga bit 8 adalah
;motor 8. Bit 1 menandakan motor non aktif dan bit 0 menandakan motor aktif
;---
Clr RI ;Ambil kode keaktifan motor
Jnb RI,* ;
Mov A,SBUF ;
Clr C ;
Subb A,#'A' ;Kode keaktifan - 'A' = urutan aksi
;motor
Mov DPTR,#AksiMotor ;DPTR menunjuk ke alamat awal aksi
;motor
Mov R0,#EnableMotor ;R0 menunjuk alamat variabel
;keaktifan
Mov B,#07 ;Urutan aksi motor * 7 (ukuran area yg Mul AB ;dipakai utk tiap urutan aksi motor) Jmp @A+DPTR ;Lompat ke alamat urutan aksi motor
Kecepatan:
Clr RI Jnb RI,*
Mov R5,SBUF
;---
;- Periksa apakah perintah pengurangan atau penambahan kecepatan
;---
Mov R0,05H ;Kode Motor yang diakses -> R0
Cjne R0,#PointerKecepatan+JumlahMotor,LihatCarry ;Kode yang
;diterima
;> dari 'H' maka pengurangan kecepatan
LihatCarry: ;
Jnc PerintahPengurangan ;
;Bila tidak maka penambahan kecepatan Acall TambahKecepatan ;
;---
;- Proses penambahan kecepatan/mengaktifkan motor dilakukan dengan
; meng-clear bit-bit dari motor yang diakses di alamat yang ditunjuk
; oleh pointer data kecepatan
;- Proses pengurangan kecepatan/menonaktifkan motor dilakukan dengan men-set
; bit-bit dari motor yang diakses di alamat yang ditunjuk oleh pointer data
; kecepatan
;--- AksiMotor2:
Mov R0,A ;R0 diisi alamat step kecepatan yang
;akan diubah
Mov DPTR,#AksiMotor ;DPTR ke alamat awal tabel aksi motor Mov A,R5 ;Kode yg diterima - 'A' = Urutan
Clr C ;aksi motor
Subb A,#'A' ;
Mov B,#07 ;Urutan aksi motor * 7 (area yg
;digunakan
Mul AB ;setiap urutan)
Jmp @A+DPTR ;Lompat ke alamat urutan aksi motor
PerintahPengurangan:
Acall KurangiKecepatan Ajmp AksiMotor2
Kembali:
Clr RI ;Hapus Flag Receive Clr TI ;Hapus Flag Transmit Setb ES ;Enable Serial Interrupt Reti ;Kembali dari interrupt
;---
;Lakukan set atau clear bit di alamat yang ditunjuk oleh R0
;- Untuk mengatur kecepatan
; - R0 diisi alamat step kecepatan
; - Set/clear di bit yang tergantung dari motor yang diakses pada alamat yg
; ditunjuk R0
;- Untuk mengatur keaktifan
; - R0 diisi alamat variabel keaktifan motor (EnableMotor)
; - Set/clear di bit yang tergantung dari motor yang diakses
;---
AksiMotor:
;Tambah Kecepatan/aktifkan Motor 1 Mov A,@R0
Clr A.0 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 2 Mov A,@R0
Clr A.1 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 3 Mov A,@R0
Clr A.2 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 4 Mov A,@R0
Clr A.3 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 5 Mov A,@R0
Clr A.4 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 6 Mov A,@R0
Clr A.5 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 7 Mov A,@R0
Clr A.6 Mov @R0,A Ljmp Kembali
;Tambah Kecepatan/aktifkan Motor 8 Mov A,@R0
Clr A.7 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 1 Mov A,@R0
Setb A.0 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 2 Mov A,@R0
Setb A.1 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 3 Mov A,@R0
Setb A.2 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 4 Mov A,@R0
Setb A.3 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 5 Mov A,@R0
Setb A.4 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 6 Mov A,@R0
Setb A.5 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 7 Mov A,@R0
Setb A.6 Mov @R0,A Ljmp Kembali
;Kurangi Kecepatan/nonaktifkan Motor 8 Mov A,@R0
Setb A.7 Mov @R0,A Ljmp Kembali