Basic AVR Microcontroller Tutorial (1)

Oleh :

Hendawan Soebhakti, ST

Agustus 2007

Parkway Street, Batam Centre Batam 29461 Telp. 62-778 469856 – 469861 Fax. 62-778 463620

http://www.polibatam.ac.id

DAFTAR ISI

1. AVR ATMega 8535L

2. Operasi Aritmatika, Logika dan Percabangan

3. Interupsi

4. Timer/Counter

5. Pengendalian Motor Stepper

6. LCD 16x2

7. PWM dan Pengendalian Motor DC

8. Motor Servo

9. Keypad

10. Komunikasi Serial USART

BAB I

AVR ATMega 8535L

1.1 Sekilas Tentang AVR

AVR : Alf and Vegard RISC atau AVR : Advanced Virtual RISC RISC: Reduced Instruction Set Computer

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.

1.2 Karakteristik mikrokontroler AVR seri ATMega8535

1.2.1 Fitur ATMega8535 Fitur yang tersedia pada ATMega 8535 adalah :

• Frekuensi clock maksimum 16 MHz • Jalur I/O 32 buah, yang terbagi dalam PortA, PortB, PortC dan PortD • Analog to Digital Converter 10 bit sebanyak 8 input • Timer/Counter sebanyak 3 buah • CPU 8 bit yang terdiri dari 32 register • Watchdog Timer dengan osilator internal • SRAM sebesar 512 byte • Memori Flash sebesar 8 Kbyte dengan kemampuan read while write • Interrupt internal maupun eksternal • Port komunikasi SPI • EEPROM sebesar 512 byte yang dapat diprogram saat operasi • Analog Comparator • Komunikasi serial standar USART dengan kecepatan maksimal 2,5 Mbps

1.2.2 Konfigurasi Pin ATMega8535

Gambar 1.1 Konfigurasi Pin ATMega8535

1.2.3 Peta Memori ATMega8535 ATMega8535 memiliki dua jenis memori yaitu Data Memory dan Program Memory ditambah satu fitur tambahan yaitu EEPROM Memory untuk penyimpan data.

• Program Memory ATMega8535 memiliki On-Chip In-System Reprogrammable Flash Memory untuk menyimpan program. Untuk

alasan keamanan, program memory dibagi menjadi dua bagian yaitu Boot Flash Section dan Application Flash Section. Boot Flash Section digunakan untuk menyimpan program Boot Loader, yaitu program yang harus dijalankan pada saat AVR reset atau pertamakali diaktifkan. Application Flash Section digunakan untuk menyimpan program aplikasi yang dibuat user. AVR tidak dapat menjalankan program aplikasi ini sebelum menjalankan program Boot Loader. Besarnya memori Boot Flash Section dapat diprogram dari 128 word sampai 1024 word tergantung setting pada konfigurasi bit di register BOOTSZ. Jika Boot Loader diproteksi, maka program pada Application Flash Section juga sudah aman.

Gambar 1.2 Peta Program Memory

• Data Memory Gambar berikut menunjukkan peta memori SRAM pada ATMega8535. Terdapat 608 lokasi address data memori.

96 lokasi address digunakan untuk Register File dan I/O Memory sementara 512 lokasi address lainnya digunakan untuk internal data SRAM. Register File terdiri dari 32 general purpose working register, I/O register terdiri dari 64 register.

Gambar 1.3 Peta Data Memory

• EEPROM Data Memory ATMega8535 memiliki EEPROM sebesar 512 byte untuk menyimpan data. Lokasinya terpisah dengan sistem

address register, data register dan control register yang dibuat khusus untuk EEPROM.

1.3 Status Register (SREG)

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.

Bit 7 – I : Global Interrupt Enable Jika bit Global Interrupt Enable diset, maka fasilitas interupsi dapat dijalankan. Bit ini akan clear ketika ada interrupt yang dipicu dari hardware, setelah program interrupt dieksekusi, maka bit ini harus di set kembali dengan instruksi SEI.

Bit 6 – T : Bit Copy Storage Instruksi bit copy BLD dan BST menggunakan bit T sebagai sumber atau tujuan dalam operasi bit.

Bit 5 – H : Half Carry Flag

Bit 4 – S : Sign Bit Bit S merupakan hasil exlusive or dari Negative Flag N dan Two’s Complement Overflow Flag V.

Bit 3 – V : Two’s Complement Overflow Flag Digunakan dalam operasi aritmatika

Bit 2 – N : Negative Flag Jika operasi aritmatika menghasilkan bilangan negatif, maka bit ini akan set.

Bit 1 – Z : Zero Flag Jika operasi aritmatika menghaslkan bilangan nol, maka bit ini akan set.

1.4 Bahasa Assembly AVR

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

main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16

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.

; low byte address RAM = 5F out SPL,r16 ldi

main: ldi

r16,low(RAMEND)

; high byte address RAM = 02 out SPH,r16

r16,high(RAMEND)

BAB II

Operasi Port Input Output

2.1 Register I/O

Setiap port ATMega8535 terdiri dari 3 register I/O yaitu DDRx, Portx dan PINx.

