Escolar Documentos
Profissional Documentos
Cultura Documentos
Oleh :
Hendawan Soebhakti, ST
Agustus 2007
Arsitektur mikrokontroler jenis AVR pertamakali dikembangkan pada tahun 1996 oleh dua orang mahasiswa
Norwegian Institute of Technology yaitu Alf-Egil Bogen dan Vegard Wollan.
Mikrokontroler AVR kemudian dikembangkan lebih lanjut oleh Atmel. Seri pertama AVR yang dikeluarkan adalah
mikrokontroler 8 bit AT90S8515, dengan konfigurasi pin yang sama dengan mikrokontroler 8051, termasuk address
dan data bus yang termultipleksi.
Mikrokontroler AVR menggunakan teknologi RISC dimana set instruksinya dikurangi dari segi ukurannya dan
kompleksitas mode pengalamatannya. Pada awal era industri komputer, bahasa pemrograman masih menggunakan
kode mesin dan bahasa assembly. Untuk mempermudah dalam pemrograman para desainer komputer kemudian
mengembangkan bahasa pemrograman tingkat tinggi yang mudah dipahami manusia. Namun akibatnya, instruksi
yang ada menjadi semakin komplek dan membutuhkan lebih banyak memori. Dan tentu saja siklus eksekusi
instruksinya menjadi semakin lama. Dalam AVR dengan arsitektur RISC 8 bit, semua instruksi berukuran 16 bit dan
sebagian besar dieksekusi dalam 1 siklus clock. Berbeda dengan mikrokontroler MCS-51 yang instruksinya bervariasi
antara 8 bit sampai 32 bit dan dieksekusi selama 1 sampai 4 siklus mesin, dimana 1 siklus mesin membutuhkan 12
periode clock.
Dalam perkembangannya, AVR dibagi menjadi beberapa varian yaitu AT90Sxx, ATMega, AT86RFxx dan ATTiny.
Pada dasarnya yang membedakan masing-masing varian adalah kapasitas memori dan beberapa fitur tambahan saja.
Status Register adalah register yang memberikan informasi yang dihasilkan dari eksekusi instuksi aritmatika.
Informasi ini berguna untuk mencari alternatif alur program sesuai dengan kondisi yang dihadapi.
Bahasa yang dipakai untuk memprogram mikrokontroler AVR adalah bahasa assembly AVR atau bahasa C. Dalam
buku ini semua program ditulis dalam bahasa assembly AVR. Berikut adalah contoh sebuah program aplikasi untuk
mikrokontroler AVR :
.include “m8535def.inc”
.org 0x0000
rjmp main Inisialisasi program
ldi r16,0xff
out ddra,r16 Program utama
out PortA,r16
cbi PortA,0
cbi PortA,1
stop: rjmp stop
Sebuah program harus terdiri dari dua bagian, yaitu inisialisasi program dan program utama. Inisialisasi program harus
disertakan agar program utama dapat berjalan. Berikut adalah urutan langkah inisialisasi program :
1. Menentukan jenis mikrokontroler yang digunakan dengan cara memasukkan file definisi device (m8535def.inc) ke
dalam program utama.
.include “m8535def.inc” ;
2. Menuliskan original address program, yaitu 0x0000. Kemudian dilanjutkan dengan instruksi rjmp / relative jump ke
label main. Hal ini dimaksudkan agar program memory tidak tumpang tindih dengan data memory.
.org 0x0000
rjmp main
3. Menentukan isi Stack Pointer dengan address terakhir RAM (RAMEND). Untuk ATMega8535 yaitu 0x025F. Ini
dimaksudkan agar program utama mulai ditulis setelah address terakhir RAM.
.include "m8535def.inc"
.org 0x00
rjmp main
ldi r16,0x00
out ddra,r16 ; PortA as input
ldi r16,0xff
out ddrb,r16 ; PortB as output
out ddrc,r16 ; PortC as output
ulang: in r16,PortA
out PortB,r16
ldi r16,0x0f
out PortC,r16
cbi PortC,0
sbic PortA,5
cbi PortC,1
sbi PortC,6
sbis PortA,5
sbi PortC,7
ldi r16,0x00
out PortB,r16
out PortC,r16
rjmp ulang
Latihan :
1. Buatlah program agar dapat membaca data pada PortC dan mengeluarkan data tersebut pada PortA.
2. Buatlah program agar PortA mengeluarkan data 20h jika PortB,1 berlogika 0.
3. Buatlah program agar PortA mengeluarkan data 15h jika PortC,1 dan PortD,2 berlogika 1, selain kondisi
tersebut PortA mengeluarkan data 00h.
.include "m8535def.inc"
.org 0x00
rjmp main
ldi r16,0xff
out ddra,r16 ; PortA as output
ldi r16,0x00
out ddrc,r16 ; PortC as output
out ddrd,r16 ; PortD as output
ldi r16,0x00
ldi r17,0x15
ulang: sbis PortC,1
rjmp ulang1
sbis PortD,2
rjmp ulang1
out PortA,r17
rjmp ulang
ulang1: out PortA,r16
rjmp ulang
ldi r16,0x80
ldi r17,0x80
add r16,r17
ldi r18,0x02
adc r16,r18
here: rjmp here
• Pengurangan
.include "m8535def.inc"
.org 0x00
rjmp main
main: ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,0x09
ldi r17,0x06
sub r16,r17
ldi r17,0x03
sub r16,r17
ldi r17,0x06
sub r16,r17
here: rjmp here
ldi r16,5
ldi r17,100
mul r16,r17
movw r17:r16,r1:r0 ; Copy r1:r0 to r17:r16
here: rjmp here
• Pembagian
.include "m8535def.inc"
.org 0x00
.def drem8u =r15 ;remainder/sisa
.def dres8u =r16 ;result/hasil
.def dd8u =r16 ;dividend/yang dibagi
.def dv8u =r17 ;divisor/pembagi
.def dcnt8u =r18 ;loop counter
rjmp main
ldi dd8u,4
ldi dv8u,2
rcall div8u
here: rjmp here
;
div8u: sub drem8u,drem8u ;clear remainder and carry
ldi dcnt8u,9 ;init loop counter
d8u_1: rol dd8u ;shift left dividend
dec dcnt8u ;decrement counter
brne d8u_2 ;if done
ret ;return
d8u_2: rol drem8u ;shift dividend into remainder
sub drem8u,dv8u remainder = remainder - divisor
brcc d8u_3 ;if result negative
add drem8u,dv8u ;restore remainder
clc ;clear carry to be shifted into result
rjmp d8u_1 ;else
d8u_3: sec ;set carry to be shifted into result
rjmp d8u_1
.include "m8535def.inc"
.org 0x00
rjmp main
main:
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,0b01110111
ldi r17,0b00001111
and r16,r17
ori r16,0b00001000
clr r16
inc r16
ser r16
dec r16
here:
rjmp here
0xf0
Input
Aksi
PortA,1 PortA,0
0 0 Clear isi r20 dan r21
0 1 Isi r20 dengan 0 kemudian naikkan isi r20 sampai nilainya = 10, jika sudah
sampai 10 ulangi lagi dari 0
1 0 Isi r21 dengan 10 kemudian turunkan isi r21 sampai 0, jika sudah 0 ulangi lagi
dari 10.
1 1 Set isi r20 dan r21
Jawaban no 2:
.include "m8535def.inc"
.org 0x00
rjmp main
cek10_11: ; PortA,1=1
sbic PortA,0 ; PortA,1=1, PortA,0=0 (10)
rjmp setAll ;
ulang: ldi r21,10
dec r21
dec r21
dec r21
dec r21
dec r21
dec r21
dec r21
dec r21
dec r21
dec r21
rjmp ulang
clearAll:
clr r20
clr r21
rjmp mulai
.include "m8535def.inc"
.org 0x00
rjmp main
Mulai
Tdk r16=0?
Ya
Tdk r17=0?
Ya
Selesai
Setelah melaksanakan ISR secara lengkap, maka mikrokontroler akan kembali melanjutkan eksekusi program utama
yang tadi ditinggalkan.
Time
Main Program
Time
7,5,4 SM2..0 Sleep Mode Select Bits. Digunakan untuk memilih mode sleep MCU
SM2 SM1 SM0 Sleep Mode
0 0 0 Idle
0 0 1 ADC Noise Reduction
0 1 0 Power-down
0 1 1 Power-save
1 0 0 Reserved
1 0 1 Reserved
1 1 0 Standby
1 1 1 Extended Standby
6 SE Sleep Enable. Digunakan untuk mengaktifkan mode Sleep dengan memberikan logika
1 pada SE sebelum Sleep dijalankan . Setelah Wake-up harus segera diberi logika 0.
3,2 ISC11, ISC10 Interrupt Sense Control 1 Bit. Digunakan untuk memilih jenis pulsa trigger External
Interrupt 1 (INT1).
ISC11 ISC10 Description
0 0 The low level of INT1 generates an interrupt request.
0 1 Any logical change on INT1 generate an interrupt request
1 0 The falling edge of INT1 generate an interrupt request.
1 1 The rising edge of INT1 generate an interrupt request.
1,0 ISC01, ISC00 Interrupt Sense Control 0 Bit. Digunakan untuk memilih jenis pulsa trigger External
Interrupt 0 (INT0).
ISC01 ISC00 Description
0 0 The low level of INT0 generates an interrupt request.
0 1 Any logical change on INT0 generate an interrupt request
1 0 The falling edge of INT0 generate an interrupt request.
1 1 The rising edge of INT0 generate an interrupt request.
7 INT1 External Interrupt Request 1 Enable. Digunakan untuk mengaktifkan INT1 dengan syarat
bit I pada SREG juga diset .
6 INT0 External Interrupt Request 0 Enable. Digunakan untuk mengaktifkan INT0 dengan syarat
bit I pada SREG juga diset .
5 INT1 External Interrupt Request 2 Enable. Digunakan untuk mengaktifkan INT2 dengan syarat
bit I pada SREG juga diset .
4,3,2 - Reserved
1 IVCE Interrupt Vector Change Enable . Digunakan untuk mengaktifkan perubahan interrupt vector .
Interrupt 0
.include "m8535def.inc"
.org 0x0000
rjmp main
.org 0x0001
rjmp ex_int0
ldi r16,0xff
out ddrd,r16
out PortD,r16
ldi r17,0xff
out ddra,r17
out PortA,r17
pop r16
out SREG,r16
pop r16
reti
Untuk menghasilkan waktu timer yang lebih lama dapat digunakan prescaler, misalnya 1024,
maka maksimum waktu timer yang bisa dihasilkan adalah :
TMAX = 1/fCLK x (FFFFh+1) x N
= 0.125uS x 65536 x 1024
= 8.388608 S
Ketika presacaler digunakan, waktu timer dapat diperpanjang namun tingkat ketelitiannya
menjadi turun. Misalnya dengan prescaler 1024 nilai timer akan bertambah 1 setiap kelipatan
1024 pulsa dan membutuhkan waktu 1/fCLK x 1024 = 0.125uS x 1024 = 128 uS bandingkan
tingkat resolusi ini jika tanpa precsaler (0.125uS).
7 6 5 4 3 2 1 0
• TCCR1B
Timer/Counter1 Control Register B digunakan untuk mengatur mode timer, prescaler dan
pilihan lainnya.
Contoh :
Diinginkan sebuah timer 16 bit bekerja selama 1 detik, dengan frekuensi clock sebesar
11,0592MHz dan presecaller 1024 maka diperoleh nilai TCNT sebesar :
1 × 11059200
TCNT = 1 + FFFFh) −
1024
TCNT = 10000h − 10800d
TCNT = 10000h − 2 A30h
TCNT = D5D0h
Dengan demikian nilai TCNTH = D5h dan TCNTL = D0h
.include "m8535def.inc"
.equ timer_value = 0xD5D0
.org 0x0000
rjmp mulai
mulai:
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ulang:
ldi r16,0xff
out ddra,r16
out PortA,r16
rcall timer1d
ldi r16,0x00
out PortA,r16
rcall timer1d
rjmp ulang
timer1d:
ldi r16,0b00000100 ;aktifkan enable interupt
out TIMSK,r16
ldi r16,high(timer_value) ;masukkan nilai timer
out TCNT1H,r16
ldi r16,low(timer_value)
out TCNT1L,r16
ldi r16,0b00000101 ;masukkan prescaler 1024
out TCCR1B,r16
looptimer:
in r17,TIFR
sbrs r17,TOV1 ;tunggu sampai timer1 overflow set
rjmp looptimer
ldi r16,0b00000100 ;TOV1 dinolkan dengan memberi logika 1
out TIFR,r16
ret
Motor stepper adalah sebuah peralatan elektromekanik yang mengubah pulsa elektrik menjadi
pergerakan mekanik. Shaft atau kumparan motor stepper berputar per step ketika pulsa elektrik
dimasukkan ke kumparan tersebut dengan urutan yang benar. Urutan pemberian pulsa ke motor
stepper akan menyebabkan arah putaran yang berbeda. Sedangkan besarnya frekuensi dari
pulsa akan mempengaruhi kecepatan putaran motor stepper.
Motor stepper unipolar baik tipe 5 atau 6 kabel biasanya dihubungkan seperti pada gambar 2.1,
dengan sebuah center tap pada tiap kumparan. Pada penggunaannya, center tap dihubungkan
ke supply positif, dan dua ujung kumparan lainnya dihubungkan ke ground.
Bagian rotor motor pada gambar 2.1 dibuat dari magnet permanent dengan 6 kutub, 3 kutub
utara dan 3 kutub selatan.
Seperti terlihat pada gambar, arus mengalir dari center tap kumparan 1 ke terminal a
menyebabkan kutub stator yang atas menjadi berkutub utara dan kutub stator yang bawah
berkutub selatan. Kondisi ini menyebabkan rotor berada pada posisi seperti gambar 2.1.
Jika arus pada kumparan 1 dimatikan dan kumparan 2 dinyalakan, maka rotor akan berputar 30
derajat, atau 1 step. Untuk berputar secara kontinyu, kita hanya perlu menghubungkan supplay
power ke 2 kumparan secara berurutan.
Dengan asumsi bahwa logika 1 berarti arus mengalir pada kumparan motor, maka berikut adalah
urutan yang harus dipenuhi agar motor dapat berputar sebanyak 24 step atau 2 putaran :
Kumparan 1a 1000100010001000100010001
Kumparan 1b 0010001000100010001000100
Kumparan 2a 0100010001000100010001000
Kumparan 2b 0001000100010001000100010
waktu --->
N
N S
N
S
N N
S
2 2 2 N S N S 2 2 2 2 S N 2
S
N
S S
N
N S
N
S
N
S
S N
1 1 1 1
1 1 1 1
N S
S
S N
N S N
N
S S
N
N
2 2 2 2 2 S N 2
S
2 S 2
N
N
S
N N
S
S
N S S S N
N
S N
1 1 1 1
1 1 1 1
N S
S
S N
N
S
N
S
S
2 2 2 N S 2 2 2 2 S N S N 2
N
S
S
N
N
S N
N
S
N
S N
1 1 1 1
Step Angle / SA
Motor stepper bergerak per step. Setiap bergerak satu step, motor stepper akan berputar
beberapa derajat sesuai dengan step anglenya. Step angle tergantung dari jumlah kutub magnet
motor stepper. Jumlah putaran yang diperlukan agar motor stepper bergerak 1 putaran penuh
(360 0) adalah :
Misalnya, sebuah motor stepper memiliki SA=1,80 maka untuk untuk berputar satu putaran
penuh memerlukan jumlah step sebanyak : 360 / 1,8 = 200 step
+12V
10K
10K
TIP 122
1N4001 1N4001
PA.0 PA.3
1K TIP 122
1K
10K
10K MOTOR STEPPER
TIP 122
1N4001 1N4001
PA.1 PA.2
1K TIP 122
1K
Arah putaran motor stepper ditentukan oleh arah urutan aktifasi kumparannya. Secara program,
ini bisa dilakukan dengan mengubah arah pergeseran bit.
Jika arah pergesarannya ke kiri, maka motor stepper akan berputar kearah kiri pula (CCW)
Jika arah pergeserannya ke kanan, maka motor stepper akan berputar ke arah kanan (CW)
Pada program, jika instruksi ror r19 diganti menjadi rol r19
Maka arah putaran motor stepper akan berubah.
3. Kendali Posisi
Derajat putaran motor stepper ditentukan oleh banyaknya jumlah pergeseran aktifasi
kumparannya. Secara program, ini bisa dilakukan dengan mengubah jumlah pergeseran bit.
Pada motor stepper dengan SA=1,80 , agar motor stepper bergerak 450 maka diperlukan
pergeseran step sebanyak : 45/1,8 =25 step
.include "m8535def.inc"
.org 0x0000
rjmp main
ldi r17,25
Loop: rcall Step
dec r17
cpi r17,0
brne Loop
Stop: nop
rjmp Stop
Step: cpi r19,0x01
brne Shift
out PortA,r19
rcall delay
ldi r19,0x08
ret
Shift: out PortA,r19
rcall delay
ror r19
ret
Jika instruksi ldi r17,25 diganti menjadi ldi r17,50 maka posisi akhir motor stepper
adalah 900
4. Kendali Kecepatan
Kecepatan motor stepper ditentukan oleh kecepatan aktifasi kumparannya. Secara program, ini
bisa dilakukan dengan mengubah delay waktu pergeseran tiap bitnya. Semakin cepat delay
waktunya, kecepatan motor stepper juga akan bertambah.
.include "m8535def.inc"
.org 0x0000
rjmp main
ldi r19,0x08
Step: out PortA,r19
rcall delay
ror r19
cpi r19,0x01
brne Step
out PortA,r19
rcall delay
ldi r19,0x08
rjmp Step
delay: ldi r20,0x20
dl1: ldi r21,0xff
dl2: ldi r22,0xff
dl3: dec r22
cpi r22,0x00
brne dl3
dec r21
cpi r21,0x00
brne dl2
dec r20
cpi r20,0x00
Basic AVR Tutorial by Hendawan Soebhakti Page 32 of 68
Electrical Engineering – Batam Polytechnic
brne dl1
ret
Jika instruksi ldi r20,0x20 menjadi ldi r20,0x02 maka kecepatan motor stepper akan
bertambah.
5. Kendali Torsi
Torsi motor stepper ditentukan oleh banyaknya jumlah kumparan yang aktif pada saat yang
sama. Torsi akan bertambah besar jika 2 kumparan aktif pada saat yang sama.
Secara program, ini bisa dilakukan dengan mengubah kondisi bit.
.include "m8535def.inc"
.org 0x0000
rjmp main
ldi r19,0x4c
Step: out PortA,r19
rcall delay
ror r19
cpi r19,0x09
brne Step
out PortA,r19
rcall delay
ldi r19,0x4c
rjmp Step
VSS VDD VO RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 A K
1 16
2x16 LCD
VSS VCC VEE RS RW E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 A K
+5V
PA.4
PA.6
PA.0
PA.1
PA.2
PA.3
+5V
+5V D1
R1
5K
1N4001
Gambar 9.2 Rangkaian Skematik LCD
Modul display LCD sudah dilengkapi dengan sebuah kontroler yang memiliki dua register 8 bit yaitu instruction register
(IR) dan data register (DR).
IR menyimpan kode instruksi, seperti display clear, cursor shift dan informasi address untuk display data RAM
(DDRAM) dan character generator (CGRAM).
RS R/W Operation
0 0 Menulis instruksi ke IR, seperti display clear, cursor shift
0 1 Membaca busy flag (DB7) dan address counter (DB0 s/d DB7)
1 0 Menulis data ke DDRAM atau CGRAM
1 1 Membaca data dari DDRAM atau CGRAM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
I/D = 1 : Increment C=1 : Cursor ON R/L = 1 : Right Shift F=1 : 5x7 dots
I/D = 0 : Decrement C=0 : Cursor OFF R/L = 0 : Left Shift F=0 : 5x10 dots
D=1 : Display ON S/C = 1 : Display Shift N=1 : 2 Lines ACG : CGRAM Address
D=0 : Display OFF S/C = 0 : Cursor Move N=0 : 1 Line ADD : DDRAM Address
Power On
Tunggu = 4,1 mS
Tunggu = 100 uS
Inisialisasi selesai
Interface 8 bit
Tunggu = 4,1 mS
Tunggu = 100 uS
Inisialisasi selesai
Interface 4 bit
.include "m8535def.inc"
.equ timer_value = 0xffca
.equ timer_value100 = 0xfbaf
.cseg
.org 0x0000
rjmp main
main: ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,0xff
out ddra,r16
rcall InitLCD
Start: ldi r17,0x01
rcall SLcd
Loopx: ldi ZL,low(2*text)
ldi ZH,high(2*text)
rcall WM1LCD
ldi ZL,low(2*text2)
ldi ZH,high(2*text2)
rcall WM2LCD
end: rjmp Loopx
;-----------------------
; Write Message to LCD
;-----------------------
WM1LCD: ldi r17,0x80 ;1st line, 1st col
rcall SLcd
rjmp Wr1
WM2LCD: ldi r17,0xC0
rcall SLcd
Wr1: clr r1
LoopWr1: lpm ;load program memory
mov r19,r0
cpi r19,0
brne NextCHR
ret
NextCHR: rcall WLCD ;write character
adiw ZL,1 ;get next char
rjmp LoopWr1
;-----------------------
; Inisialisasi LCD
;-----------------------
InitLCD: ldi r20,8
LoopDelay: rcall delay5mS
dec r20
cpi r20,0
brne LoopDelay
Contoh :
ldi ZL,low(2*text) ; ZL=00h
ldi ZH,high(2*text) ; ZH=10h
lpm ; r0=”H” (Karakter H)
mov r19,r0 ; r19=”H”
.org 1000h
text: .db "Hello World",0
Setiap arus yang mengalir melalui sebuah konduktor akan menimbulkan medan magnet.
Arah medan magnet dapat ditentukan dengan kaidah tangan kiri. Ibu jari tangan menunjukkan
arah aliran arus listrik sedangkan jari-jari yang lain menunjukkan arah medan magnet yang
timbul, seperti yang ditunjukkan oleh gambar 10.1 berikut ini.
Jika suatu konduktor yang dialiri arus listrik ditempatkan dalam sebuah medan magnet,
kombinasi medan magnet akan ditunjukkan oleh gambar 10.2. Arah aliran arus listrik dalam
konduktor ditunjukkan dengan tanda “x” atau “.”. Tanda “x” menunjukkan arah arus listrik
mengalir menjauhi pembaca gambar, tanda “.” menunjukkan arah arus listrik mengalir
mendekati pembaca gambar.
Pada gambar sebelah kanan, arah medan magnet pada sisi atas yang dihasilkan oleh
konduktor searah dengan arah medan magnet yang dihasilkan oleh magnet permanen.
Sementara pada sisi sebelah bawah, arah medan magnet yang dihasilkan oleh konduktor
berlawanan dengan arah medan magnet yang dihasilkan oleh magnet permanen. Dengan kata
lain, pada sisi sebelah bawah kerapatan fluks magnet lebih sedikit dari pada sisi sebelah atas.
Sebuah gaya dorong akan menyebabkan konduktor bergerak ke sisi sebelah bawah.
Pada sebuah motor dc, konduktor dibentuk menjadi sebuah loop sehingga ada dua
bagian konduktor yang berada didalam medan magnet pada saat yang sama, seperti
diperlihatkan pada gambar 10.3.
Konfigurasi konduktor seperti ini akan menghasilkan distorsi pada medan magnet utama
dan menghasilkan gaya dorong pada masing-masing konduktor. Pada saat konduktor di
tempatkan pada rotor, gaya dorong yang timbul akan menyebabkan rotor berputar searah
dengan jarum jam, seperti diperlihatkan pada gambar 10.3.
Sebuah cara lagi untuk menunjukkan hubungan antara arus listrik yang mengalir didalam
sebuah konduktor, medan magnet dan arah gerak, adalah kaidah tangan kanan untuk motor
seperti yang diperlihatkan pada gambar 10.4.
Kaidah tangan kanan untuk motor menunjukkan arah arus yang mengalir didalam sebuah
konduktor yang berada dalam medan magnet. Jari tengah menunjukkan arah arus yang
mengalir pada konduktor, jari telunjuk menunjukkan arah medan magnet dan ibu jari
menunjukkan arah gaya putar. Adapun besarnya gaya yang bekerja pada konduktor tersebut
dapat dirumuskan dengan :
F = B.L.I (Newton)
Dimana : B = kerapatan fluks magnet (weber)
L = panjang konduktor (meter)
I = arus listrik ( ampere)
Dari gambar 10.6 diatas, agar arah putaran motor dc berubah, maka polaritas tegangan
pada terminal motor harus dibalik.
M1
1 2
1 2
IC2
BIT1 1 6
Anoda NC
MOTOR DC
R7 2 5 +12V
Katoda Kolektor Q3 Q4
680 R3 R4
3 4 1 2 TIP120 TIP120 1 2
NC Emiter 1 2 1 2
10K 10K
4N25
IC3 VCC
1 14
1A Vcc
2 13 BIT0
1B 4A
3 12 BIT1 Q5
1Y 4B R5
4 11 1 2 BC548
2A 4Y 1 2
5 10 1K
2B 3A
6 9
2Y 3B
7 8
G 3Y
74LS00
Input
Aksi Motor
BIT 1 BIT 0
0 0 Berhenti
0 1 Berputar searah jarum jam
1 0 Berputar berlawanan arah jarum jam
1 1 Berhenti
.include "m8535def.inc"
.org 0x0000
rjmp main
main: ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,0xff
out ddra,r16
Run: ldi r19,0b00000010
out PortA,r19
rcall delay
ldi r19,0b00000000
out PortA,r19
rcall delay
ldi r19,0b00000001
out PortA,r19
rcall delay
ldi r19,0b00000011
out PortA,r19
rcall delay
rjmp Run
delay: ldi r20,0x10
dl1: ldi r21,0xff
dl2: ldi r22,0xff
dl3: dec r22
cpi r22,0x00
brne dl3
dec r21
cpi r21,0x00
brne dl2
dec r20
cpi r20,0x00
brne dl1
ret
Pulse Width Modulation (PWM) adalah sebuah cara memanipulasi lebar dari pulsa dalam perioda
yang konstan untuk mendapatkan tegangan rata-rata yang berbeda.
20 %
50%
90 %
Pada gambar 2.8 menunjukkan tiga sinyal PWM yang berbeda. Sinyal yang paling atas
menunjukkan sinyal PWM dengan duty cycle 10%. Artinya sinyal on selama 20% dari perioda
sinyal dan off selama 80 % sisanya. Gambar yang lainnya menunjukkan sinyal dengan duty cycle
50% dan 90%. Ketiga sinyal PWM tersebut akan menghasilkan sinyal analog yang berbeda.
Sebagai contoh jika supply tegangan sebesar 9V dan duty cycle 20%, maka menghasilkan 1,8V.
VS
io
vo
0
t1 T
Gambar 2.9 Pulsa PWM
t1
Vo = VS
T
V0 : Tegangan Output (Volt)
VS : Tegangan Pulsa PWM (Volt)
t1 : Perioda pulsa high (Secon)
T : Periode pulsa (Secon)
.include "m8535def.inc"
.equ timer_value1000 = 0xd4cd
.org 0x0000
rjmp main
main: ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,0xff
out ddra,r16
ldi r16,0x00
out PortA,r16
Loop: sbi PortA,0 ;Output Bit Pulse
rcall Pulse
cbi PortA,0 ;Output Bit Pulse
rcall P_1mS
rjmp Loop
Pulse: ldi r16,0b00000001 ;No prescaling untuk timer1
out TCCR1b,r16
ldi r16,0b00000101 ;Presaling 1024 untuk timer0
out TCCR0,r16
ldi r16,0b00000101 ;Timer0&1 overflow interrupt enable
out TIMSK,r16
ldi r16,high(timer_value1000) ;Nilai timer1
out TCNT1H,r16
ldi r16,low(timer_value1000) ;Nilai timer1
out TCNT1L,r16
ldi r18,$f6 ;Bilangan hex, $f6 = 0xf6
out TCNT0,r18 ;Nilai timer0
P_300uS: in r17,TIFR ;Baca Timer Interrupt Flag Register
sbrs r17,TOV0 ;Tunggu sampai timer0 overflow set
rjmp P_300uS
ldi r16,0b00000001 ;TOV0 dinolkan dg memberi logika 1
out TIFR,r16
ret
P_1mS: in r19,TIFR ;Baca Timer Interrupt Flag Register
sbrs r19,TOV1 ;Tunggu sampai timer1 overflow set
rjmp P_1mS
ldi r16,0b00000100 ;TOV1 dinolkan dg memberi logika 1
out TIFR,r16
ret
CS : Select bit
Motor Servo terdiri dari sebuah motor DC, serangkaian gear, sebuah potensiometer, sebuah
output shaft dan sebuah rangkaian kontrol elektronik.
Biasanya, motor servo berbentuk kotak segi empat dengan sebuah output shaft motor dan
konektor dengan 3 kabel yaitu power, kontrol dan ground. Gear motor servo ada yang terbuat
dari plastic, metal atau titanium. Didalam motor servo terdapat potensiometer yang digunakan
sebagai sensor posisi. Potensiometer tersebut dihubungkan dengan output shaft untuk
mengetahui posisi aktual shaft.
Ketika motor dc berputar, maka output shaft juga berputar dan sekaligus memutar potensiometer.
Rangkaian kontrol kemudian dapat membaca kondisi potensiometer tersebut untuk mengetahui
posisi aktual shaft. Jika posisinya sesuai dengan yang diinginkan, maka motor dc akan berhenti.
Sudut operasi motor servo (Operating Angle) bervariasi tergantung jenis motor servo. Ada 2 jenis
motor servo yaitu :
• Motor Servo Standard
Yaitu motor servo yang mampu bergerak CW dan CCW dengan sudut operasi tertentu,
misalnya 600, 900 atau 1800.
• Motor Servo Continuous
Yaitu motor servo yang mampu bergerak CW dan CCW tanpa batasan sudut operasi
(berputar secara kontinyu).
Motor servo dikendalikan dengan cara mengirimkan sebuah pulsa yang lebar pulsanya
bervariasi. Pulsa tersebut dimasukkan melalui kabel kontrol motor servo. Sudut atau posisi shaft
motor servo akan diturunkan dari lebar pulsa. Biasanya lebar pulsanya antara 1.1 ms sampai 1.9
ms dengan periode pulsa sebesar 20 mS.
Lebar pulsa akan mengakibatkan perubahan posisi pada servo. Misalnya sebuah pulsa 1.5 ms
akan memutar motor pada posisi 900 (posisi netral). Agar posisi servo tetap pada posisi ini, maka
pulsa harus terus diberikan pada servo. Jadi meskipun ada gaya yang melawan, servo akan
tetap bertahan pada posisinya. Gaya maksimum servo tergantung dari rentang torsi servo.
00
900
1800
Ketika sebuah pulsa yang dikirim ke servo kurang dari 1.5 ms, servo akan berputar
counterclockwise menuju ke posisi tertentu dari posisi netral. Jika pulsa yang dikirim lebih dari 1.5
ms, servo akan berputar clockwise menuju ke posisi tertentu dari posisi netral. Setiap servo
memiliki spesifikasi lebar pulsa minimum dan maksimum sendiri-sendiri, tergantung jenis dan
merk servo. Umumnya antara 1.1 ms sampai 1.9 ms.
Parameter lain yang berbeda antara servo satu dengan servo lainnya adalah kecepatan servo
untuk berubah dari posisi satu ke posisi lainnya (Operating Speed).
Detailed Specifications
Untuk mengendalikan motor servo dapat digunakan 2 buah timer pada AVR yaitu :
• Timer 1 digunakan untuk menjaga agar periode pulsa PWM sebesar 20mS
• Timer 0 digunakan untuk menghasilkan lebar pulsa high untuk menentukan posisi servo
Pada contoh program dibawah ini motor servo akan diberi pulsa high selama 1.5mS setiap 20mS
sekali. Posisi motor servo ada di posisi netral / centre.
.include "m8535def.inc"
.equ timer_value20 = 0xf280 ;timer 20mS
.equ timer_value = 0xc0 ;timer 1.5mS
.org 0x0000
rjmp main
main: ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
sbi DDRD,5 ;PortD.5 as output
ldi r16,25
Loop: sbi PortD,5
rcall Pulse
cbi PortD,5
rcall P20mS
dec r16
cpi r16,0
brne Loop
Stop: nop
rjmp Stop
;-----------------------------------------------------------
; Generate pulse 1.5mS Servo position at centre
;-----------------------------------------------------------
Pulse:
ldi r16,0b00000011 ;Prescaling 64 untuk timer1
out TCCR1b,r16
ldi r16,0b00000101 ;Presaling 1024 untuk timer0
out TCCR0,r16
ldi r16,0b00000101 ;Timer0&1 overflow interrupt enable
out TIMSK,r16
ldi r16,high(timer_value20) ;Nilai timer1 = 20mS
out TCNT1H,r16
ldi r16,low(timer_value20) ;Nilai timer1
out TCNT1L,r16
ldi r18,0xf0 ;Bilangan hex, 0xf0 = timer 1.5 mS
out TCNT0,r18 ;Nilai timer0
P_1500uS:
in r17,TIFR ;Baca Timer Interrupt Flag Register
sbrs r17,TOV0 ;Tunggu sampai timer0 overflow set
rjmp P_1500uS
ldi r16,0b00000001 ;TOV0 dinolkan dg memberi logika 1
out TIFR,r16
ret
P20mS:in r19,TIFR ;Baca Timer Interrupt Flag Register
sbrs r19,TOV1 ;Tunggu sampai timer1 overflow set
Basic AVR Tutorial by Hendawan Soebhakti Page 58 of 68
Electrical Engineering – Batam Polytechnic
rjmp P20mS
ldi r16,0b00000100 ;TOV1 dinolkan dg memberi logika 1
out TIFR,r16
ret
Catatan Tambahan :
• Perhitungan Timer
Timer 1 menghasilkan 20 mS :
TCNT=(1+FFFFh)-((Ttimer x fclk)/N)
TCNT=10000h-((0.2 x 11059200)/64)
TCNT=10000h-3456d
TCNT=10000h-0D80h
TCNT=F280h
Dimana :
TCNT : Nilai timer (Hex)
fclk : Frekuensi clock (crystal) yang digunakan (Hz)
Ttimer : Waktu timer yang diinginkan (detik)
N : Prescaler (1, 8, 64, 256, 1024)
Baris1 1 2 3 COR
Baris2 4 5 6 MEN
Baris3 7 8 9
PD.7
PD.6
PD.5
ATmega8535
PD.4
K1 K2 K3 K4
B1
PD.0 1 2 3 COR
B2
PD.1 4 5 6 MEN
B3
PD.2 7 8 9
B4
PD.3 CAN 0 ENT
Langkah 1 :
PD.4 PD.5 PD.6 PD.7
PD.3
1 CAN 0 ENT
Langkah 2 :
PD.4 PD.5 PD.6 PD.7
a. Set kondisi Port D = 11011111
1 0 1 1
b. Baca kondisi Port D :
PD.0
1 1 2 3 COR • Jika PD.0 = 0 maka Tombol 2 ditekan
• Jika PD.1 = 0 maka Tombol 5 ditekan
1
PD.1 4 5 6 MEN • Jika PD.2 = 0 maka Tombol 8 ditekan
1 • Jika PD.3 = 0 maka Tombol 0 ditekan
PD.2 7 8 9
PD.3
1 CAN 0 ENT
Langkah 3 :
PD.4 PD.5 PD.6 PD.7
a. Set kondisi Port D = 10111111
1 1 0 1 b. Baca kondisi Port D :
PD.0
1 1 2 3 COR • Jika PD.0 = 0 maka Tombol 3 ditekan
• Jika PD.1 = 0 maka Tombol 6 ditekan
1
PD.1 4 5 6 MEN • Jika PD.2 = 0 maka Tombol 9 ditekan
• Jika PD.3 = 0 maka Tombol ENT ditekan
PD.2
1 7 8 9
PD.3
1 CAN 0 ENT
Langkah 4 :
PD.4 PD.5 PD.6 PD.7
a. Set kondisi Port D = 01111111
1 1 1 0 b. Baca kondisi Port D :
PD.0
1 1 2 3 COR • Jika PD.0 = 0 maka Tombol COR ditekan
• Jika PD.1 = 0 maka Tombol MEN ditekan
1
PD.1 4 5 6 MEN • Jika PD.2 = 0 maka Tombol UP ditekan
• Jika PD.3 = 0 maka Tombol DOWN ditekan
1 7 8 9
PD.2
• Jika kondisi PD.0 ..PD.3 = 1 maka tidak ada
1 penekanan tombol
PD.3 CAN 0 ENT
.include "m8535def.inc"
.def temp =r22
.def dly =r23
.def dly1 =r24
.def Key =r25
.equ col1 =0b11101111 ;Column 1
.equ col2 =0b11011111 ;Column 2
.equ col3 =0b10111111 ;Column 3
.equ col4 =0b01111111 ;Column 4
.org 0x0000
rjmp main
main: ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,0xff
out ddra,r16 ;PortA as output
ldi r16,0xf0 ;PD[7:4]=output PD[3:0]=input
out ddrd,r16
loopx: rcall check_keys
rjmp loopx
;-------------------------
; Check keypad sub routine
;-------------------------
check_keys:
ldi temp,col1 ;Enable column1
out PORTD,temp
rcall delay
sbic PIND,PD0 ; Pressed key No1 ?
rjmp key4 ; if Not, check next key
ldi key,0x01 ; if yes...
out PortA,key
ret ; key=0x01
UBRR
Digunakan untuk menentukan baud rate USART.
UCSRB
Digunakan untuk mengaktifkan penerimaan dan pengiriman data USART
UCSRC
Digunakan untuk mengatur mode komunikasi USART
URSEL : Jika di set 1 maka register UCSRC bisa diakses, sebab alamat register UCSRC
dan UBRR sama
UCSZ2..UCSZ0 : Menentukan ukuran karakter yang dikirimkan.
Jika UCSZ2..UCSZ0 = 000 maka ukuran karakter 5 bit
Jika UCSZ2..UCSZ0 = 001 maka ukuran karakter 6 bit
Jika UCSZ2..UCSZ0 = 010 maka ukuran karakter 7 bit
Jika UCSZ2..UCSZ0 = 011 maka ukuran karakter 8 bit
Jika UCSZ2..UCSZ0 = 100-110 tidak digunakan
Jika UCSZ2..UCSZ0 = 111 maka ukuran karakter 9 bit
2. Pengiriman Data
Pengiriman data dilakukan per byte menunggu UDR kosong (UDR = register tempat
menyimpan data USART, menjadi satu dengan register UBRR). Jika kosong, maka bit
UDRE(USART Data Register Empty) pada UCSRA akan set 1 sehingga siap menerima
data baru yang akan dikirim.
3. Penerimaan Data
Penerimaan data dilakukan dengan memeriksa bit RXC (USART Receive Complete)
pada register UCSRA. RXC akan set 1 jika ada data yang siap dibaca. Data yang
diterima akan disimpan pada register UDR.
.include"m8535def.inc"
.org 0x0000
rjmp main
main: ldi temp,low(ramend)
out spl,temp
ldi temp,high(ramend)
out sph,temp
rcall init_usart
loop: ldi zl,low(2*msg)
ldi zh,high(2*msg)
load: lpm
mov txbyte,r0
cpi txbyte,0
breq done
rcall usart_tx
inc zl
rjmp load
done: rjmp done
init_usart:
ldi temp,high(ubbr_value)
out UBRRH,temp
ldi temp,low(ubbr_value)
out UBRRL,temp
ldi temp,(1<<RXEN)|(1<<TXEN)|(1<<RXCIE)
out UCSRB,temp
ldi temp,(1<<URSEL)|(3<<UCSZ0)
out UCSRC,temp
ret
usart_tx:
sbis UCSRA,UDRE
rjmp usart_tx
out UDR,txbyte
ret
usart_rx:
sbis UCSRA,RXC
rjmp usart_rx
in rxbyte,UDR
ret
msg:
.db "******Welcome To Politeknik Batam******",13,10,0
Keterangan : angka 13,10 adalah kode ASCII untuk Enter. Jadi pesan akan ditampilkan pada
baris baru di editor Hyper Terminal. Angka 0 menunjukkan akhir karakter dari pesan yang dikirim.