Minggu, 19 Juli 2009

Program PWM pada AT89S51 tanpa Interrupt


Pembaca, pada semester 4 kemarin, saya mendapat tugas dari dosen mata kuliah mikroprosesor untuk membuat sebuah robot line follower, atau robot pengikut garis dengan menggunakan mikrokontroler AT89S51

pada awalnya saya sempat bingung, karena dosen saya menyuruh saya dan kawan2 untuk belajar programming AT89S51 berikut struktur-strukturnya secara otodidak, dosen saya hanya memberi pengarahan-pengarahan dasar saja, seperti : untuk mengontrol kecepatan motor DC pada robot diperlukan PWM (Pulse Width Modulation) yang menggunakan interrupt system pada mikrokontroler tersebut, kemudian beliau menjelaskan frekuensi yang dipakai, yaitu 200 HZ, meskipun standar PWM yang ada kebanyakan 1000 KHZ

dengan menggunakan frekuensi 200 HZ, berarti 1 siklus PWM adalah 5 milidetik
namun beliau mengingatkan agar programing PWM tidak di copy paste dari internet, karena dari setiap step yang kita buat akan ditanya olehnya apa maksudnya, waduh!

setelah saya cari2 di internet pun, hasil yang ditemukan adalah saran untuk menggunakan mikrokontroller dari keluarga AVR, sedangkan untuk MCS-51(dalam hal ini AT89S51) hampir tidak dapat ditemukan, setelah ditemukan, struktur programnya pun tidak dapat saya mengerti dan saya terapkan untuk tugas robot ini

akhirnya dari buku yang membahas mengenai programming mikrokontroler AT89S51 (tentu saja tidak membahas PWM) saya coba bolak balik untuk mendapatkan programming PWM yang benar2 "ORIGINAL BY FACHRI" akhirnya daripada saya pusing dan terjebak belajar di struktur interrupt, saya membuat program PWM dengan menggunakan Sub-Rutin sederhana, dimana Sub Rutin Tersebut berjalan 5 milidetik,

cara kerjanya
-Tombol untuk start robot harus ditekan dan dilepas
-Pembacaan sensor dimulai, setiap ada yang cocok, subrutin dipanggil
-setelah menjalankan subrutin 5milidetik, kembali membaca sensor
-proses tersebut berulang dan berhenti ketika mikrokontroller di reset


sub rutin penjalanan motor dibagi 4 jenis:
-Maju Full=Robot melaju dengan kecepatan penuh
-Maju Half=Robot melaju dengan kecepatan setengah
-Belok Kiri
-Belok Kanan


untuk flowchartnya belum dibuat memang, tapi saya akan sertakan programming Assembly MCS-51 nya di sini:

$MOD51

;kecepatan-kecepatan motor:
;----------------------------------
;Gerakan Kecepatan Motor
;-----------------------------------------------
; Kiri Kanan
;-----------------------------------------------
;Maju-Full 90% 90%
;Maju-Half 60% 60%
;Kiri 10% 60%
;Kanan 60% 10%
;-----------------------------------------------
;
;Port Output yang digunakan
;-----------------------------------------------------------------------------------------------------------------------
;Port 0.7 sebagai penentu motor kiri(kalau mengeluarkan nilai 0 dapat berfungsi sebagai potensial 0/Ground untuk motor)
;Port 0.0 sebagai penentu motor kanan(kalau mengeluarkan nilai 0 dapat berfungsi sebagai potensial 0/Ground untuk motor)
;
;-----------------------------------------------------------------------------------------------------------------------
;Made By: Muchammad Fachri
;-----------------------------------------------------------------------------------------------------------------------
;Electrical Engineering Trisakti University
;Computer System Engineering
;Embedded System Division
;-----------------------------------------------------------------------------------------------------------------------
;

;--------------------------------
;Mulai Jalankan Robot,tekan P2.0
;--------------------------------
JMP Inisialisasi

ORG 0CH
Inisialisasi:
JB P2.0,$
JNB P2.0,$
JMP Start

ORG 30H
Start:
MOV TMOD,#01H ;Timer 0 mode 1 (16 bit)

;-----------------------------
;Baca Port (Input dari sensor)
;-----------------------------