• DDRx (Data Direction Register) Register DDRx digunakan untuk memilih arah pin. Jika DDRx = 1 maka Pxn sebagai pin output Jika DDRx = 0

maka Pxn sebagai input.

• Portx (Port Data Register)

Register Portx digunakan untuk 2 keperluan yaitu untuk jalur output atau untuk mengaktifkan resistor pullup.

1. Portx berfungsi sebagai output jika DDRx = 1 maka : Portxn = 1 maka pin Pxn akan berlogika high. Portxn = 0 maka pin Pxn akan berlogika low.

2. Portx berfungsi untuk mengaktifkan resistor pullup jika DDRx = 0 maka : Portxn = 1 maka pin Pxn sebagai pin input dengan resistor pull up. Portxn = 0 maka pin Pxn sebagai output tanpa resistor pull up.

Tabel 2.1 Konfigurasi Port

DDRxn Portxn I/O Pull up Comment

0 0 Input

No

Tri state (Hi-Z)

0 1 Input

Yes

Pull up aktif

10 Output No Output Low

11 Output No Output High

Catatan : x menunjukkan nama port (A,B,C,D) n menunjukkan nomor bit (0,1,2,3,4,5,6,7) Nilai awal (initial value) seluruh register I/O adalah 00h.

• PINx (Port Input Pin Address) Digunakan sebagai register input.

2.2 Instruksi I/O

in : membaca data I/O port ke dalam register contoh : in

r16,PinA

out : menulis data register ke I/O port contoh : out PortA,r16 ldi

: (load immediate) : menulis konstanta ke register sebelum konstanta tersebut dikeluarkan ke I/O port

contoh : ldi r16,0xff sbi

: (set bit in I/O) : membuat logika high pada sebuah bit I/O port contoh : sbi PortB,7 cbi

: (clear bit in I/O) : membuat logika low pada sebuah bit I/O port contoh : cbi PortB,5 sbic : (skip if bit in I/O is clear) : lompati satu instruksi jika bit I/O port dalam kondisi clear/low contoh : sbic PortA,3 sbis : (skip if bit in I/O is set) : lompati satu instruksi jika bit I/O port dalam kondisi set/high contoh : sbis PortB,3

Contoh Program 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,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.

Jawaban Latihan no 3:

.include "m8535def.inc" .org 0x00

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

BAB III

Operasi Aritmatika

3.1 Operasi Aritmatika

Instruksi Aritmatika add : Menambahkan isi dua register.

Contoh : add r15,r14

; r15=r15+r14

adc : Menambahkan isi dua register dan isi carry flag Contoh : adc r15,r14

; r15=r15+r14+C

sub : Mengurangi isi dua register. Contoh : sub r19,r14

; r19=r19-r14

mul : Mengalikan dua register. Perkalian 8 bit dengan 8 bit menghasilkan bilangan 16 bit yang disimpan di r0 untuk byte rendah dan di r1 untuk byte tinggi. Untuk memindahkan bilangan 16 bit antar register digunakan instruksi movw (copy register word)

Contoh : mul r21,r20

; r1:r0=r21*r20

3.2 Contoh Program

• Penjumlahan .include "m8535def.inc"

.org 0x00 rjmp main main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16

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

• Perkalian .include "m8535def.inc"

.org 0x00 rjmp main

main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16

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

;dividend/yang dibagi .def

;divisor/pembagi

.def dcnt8u =r18 ;loop counter

rjmp main

main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16

ldi dd8u,4 ldi dv8u,2 rcall div8u

here: rjmp here ; div8u:

sub

;clear remainder and carry ldi

drem8u,drem8u

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

;shift dividend into remainder sub

drem8u

remainder = remainder - divisor brcc d8u_3 ;if result negative add drem8u,dv8u ;restore remainder clc

drem8u,dv8u

;clear carry to be shifted into result rjmp d8u_1 ;else d8u_3:

sec ;set carry to be shifted into result rjmp d8u_1

Latihan : Buatlah program untuk menyelesaikan persamaan matematika berikut ini :

1. r21=r22+5

2. r21=r22-5

3. r16:r17=r21*5

4. r16:r17=(r21+5)*(r22-5)

BAB IV

Operasi Logika

4.1 Operasi Logika

Instruksi Logika and : Untuk meng-and-kan dua register

Contoh : and r23,r27

; r23=r23 and r27

andi : Untuk meng-and-kan register dengan konstanta immediate Contoh : andi r25,0b11110000 or : Untuk meng-or-kan dua register Contoh : or r18,r17

; r18=r18 or r17

ori : Untuk meng-or-kan register dengan konstanta immediate Contoh : ori r15,0xfe

inc : Untuk menaikkan satu isi sebuah register Contoh : inc r14 dec : Untuk menurunkan satu isi sebuah register Contoh : dec r15 clr : Untuk mengosongkan (membuat jadi nol) isi register Contoh : clr r15

; r15=0x00

ser : Set all bit in register. Membuat jadi satu isi register Contoh : ser r16

; r16=0xff

4.2 Contoh Program

• Operasi Logika

.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

Latihan :

1. Buatlah program untuk memecahkan persoalan berikut :

2. Buatlah program dengan ketentuan sbb :

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

