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.
IMotor Ib2 Gambar 1 Aliran arus pada Transistor BD139
Transistor BD139 mempunyai arus kolektor maksimum (ICmax) 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 IMotor. Dengan arus motor sebesar 0,5A maka maksimal arus motor DC yang dapat dikendalikan oleh rangkaian ini juga 0,5A. Transistor BD139 mempunyai penguatan (HFE) sebesar 40 maka sesuai persamaan berikut: IMotor = Ib1* HFE ………………………………………….. (1) 0,5A = Ib1 * 40 Ib1 = 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 IOL 10 mA, oleh karena itu transistor Q2 C9014 perlu ditambahkan sebagai penguat.
IC2 Ib2
Gambar 2 Aliran arus pada C9014
Dengan R2 sebesar 330 ohm maka IC2 yang terjadi saat transistor Q1 C9014 berada pada kondisi aktif (saturasi) adalah: ……………………………………………...
(3)
Dengan persamaan ini, maka diperoleh IC2 adalah 15mA. Dengan HFE C9014 sebesar 60 dan digunakannya persamaan 1, maka Ib1 yaitu 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)
VOH adalah 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 IC2 mengalir 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 Ib1 sehingga transistor Q1 BD139 berada pada pada kondisi saturasi. Arus IMotor akan 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.
TABEL KECEPATAN Motor 8 7 6 5 4 3 2 1 0
0
0
1
0
0
0
0
Motor 2
0
0
0
1
0
0
0
1
Motor 3
0
0
0
1
0
1
0
1
Motor 4
0
0
0
1
0
1
0
1
Motor 5 Motor 6
0
0
0
1
1
1
1
1
0
0
0
1
1
1
1
1
Motor 7
0
0
1
1
1
1
1
1
Motor 8
0
0
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
0
1
1
1
1
1
1
50H 51H 52H 53H 54H 55H 56H 57H 58H 59H
Kecepatan
Motor 1
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 Mov
LoopMotor: Mov Mov Orl Mov Inc
R7,#StepKecepatan
A,@R0 B,EnableMotor A,B P1,A R0
;R0 menuju ke tabel data ;kecepatan motor ;R7 diisi dengan jumlah step ;kecepatan
;Ambil data di tabel keceptan ;motor ;OR kan dengan keaktifan motor ; ;Kirim ke P1 ;Tunjuk tabel kecepatan ;berikutnya
Djnz
R7,LoopMotor
Ajmp
Loop2Motor
;Lakukan hingga sejumlah step ;kecepatan ;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. TABEL POINTER DATA KECEPATAN
Motor
1 2 3 4 5 6 7 8
0
1
0
1
0
0
0
1
0
1
0
1
0
1
0
0
0
1
0
1
0
0
1
0
0
1
0
1
0
1
0
0
0
1
0
1
0
0
0
0
0
1
0
1
0
1
1
0
0
1
0
1
1
0
1
0
0
1
0
1
1
0
0
0
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
Mov Ret
@R0,A
TidakResetAlamat: Push A Inc A Mov @R0,A Pop A Ret
;terakhir, pointer bertahan ;
;Pointer menunjuk ke alamat berikut ;dan simpan kembali di tabel pointer ; ;
;------------;- 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
Mov Mov Clr Subb Mov
DPTR,#AksiMotor A,R5 C A,#'A' B,#07
Mul Jmp
AB @A+DPTR
;R0 diisi alamat step kecepatan yang ;akan diubah ;DPTR ke alamat awal tabel aksi motor ;Kode yg diterima - 'A' = Urutan ;aksi motor ; ;Urutan aksi motor * 7 (area yg ;digunakan ;setiap urutan) ;Lompat ke alamat urutan aksi motor
Kembali: ………………… AksiMotor ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.0 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.1 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.2 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.3 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.4 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.5 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.6 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.7 Mov @R0,A Ljmp Kembali
Motor 1
Motor 2
Motor 3
Motor 4
Motor 5
Motor 6
Motor 7
Motor 8
;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.0 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.1 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.2 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0
Motor 1
Motor 2
Motor 3
Motor 4
Setb A.3 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.4 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.5 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.6 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.7 Mov @R0,A Ljmp Kembali
Motor 5
Motor 6
Motor 7
Motor 8
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.
Kode >A >B >C >D >E >F >G >H >I >J >K >L >M >N >O >P
Pengaturan Kecepatan Keterangan Tambah Kecepatan Motor 1 Tambah Kecepatan Motor 2 Tambah Kecepatan Motor 3 Tambah Kecepatan Motor 4 Tambah Kecepatan Motor 5 Tambah Kecepatan Motor 6 Tambah Kecepatan Motor 7 Tambah Kecepatan Motor 8 Kurangi Kecepatan Motor 1 Kurangi Kecepatan Motor 2 Kurangi Kecepatan Motor 3 Kurangi Kecepatan Motor 4 Kurangi Kecepatan Motor 5 Kurangi Kecepatan Motor 6 Kurangi Kecepatan Motor 7 Kurangi Kecepatan Motor 8
Kode !A !B !C !D !E !F !G !H !I !J !K !L !M !N !O !P
Pengaturan Keaktifan Keterangan Aktifkan Motor 1 Aktifkan Motor 2 Aktifkan Motor 3 Aktifkan Motor 4 Aktifkan Motor 5 Aktifkan Motor 6 Aktifkan Motor 7 Aktifkan Motor 8 Nonaktifkan Motor 1 Nonaktifkan Motor 2 Nonaktifkan Motor 3 Nonaktifkan Motor 4 Nonaktifkan Motor 5 Nonaktifkan Motor 6 Nonaktifkan Motor 7 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. Variabel EnableMotor Motor 8 7 6 5 4 3 2 1
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.
0 0 0 0 0 0
Gambar 7 Proses Kerja Variable Enable Motor untuk mengatur keaktifan
P1.3 P1.2 P1.1
0
P1.6 P1.5 P1.4
1
P1.0
Variabel Enable Motor
P1.7
Tabel Data Kecepatan
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
No
R7 = 0?
Gambar 8 Flowchart Main Program
SERIAL INTERRUPT Disable Serial Interrupt Ambil Data Serial
Tambah Kecepatan
'>'?
'!'?
Ambil Data Serial
Ambil Data Serial
Data Serial > H?
Aktifkan/ Nonaktifkan Motor sesuai data yg diterima
Kurangi Kecepatan
Kembali dari Interrupt
Gambar 9 Flowchart Serial Interrupt
12VDC
12VDC
VCC
12VDC
VCC
VCC
M1 MOTOR DC
M2 MOTOR DC D2 IN4001
D3 IN4001
R2 330R
R4 330R
R6 330R
R1
R3 Q2 C9014
P1.0
Q1 BD139
R5 Q4 C9014
Q3 BD139
33K
Q6 C9014 P1.6
P1.3
33K
12VDC
12VDC
VCC
VCC
M4 MOTOR DC
M5 MOTOR DC D5 IN4001
D6 IN4001
R8 330R
R10 330R
R12 330R
R9 Q8 C9014
Q7 BD139
R11 Q10 C9014
Q9 BD139
33K
Q12 C9014 P1.7
P1.4
33K
12VDC
Q11 BD139
33K
12VDC
VCC
VCC M7 MOTOR DC
M8 MOTOR DC
D7 IN4001
D8 IN4001
R14 330R
R16 330R
R13 Q13 BD139
JP1 1 3 5 7 9
2 4 6 8 10
P1.1 P1.3 P1.5 P1.7
PORT1 DST51 Q16 C9014
P1.5
33K
VCC
P1.0 P1.2 P1.4 P1.6
R15 Q14 C9014
33K
M6 MOTOR DC
D4 IN4001
R7
P1.2
Q5 BD139
33K
12VDC
VCC
P1.1
M3 MOTOR DC
D1 IN4001
Q15 BD139
12VDC J1 1 2 12VOLT 5A
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 Setb Mov Acall kecepatan
EA ES EnableMotor,#00H IsiTabel
;Aktifkan Serial Interrupt ; ;Aktifkan semua motor ;Isi Tabel Kecepatan dan Pointer data
Loop2Motor: Mov R0,#TabelKecepatan ;R0 menuju ke tabel data kecepatan motor Mov R7,#StepKecepatan ;R7 diisi dengan jumlah step kecepatan LoopMotor: Mov Mov Orl Mov Inc Djnz Ajmp
A,@R0 B,EnableMotor A,B P1,A R0 R7,LoopMotor Loop2Motor
;Ambil data di tabel keceptan motor ;OR kan dengan keaktifan motor ; ;Kirim ke P1 ;Tunjuk tabel kecepatan berikutnya ;Lakukan hingga sejumlah step kecepatan ;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 Mov
R0,#TabelKecepatan R7,#StepKecepatan
LoopKecepatanAwal: Mov @R0,#0FFH Inc R0 Djnz R7,LoopkecepatanAwal Mov R0,#PointerKecepatan Mov
R7,#JumlahMotor
IsiAlamatMotor: Mov @R0,#TabelKecepatan Inc R0 kecepatan Djnz R7,IsiAlamatMotor Ret
;R0 ke alamat awal tabel ke ;cepatan motor ;R7 diisi dengan jumlah step ;kecepatan
;Isi FFH di seluruh data ;kecepatan motor ; ;R0 ke alamat awal tabel alamat ;step kecepatan motor ;R7 dengan jumlah motor
;Isi tabel pointer data kecepatan ;dengan alamat awal pointer ;
;-----;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 dari Cjne
;Ambil alamat data kecepatan terakhir
;motor tersebut A,#StepKecepatan+TabelKecepatan,TidakResetAlamat ;Bila
alamat ;terakhir, kembali ke alamat awal Mov Ret
@R0,A
TidakResetAlamat: Push A Inc A Mov @R0,A Pop A Ret
;Pointer menunjuk ke alamat berikut ; ; ;
;------------;- 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 Clr C Subb A,#JumlahMotor
Mov Mov Cjne
;Ambil Kode yang diterima ; ;Kode yg diterima - JumlahMotor = ;alamat ;tabel pointer data kecepatan terakhir ;dari motor ;yang diakses R0,A ;Ambil pointer data kecepatan terakhir A,@R0 ;tersebut 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 Mov @R0,A Ret ;-------;INTERRUPT SERVICE ROUTINE ;-------Serial_Interrupt: Clr ES Mov P1,#0FFH Mov A,SBUF
;Menuju ke alamat step sebelumnya ;simpan di tabel alamat step
;Disable Interrupt ;Matikan semua motor sejenak ;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 Clr Setb Reti
RI TI ES
;Hapus Flag Receive ;Hapus Flag Transmit ;Enable Serial Interrupt ;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 Mov A,@R0 Clr A.0 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.1 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.2 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0
Motor 1
Motor 2
Motor 3
Motor 4
Clr A.3 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.4 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.5 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.6 Mov @R0,A Ljmp Kembali ;Tambah Kecepatan/aktifkan Mov A,@R0 Clr A.7 Mov @R0,A Ljmp Kembali
Motor 5
Motor 6
Motor 7
Motor 8
;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.0 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.1 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.2 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.3 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.4 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.5 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0 Setb A.6 Mov @R0,A Ljmp Kembali ;Kurangi Kecepatan/nonaktifkan Mov A,@R0
Motor 1
Motor 2
Motor 3
Motor 4
Motor 5
Motor 6
Motor 7
Motor 8
Setb Mov Ljmp
A.7 @R0,A Kembali