baca:
MOV A,P1
cek:
CJNE A,#00000111B,cek1
CALL MajuHalf
JMP baca
cek1:
CJNE A,#00001111B,cek2
CALL TurnRight
JMP baca
cek2:
CJNE A,#00010111B,cek3
CALL TurnLeft
JMP baca
cek3:
CJNE A,#00011111B,cek4
CALL MajuHalf
JMP baca
cek4:
CJNE A,#00100111B,cek5
CALL TurnRight
JMP baca
cek5:
CJNE A,#00101111B,cek6
CALL TurnRight
JMP baca
cek6:
CJNE A,#00110111B,cek7
CALL TurnRight
JMP baca
cek7:
CJNE A,#00111111B,cek8
CALL TurnRight
JMP baca
cek8:
CJNE A,#01000111B,cek9
CALL TurnLeft
JMP baca
cek9:
CJNE A,#01001111B,cek10
CALL TurnLeft
JMP baca
cek10:
CJNE A,#01010111B,cek11
CALL TurnLeft
JMP baca
cek11:
CJNE A,#01011111B,cek12
CALL TurnLeft
JMP baca
cek12:
CJNE A,#01100111B,cek13
CALL MajuHalf
JMP baca
cek13:
CJNE A,#01101111B,cek14
CALL TurnRight
JMP baca
cek14:
CJNE A,#01110111B,cek15
CALL TurnLeft
JMP baca
cek15:
CJNE A,#01111111B,cek16
CALL MajuHalf
JMP baca
cek16:
CJNE A,#10000111B,cek17
CALL MajuFull
JMP baca
cek17:
CJNE A,#10001111B,cek18
CALL TurnLeft
JMP baca
cek18:
CJNE A,#10010111B,cek19
CALL TurnRight
JMP baca
cek19:
CJNE A,#10011111B,cek20
CALL MajuFull
JMP baca
cek20:
CJNE A,#10100111B,cek21
CALL TurnLeft
JMP baca
cek21:
CJNE A,#10101111B,cek22
CALL MajuFull
JMP baca
cek22:
CJNE A,#10110111B,cek23
CALL MajuFull
JMP baca
cek23:
CJNE A,#10111111B,cek24
CALL TurnLeft
JMP baca
cek24:
CJNE A,#11000111B,cek25
CALL TurnRight
JMP baca
cek25:
CJNE A,#11001111B,cek26
CALL TurnRight
JMP baca
cek26:
CJNE A,#11010111B,cek27
CALL TurnRight
JMP baca
cek27:
CJNE A,#11011111B,cek28
CALL TurnRight
JMP baca
cek28:
CJNE A,#11100111B,cek29
CALL MajuHalf
JMP baca
cek29:
CJNE A,#11101111B,cek30
CALL TurnLeft
JMP baca
cek30:
CJNE A,#11110111B,cek31
CALL TurnRight
JMP baca
cek31:
CJNE A,#11111111B,cek30
CALL MajuHalf
JMP baca







;-----------------------------------------------------------------------------------------------------------
;Subrutin Penjalanan Motor
;-----------------------------------------------------------------------------------------------------------


MajuFull:
MOV TH0,#0EEH ;TH0 dan TL0 diset dengan angka 61036, dengan harapan 4500 ud(4,5ms) sebagai waktu tunda
MOV TL0,#06CH
SETB TR0 ;Jalankan Timer 0
CLR P0.0 ;hidupkan motor kiri
CLR P0.7 ;hidupkan motor kanan
Mati:
JNB TF0,Mati ;Tunggu sampai TF0 menjadi logic 1
CLR TF0 ;nol kan bit pelimpah(Timer Flag)
CLR TR0 ;Matikan Timer 0
MOV TH0,#0FEH ;TH0 dan TL0 diset dengan angka 65036, dengan harapan 500 ud(0.5 ms) sebagai waktu tunda
MOV TL0,#00CH
SETB TR0 ;nyalakan timer 0
SETB P0.0 ;matikan motor kiri
SETB P0.7 ;matikan motor kanan
Mati2:
JNB TF0,Mati2 ;tunggu sampai TF0 menjadi logic 1 (timer melimpah)
CLR TF0 ;bersihkan Timer Flag
CLR TR0 ;Matikan Timer

RET ;Kembali ke pemanggil

MajuHalf:
MOV TH0,#0F4H
MOV TL0,#048H
SETB TR0
CLR P0.0
CLR P0.7
Mati3:
JNB TF0,Mati3
CLR TF0
CLR TR0
MOV TH0,#0F8H
MOV TL0,#030H
SETB TR0
SETB P0.0
SETB P0.7
Mati4:
JNB TF0,Mati4
CLR TF0
CLR TR0

RET

TurnRight:
MOV TH0,#0FEH
MOV TL0,#00CH
CLR P0.0
CLR P0.7
SETB TR0

JNB TF0,$
CLR TF0
CLR TR0
MOV TH0,#0F6H
MOV TL0,#03CH
SETB TR0
SETB P0.0

JNB TF0,$
CLR TF0
CLR TR0
MOV TH0,#0F8H
MOV TL0,#030H
SETB TR0
SETB P0.7

JNB TF0,$
CLR TF0
CLR TR0

RET


TurnLeft:
MOV TH0,#0FEH
MOV TL0,#00CH
CLR P0.0
CLR P0.7
SETB TR0

JNB TF0,$
CLR TF0
CLR TR0
MOV TH0,#0F6H
MOV TL0,#03CH
SETB TR0
SETB P0.7

JNB TF0,$
CLR TF0
CLR TR0
MOV TH0,#0F8H
MOV TL0,#030H
SETB TR0
SETB P0.0

JNB TF0,$
CLR TF0
CLR TR0

RET

End




demikian program assembly yang saya buat, oiya, program tersebut diatas telah di test ke hardware nya dengan menghubungkan ke sensor2 pada robot, dan sudah berjalan dengan baik, motor DC kecepatannya dapat dikendalikan dengan sempurna, kini tim kami sedang mengerjakan di bagian mekaniknya, berkutat dengan kopling motor DC ke body robotnya, doakan kami semoga berhasil ya!!!

1 komentar:

Anonim mengatakan...

from Rifky: Bravo..Bravo ...excellent job :) proud to have brother like you