main: ldi r16,low(RAMEND)

out

SPL,r16

ldi

r16,high(RAMEND)

out

SPH,r16

mulai: sbic

; skip if PortA,1 = 0 rjmp cek10_11 rjmp cek00_01

PortA,1

cek10_11: ; PortA,1=1 sbic PortA,0 ; PortA,1=1, PortA,0=0 (10) rjmp setAll ;

ulang: ldi

rjmp ulang

setAll: ser

rjmp mulai ; cek00_01: ; PortA,1=0

sbis PortA,0 ; skip if PortA,0=1 rjmp clearAll sbis PortA,0 ; skip if PortA,0=1 rjmp clearAll

rjmp ulang2

clearAll: clr

rjmp mulai

BAB V

Percabangan

5.1 Operasi Percabangan

Instruksi Percabangan sbic (skip if bit in I/O is cleared) : Skip jika bit I/O yang diuji clear sbis (skip if bit in I/O is set)

: Skip jika bit I/O yang diuji set sbrc (skip if bit in register is clear) : Skip jika bit dalam register yang diuji clear cp (compare) : Membandingkan isi dua register mov (move) : Meng-copy isi dua register cpi (compare with immediate) : Membandingakan isi register dengan konstanta tertentu. breq (branch if equal) : Lompat ke label tertentu jika suatu hasil perbandingan adalah sama. brne (branch if not equal) : Lompat ke label tertentu jika suatu hasil perbandingan adalah tidak sama. rjmp (relative jump) : Lompat ke label tertentu. rcall (relative call) : Memanggil subrutin. ret (return) : Keluar dari sub rutin.

5.2 Contoh Program

• Operasi Percabangan

.include "m8535def.inc" .org 0x00 rjmp main

main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 clr r16

; r16=0x00

naik: inc r16

; increment r16

breq lagi ; branch to lagi if r16 = 5 rjmp naik

; jump to naik if r16 ≠5

lagi: ldi

; decrement r16

cp

r16,r18

; compare r16 & r18

brne lompat ; branch to lompat if r16=r18 rjmp lagi

; jump to lagi if r16 ≠r18

lompat: rcall rutin1 rcall rutin2

henti: rjmp henti

rutin1: mov r17,r16 ret rutin2: mov r19,r18 ret

Latihan : Buatlah program delay dari flowchart berikut ini :

Mulai

Isi r17 dengan 0x05

Isi r16 dengan 0x0A

Kurangi 1 isi r16

Tdk

r16=0?

Ya Kurangi 1 isi r17

Tdk

r17=0?

Ya Selesai

BAB VI

Interupsi

Interupsi adalah kondisi yang memaksa mikrokontroler menghentikan sementara eksekusi program utama untuk mengeksekusi rutin interrupt tertentu / Interrupt Service Routine (ISR)

Setelah melaksanakan ISR secara lengkap, maka mikrokontroler akan kembali melanjutkan eksekusi program utama yang tadi ditinggalkan.

Time

Main Program

(a). Program execution without interrupts

(b). Program execution with interrupts

Pada Atmega 8535 terdapat 21 sumber interupsi yaitu :

Tabel 6.1 Interrupt Vector pada ATmega 8535 Vector

Program Source Interrupt Definition No

Address

1 0x0000 RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset

2 0x0001 INT0

External Interrupt Request 0

3 0x0002 INT1

External Interrupt Request 1

4 0x0003 TIMER2 COMP

Timer/Counter2 Compare Match

5 0x0004 TIMER2 OVF

Timer/Counter2 Overflow

6 0x0005 TIMER1 CAPT

Timer/Counter1 Capture Event

7 0x0006 TIMER1 COMPA

Timer/Counter1 Compare Match A

8 0x0007 TIMER1 COMPB

Timer/Counter1 Compare Match B

9 0x0008 TIMER1 OVF

Timer/Counter1 Overflow

10 0x0009 TIMER0 OVF

Timer/Counter0 Overflow

11 0x000A SPI, STC

Serial Transfer Complete

12 0x000B USART, RXC

USART, Rx Complete

13 0x000C USART, UDRE

USART Data Register Empty

14 0x000D USART, TXC

USART, Tx Complete

15 0x000E ADC

ADC Conversion Complete

16 0x000F EE_RDY

EEPROM Ready

17 0x0010 ANA_COMP Analog Comparator

18 0x0011 TWI

Two-wire Serial Interface

19 0x0012 INT2

External Interrupt Request 2

20 0x0013 TIMER0 COMP

Timer/Counter0 Compare Match

21 0x0014 SPM_RDY

Store Program Memory Ready

ISC01 ISC00

MCUCR / MCU Control Register

Bit Symbol

Fuction

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 .

INT1 INT0

INT2

IVSEL IVCE

GICR / General Interrupt Control Register

Bit Symbol

Fuction

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 .

Interrupt Vector Select. Jika IVSEL = 0 maka interrupt vector ditempatkan pada start address flash memory Jika IVSEL = 1 maka interrupt vector ditempatkan pada awal bootloader dalam flash memory.

1 IVCE Interrupt Vector Change Enable . Digunakan untuk mengaktifkan perubahan interrupt vector .

Contoh Program :

Interrupt 0

.include "m8535def.inc" .org 0x0000 rjmp main .org 0x0001 rjmp ex_int0

main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16

ldi r16,0xff out ddrd,r16 out PortD,r16

set_int: ldi

r17,0b01000000 out GICR,r17 ldi r17,0b00000000 out MCUCR,r17 sei

loop: rjmp loop ex_int0: push r16

in r16,SREG push r16

ldi r17,0xff out ddra,r17 out PortA,r17 pop r16 out SREG,r16 pop r16 reti

BAB VII

Timer/Counter

1. Prescaler

Timer pada dasarnya hanya menghitung pulsa clock. Frekuensi pulsa clock yang dihitung tersebut bisa sama dengan frekuensi crystal yang dipasang atau dapat diperlambat menggunakan prescaler dengan faktor 8, 64, 256 atau 1024. Berikut penjelasannya : Sebuah AVR menggunakan crystal dengan frekuensi 8 MHz dan timer yang digunakan adalah timer 16 bit, maka maksimum waktu timer yang bisa dihasilkan adalah :

TMAX

= 1/fCLK x (FFFFh+1) = 0.125uS x 65536 = 0.008192 S

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

2. Timer 16 Bit Normal Mode

Pada mode normal, TCNT1 akan menghitung naik dan membangkitkan interrupt Timer/Counter 1 ketika nilainya berubah dari 0xFFFF ke 0x0000. Seringkali kita menganggap untuk menggunakan timer cukup dengan memasukkan nilai yang diinginkan ke TCNT1 dan menunggu sampai terjadi interrupt. Ini menjadi benar pada timer yang menghitung mundur, tetapi untuk timer yang menghitung maju, maka anda harus memasukkan nilai 65536-(timer value) ke dalam TCNT1.

Gambar 7.1 Blok Diagram Timer 16 Bit

3. Register Timer 16 Bit

• TCNT1 Timer/Counter1 Register digunakan untuk menyimpan nilai timer yang diinginkan. TCNT1

dibagi menjadi 2 register 8 bit yaitu TCNT1H dan TCNT1L.

• TIMSK & TIFR Timer Interrupt Mask Register (TIMSK) dan Timer Interrupt Flag (TIFR) Register digunakan

untuk mengendalikan interrupt mana yang diaktifkan dengan cara melakukan setting pada TIMSK dan untuk mengetahui interrupt mana yang sedang terjadi.

OCIE2 TOIE2

TICIE1

OCIE1A OCIE1B

TOIE1

OCIE0 TOIE0

TIMSK / Timer/Counter Interrupt Mask Register

Bit Symbol

Fuction

7 OCIE2

Timer/Counter2 Output Compare Match Interrupt Enable .

6 TOIE2

Timer/Counter2 Overflow Interrupt Enable.

5 TICIE1

Timer1 Input Capture Interrupt Enable

4 OCIE1A

Timer/Counter1A Output Compare Match Interrupt Enable .

3 OCIE1B

Timer/Counter1B Output Compare Match Interrupt Enable .

2 TOIE1

Timer/Counter1 Overflow Interrupt Enable.

4 OCIE0

Timer/Counter0 Output Compare Match Interrupt Enable .

0 TOIE0

Timer/Counter0 Overflow Interrupt Enable.

OCF2 TOV2

ICF1

OCF1A

OCF1B

TOV1

OCF0 TOV0

TIFR / Timer/Counter Interrupt Flag Register

Bit Symbol

Fuction

7 OCF2

Output Compare Flag2.

6 TOV2

Timer/Counter2 Overflow Flag.

5 ICF1

Timer1 Input Capture Interrupt Flag

4 OCF1A

Output Compare Flag1A.

3 OCF1B

Output Compare Flag1B.

2 TOV1

Timer/Counter1 Overflow Flag.

4 OCF0

Output Compare Flag0.

0 TOV0

Timer/Counter0 Overflow Flag.

• TCCR1B Timer/Counter1 Control Register B digunakan untuk mengatur mode timer, prescaler dan

pilihan lainnya.

CS12..10: Clock Select bits ;

Tiga bit pemilih prescaler timer/counter 1 dan hubungannya dengan clock eksternal pada pin T1.

4. Perhitungan Waktu Timer

T timer × f CLK

TCNT = (1 + FFFF h) − (

Dimana : TCNT

: Nilai timer (Hex)

f CLK : Frekuensi clock (crystal) yang digunakan (Hz) T timer : Waktu timer yang diinginkan (detik)

N : Prescaler (1, 8, 64, 256, 1024) 1+FFFFh

: Nilai max timer adalah FFFFh dan overflow saat FFFFh ke 0000h

Contoh :

Diinginkan sebuah timer 16 bit bekerja selama 1 detik, dengan frekuensi clock sebesar 11,0592MHz dan presecaller 1024 maka diperoleh nilai TCNT sebesar :

 TCNT 1 FFFFh ) × 1 11059200  =  + −  

TCNT = 10000 h − 10800 d TCNT = 10000 h − 2 A 30 h TCNT = D 5 D 0 h

Dengan demikian nilai TCNTH = D5h dan TCNTL = D0h

5. Maksimum Waktu Timer

Timer 16 bit AVR8535 dapat menghasilkan waktu tunda maksimum sebesar 6,068055555 detik pada frekuensi 11,0592MHz

TCNT = (1 + FFFFh) − FFFFh = ( 10000 h) − (FFFFh)

= 0001 h

Dengan nilai maksimum FFFFh maka akan dihasilkan waktu timer selama : T timer × 11059200

FFFFh = (

1024 65535 = (T timer × 10800 )

T timer = 6 , 0680555555 detik

7. Mengaktifkan Timer

Setelah tahu nilai yang harus dituliskan ke TCNT1 maka anda harus mengaktifkan bit interrupt terkait dan global interrupt enable. Berikut adalah flowchart apa yang terjadi pada timer :

Langkah yang perlu dilakukan adalah : • Aktifkan TOIE1 pada TIMSK

• Masukkan nilai timer ke TCNT1 misalnya : D5D0h • Set prescaler pada 1024 ( set bit CS12 dan CS10 pada TCCR1B) • Aktifkan bit global interrupt pada SREG • Tunggu. Atau lakukan hal yang lain. Semua perhitungan dan pengecekan flag dilakukan

oleh hardware.

Contoh Program :

.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

BAB VIII

Pengendalian Motor Stepper

1. Dasar Motor Stepper

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

Gambar 2.1 Motor Stepper Unipolar

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

Gambar 2.2 Bergeraknya Motor Stepper

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 :

Step = 360 0 / Step Angle

Misalnya, sebuah motor stepper memiliki SA=1,80 maka untuk untuk berputar satu putaran penuh memerlukan jumlah step sebanyak : 360 / 1,8 = 200 step

Skema Rangkaian Driver Motor Stepper

+12V 10K

10K

TIP 122 PA.0

PA.3 1K

MOTOR STEPPER

TIP 122 PA.1

PA.2 1K

Gambar 2.3 Skema Rangkaian Driver Motor Stepper

2. Kendali Arah Putaran

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)

Arah Putaran CW Arah Putaran CCW

.include "m8535def.inc" .include "m8535def.inc" .org 0x0000

.org 0x0000 rjmp main

rjmp main

main: ldi r16,low(RAMEND) main: ldi r16,low(RAMEND) out SPL,r16

out SPL,r16 ldi r16,high(RAMEND)

ldi r16,high(RAMEND) out SPH,r16

out SPH,r16 ldi r16,0xff

ldi r16,0xff out ddra,r16

out ddra,r16

ldi r19,0x08 ldi r19,0x01

Step: out PortA,r19 Step: out PortA,r19 rcall delay

rcall delay

ror r19 rol r19 cpi r19,0x01

cpi r19,0x08

brne Step brne Step out PortA,r19

out PortA,r19 rcall delay

rcall delay

ldi r19,0x08 ldi r19,0x01

rjmp Step rjmp Step rjmp Step rjmp Step

dl1: ldi r21,0xff dl2: ldi r22,0xff

dl2: ldi r22,0xff dl3: dec r22

dl3: dec r22 cpi r22,0x00

cpi r22,0x00 brne dl3

brne dl3 dec r21

dec r21 cpi r21,0x00

cpi r21,0x00 brne dl2

brne dl2 dec r20

dec r20 cpi r20,0x00

cpi r20,0x00 brne dl1

brne dl1 ret

ret

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.

0 Pada motor stepper dengan SA=1,8 0 , agar motor stepper bergerak 45 maka diperlukan pergeseran step sebanyak : 45/1,8 =25 step

.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 ldi r19,0x08

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 Shift: out PortA,r19 rcall delay ror r19 ret

cpi r22,0x00 brne dl3 dec r21 cpi r21,0x00 brne dl2 dec r20 cpi r20,0x00 brne dl1 ret

Jika instruksi ldi r17,25 diganti menjadi ldi r17,50 maka posisi akhir motor stepper adalah 90 0

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

main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16,0xff out ddra,r16

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 cpi r22,0x00 brne dl3 dec r21 cpi r21,0x00 brne dl2 dec r20 cpi r20,0x00

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

main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16,0xff out ddra,r16

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

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 brne dl1 ret

Jika instruksi ldi r19,0x4c

cpi r19,0x09

diubah menjadi

ldi r19,0x08 cpi r19,0x01

maka torsi motor stepper akan turun menjadi setengahnya.

BAB IX

Liquid Crystal Display

1. Konfigurasi Pin LCD 16x2 LIQUID CRYSTAL DISPLAY

16 CHARACTER X 2 LINES

VSS VDD VO RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 A K 1

Gambar 9.1 Konfigurasi Pin LCD 16 Karakter x 2 Baris

0V Ground

2 VDD

5V Supply voltage for logic

3 VO

(Variable)

Operating voltage for LCD

4 RS

H/L

H : Data, L : Instruction code

5 R/W

H/L

H : Read, L : Write

6 E H, H->L

Chip Enable signal

7 DB0

H/L

Data bit 0

8 DB1

H/L

Data bit 1

9 DB2

H/L

Data bit 2

10 DB3

H/L

Data bit 3

11 DB4

H/L

Data bit 4

12 DB5

H/L

Data bit 5

13 DB6

H/L

Data bit 6

14 DB7

H/L

Data bit 7

15 A 4,2 – 4,6 V

LED +

16 K

0V LED -

2. Rangkaian Skematik Mikrokontroler dan LCD 16x2

2x16 LCD

Gambar 9.2 Rangkaian Skematik LCD

3. Fungsi Register 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

Busy Flag (BF) Busy flag = 1 saat kontroler sedang mengerjakan instruksi, selama instruksi tersebut belum selesai dikerjakan, kontroler tidak akan menerima instruksi apapun. Ketika RS=0 dan R/W=1, busy flag mengeluarkan logika 1 pada DB7. Instruksi berikutnya akan siap diterima ketika busy flag = 0.

Address Counter (AC) Address counter berisi address DDRAM dan CGRAM.

Display Data RAM (DDRAM) DDRAM menyimpan data display dalam bentuk kode karakter 8 bit. Kapasitasnya adalah 80 karakter. Berikut adalah posisi address DDRAM pada LCD 16x2 :

Character Generator ROM (CGROM) CGROM akan menghasilkan karakter dengan format 5x8 dot atau 5x10 dot. Lihat tabel Format Karakter CGROM

Character Generator RAM (CGRAM) Dengan CGRAM, user dapat membuat sendiri format karakter yang diinginkan. Untuk format 5x8 dot bisa dibuat 8 karakter, untuk format 5x10 dapat dibuat 4 karakter. Lihat tabel

4. Hubungan CGRAM Address, DDRAM dan Pola Karakter

5. Pola Karakter CGROM

6. Tabel Instruksi

Instruksi

Kode Instruksi

Deskripsi

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

Clear display 0000000001 Menghapus semua tampilan pada display Set DDRAM address ke ‘00h’ dan

Return home 000000001* kembalikan cursor ke posisi awal. Isi DDRAM tidak berubah Menentukan auto increment /

Entry mode set 0 0 0 0 0 0 0 1 I/D S decrement DDRAM address karakter atau cursor berikutnya yang akan ditulis ke display.

Display ON/OFF control

0000001DCB Set display (D), cursor (C), dan cursor blinking (B) ON/OFF Menentukan pergeseran display atau

Cursor or Display shift

0 0 0 0 0 1 S/C

R/L

cursor serta menentukan arah pergeseran display Menentukan panjang data interface

Function set

0 0 0 0 1 DL

(DL: 8 atau 4 bit), jumlah baris (N: 1 atau 2 baris) dan tipe font (F: 5x10 atau 5x7 dot)

Set CGRAM address

Set CGRAM address Set DDRAM address

0 0 0 1 ACG

Set DDRAM address Read Busy Flag and

0 0 1 ADD

Mengetahui apakah LCD sedang address

0 1 BF

AC mengerjakan instruksi atau tidak. Isi address counter juga dapat dibaca

Write data to RAM 1 0 D7 D6 D5 D4 D3 D2 D1 D0 Menulis data ke internal RAM (DDRAM/CGRAM) Read data from RAM

1 1 D7 D6 D5 D4 D3 D2 D1 D0 Membaca data dari internal RAM (DDRAM/CGRAM)

F=1 : 5x7 dots I/D = 0

I/D = 1 : Increment

C=1

: Cursor ON

R/L = 1

: Right Shift

: Decrement

C=0

: Cursor OFF

R/L = 0

: Left Shift

F=0 : 5x10 dots

S=1 : DisplayShift

BF = 1 : Busy S=0

B=1

: Blink ON

DL = 1

: 8 bits

: No Display Shift

B=0

: Blink OFF

DL = 0

: 4 bits

BF = 0 : Can Accept Data

D=1 : Display ON

ACG : CGRAM Address D=0

S/C = 1

: Display Shift

N=1

: 2 Lines

: Display OFF

S/C = 0

: Cursor Move

N=0

: 1 Line

ADD : DDRAM Address

7. Inisialisasi LCD

Power On

Tunggu = 15 mS setelah VCC naik sampai 4,5V

BF belum bisa dicek sebelum instruksi ini RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

0 0 0 0 1 1 * * * * Function Set (Interface 8 bit)

Tunggu = 4,1 mS

BF belum bisa dicek sebelum instruksi ini RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

0 0 0 0 1 1 * * * * Function Set (Interface 8 bit)

Tunggu = 100 uS

BF belum bisa dicek sebelum instruksi ini RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

0 0 0 0 1 1 * * * * Function Set (Interface 8 bit)

BF bisa dicek setelah instruksi-instruksi berikut. Jika BF tidak dicek, tundaan waktu tiap instruksi harus lebih lama dari waktu eksekusi instruksi.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 N F * *

Function Set (Interface 8 bit) 0 0 0 0 0 0 1 0 0 0

Display OFF

Display Clear

0 0 0 0 0 0 0 1 I/ D S

Entry Mode Set

Inisialisasi selesai

Interface 8 bit

Power On

Tunggu = 15 mS setelah VCC naik sampai 4,5V

BF belum bisa dicek sebelum instruksi ini RS R/W DB7 DB6 DB5 DB4

Function Set (Interface 8 bit)

Tunggu = 4,1 mS

BF belum bisa dicek sebelum instruksi ini RS R/W DB7 DB6 DB5 DB4

Function Set (Interface 8 bit)

Tunggu = 100 uS

BF belum bisa dicek sebelum instruksi ini RS R/W DB7 DB6 DB5 DB4

Function Set (Interface 8 bit)

BF bisa dicek setelah instruksi-instruksi berikut. Jika BF tidak dicek, tundaan waktu tiap instruksi harus lebih lama dari waktu eksekusi instruksi.

RS R/W DB7 DB6 DB5 DB4

Function Set (Interface 4 bit)

Function Set (Interface 4 bit)

Display OFF

Display Clear

0 0 0 0 0 0 0 0 0 0 I/D S

Entry Mode Set

Inisialisasi selesai

Interface 4 bit

8. Contoh Program

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

;1st line, 1st col rcall SLcd rjmp Wr1

ldi

r17,0x80

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

ldi r17,0x03 ;Function set out PortA,r17 sbi PortA,6 ;E=1 cbi PortA,6 ;E=0 rcall delay5mS ldi r17,0x03 ;Function set out PortA,r17 sbi PortA,6 ;E=1 cbi PortA,6 ;E=0 rcall delay5mS

ldi r17,0x02 ;Function set:4 bit operation out PortA,r17 sbi PortA,6 ;E=1

; rcall delay100uS cbi PortA,6 ;E=0

ldi r17,0x28 ;Function set:4 bit op;2lines rcall SLcd ldi r17,0x08 ;Turn Off LCD rcall SLcd ldi r17,0x0C ;Turn On LCD rcall SLcd ldi r17,0x01 ;Clear Display rcall SLcd ldi r17,0x06 ;Entry mode set; Inc addr rcall SLcd ret

;----------------------- ; Rutin kirim instruksi ;----------------------- SLcd: mov r18,r17

andi r18,$F0 ;Get high nibble swap r18 out PortA,r18 sbi PortA,6 ;E=1 cbi PortA,6 ;E=0

; mov r18,r17 andi r18,$0F ;Get low nibble out PortA,r18 sbi PortA,6 ;E=1 cbi PortA,6 ;E=0 rcall delay100uS ret

;----------------------- ; Rutin kirim karakter ;----------------------- WLcd: mov r18,r19

andi r18,$F0 ;Get high nibble swap r18 out PortA,r18 sbi PortA,4 ;RS=1 sbi PortA,6 ;E=1 cbi PortA,6 ;E=0

; mov r18,r19 andi r18,$0F ;Get low nibble out PortA,r18 ; mov r18,r19 andi r18,$0F ;Get low nibble out PortA,r18

;----------------------- ; Rutin delay 5ms ;----------------------- delay5ms: ldi

r16,0b00000100

out TIMSK,r16 ldi r16,high(timer_value) out TCNT1H,r16 ldi r16,low(timer_value) out TCNT1L,r16 ldi r16,0b00000101 out TCCR1B,r16

loop: in r21,TIFR sbrs r21,TOV1 rjmp loop ldi r16,0b00000100 out TIFR,r16 ret

;----------------------- ; Rutin delay 100uS ;----------------------- delay100us: ldi

r16,0b00000100

out TIMSK,r16 ldi r16,high(timer_value100) out TCNT1H,r16 ldi r16,low(timer_value100) out TCNT1L,r16 ldi r16,0b00000001 out TCCR1B,r16

loop1: in r21,TIFR sbrs r21,TOV1 rjmp loop1 ldi r16,0b00000100 out TIFR,r16 ret

; "12345678901234567890" text: .db "Hello World",0 text2: .db "How Are You?",0

Catatan Tambahan :

Register X, Register Y dan Register Z

Register R26…R31 memiliki fungsi tambahan sebagai register serbaguna. Register-register ini dapat berfungsi sebagai register 16 bit yang dapat menyimpan address pada operasi pemindahan data dalam mode indirect addressing. Fungsinya seperti register Data Pointer / DPTR pada MCS-51. Register 16 bit ini adalah register X, Y dan Z seperti gambar berikut :

Gambar 9.3 Register X, Y dan Z

LPM (Load Program Memory)

Load 1 byte isi address yang ditunjukkan oleh register Z ke R0. Instruksi ini mirip dengan instruksi mov

A,@DPTR pada MCS-51.

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

BAB X

Pengendalian Motor DC

1. Motor DC

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.

Gambar 10.1 Kaidah Tangan Kiri

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.

Gambar 10.2 Konduktor Berarus Listrik Dalam Medan Magnet

Pada gambar sebelah kiri, arah medan magnet pada sisi atas yang dihasilkan oleh konduktor berlawanan dengan arah medan magnet yang dihasilkan oleh magnet permanen. Sementara pada sisi sebelah bawah, arah medan magnet yang dihasilkan oleh konduktor searah dengan arah medan magnet yang dihasilkan oleh magnet permanen. Dengan kata lain, pada sisi sebelah atas kerapatan fluks magnet lebih sedikit dari pada sisi sebelah bawah. Sebuah gaya dorong akan menyebabkan konduktor bergerak ke sisi sebelah atas.

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.

Gambar 10.3 Bergeraknya Sebuah Motor

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.

Gambar 10.4 Kaidah Tangan Kanan Untuk Motor 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)

Gambar 10.5 Konstruksi Dasar Motor DC

Pada gambar 10.5 diatas tampak sebuah konstruksi dasar motor dc, pada gambar diatas terlihat bahwa pada saat terminal motor diberi tegangan dc, maka arus elektron akan mengalir melalui konduktor dari terminal negatif menuju ke terminal positif. Karena konduktor berada diantara medan magnet, maka akan timbul medan magnet juga pada konduktor yang arahnya seperti terlihat pada gambar 10.5 diatas. Arah garis gaya medan magnet yang dihasilkan oleh magnet permanen adalah dari kutub utara menuju ke selatan. Sementara pada konduktor yang dekat dengan kutub selatan, arah garis gaya magnet disisi sebelah bawah searah dengan garis gaya magnet permanen sedangkan di sisi sebelah atas arah garis gaya magnet berlawanan arah dengan garis gaya magnet permanen. Ini menyebabkan medan magnet disisi sebelah bawah lebih rapat daripada sisi sebelah atas. Dengan demikian konduktor akan terdorong ke arah atas. Sementara pada konduktor yang dekat dengan kutub utara, arah garis gaya magnet disisi sebelah atas searah dengan garis gaya magnet permanen sedangkan di sisi sebelah bawah arah garis gaya magnet berlawanan arah dengan garis gaya magnet permanen. Ini menyebabkan medan magnet disisi sebelah atas lebih rapat daripada sisi sebelah bawah. Dengan demikian konduktor akan terdorong ke arah bawah. Pada akhirnya konduktor akan membentuk gerakan berputar berlawanan dengan jarum jam seperti terlihat pada gambar 10.5 diatas.

2. Kendali Arah Putaran

Gambar 10.6 Arah Putaran Motor DC

Dari gambar 10.6 diatas, agar arah putaran motor dc berubah, maka polaritas tegangan pada terminal motor harus dibalik.

TIP120 Q2 2 R2 10K 2 1 4N25 1 10K

680 1 2 2 2 Katoda Kolektor

5 +12V

3 NC Q1 Emiter 4 1 R1 1 2 2 TIP120

MOTOR DC

Katoda Kolektor

1 2 TIP120 1 R4 2

14 VCC 3 2 1B 1Y 4B 4 4A 12 13 BIT0

11 BIT1 1 10 R5 1 2 2 Q5 BC548

7 6 2Y 2B G 1K 3B 3A 3Y 9 8 74LS00

5 2A 4Y

Gambar 10.7 Rangkaian Driver Motor DC Tabel 10.1 Tabel Kebenaran Rangkaian Driver Motor DC Input

Aksi Motor

0 1 Berputar searah jarum jam

1 0 Berputar berlawanan arah jarum jam

11 Berhenti

Contoh Program :

.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

3. Kendali Kecepatan (PWM)

Pulse Width Modulation (PWM) adalah sebuah cara memanipulasi lebar dari pulsa dalam perioda yang konstan untuk mendapatkan tegangan rata-rata yang berbeda.

Gambar 2.8 Sinyal PWM dengan Berbagai Duty Cycle

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.

Gambar 2.9 Pulsa PWM

V o = VS

V 0 : Tegangan Output (Volt) VS : Tegangan Pulsa PWM (Volt) t 1 : Perioda pulsa high (Secon)

: Periode pulsa (Secon)

Contoh Program :

.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

;No prescaling untuk timer1 out TCCR1b,r16 ldi

r16,0b00000001

;Presaling 1024 untuk timer0 out TCCR0,r16 ldi

r16,0b00000101

;Timer0&1 overflow interrupt enable out TIMSK,r16 ldi r16,high(timer_value1000)

r16,0b00000101

;Nilai timer1

out TCNT1H,r16 ldi r16,low(timer_value1000)

;Nilai timer1 out TCNT1L,r16 ldi

;Bilangan hex, $f6 = 0xf6 out TCNT0,r18

r18,$f6

;Nilai timer0

P_300uS: in

;Baca Timer Interrupt Flag Register sbrs r17,TOV0

r17,TIFR

;Tunggu sampai timer0 overflow set rjmp P_300uS ldi

;TOV0 dinolkan dg memberi logika 1 out TIFR,r16 ret

r16,0b00000001

P_1mS: in

;Baca Timer Interrupt Flag Register sbrs r19,TOV1

r19,TIFR

;Tunggu sampai timer1 overflow set rjmp P_1mS ldi

;TOV1 dinolkan dg memberi logika 1 out TIFR,r16 ret

r16,0b00000100

Catatan Tambahan :

Timer/Counter0 Control Register – TCCR0

CS : Select bit

Timer Interrupt Mask Register – TIMSK

Timer Interrupt Flag Register - TIFR

Timer/Counter1 Control Register B – TCCR1B

BAB IX

Motor Servo

1. Dasar Motor Servo

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 :