Basic Avr Micro Controller Tutorial v3

download Basic Avr Micro Controller Tutorial v3

of 68

Transcript of Basic Avr Micro Controller Tutorial v3

Basic AVR Microcontroller Tutorial

Oleh : Hendawan Soebhakti, ST

Agustus 2007Parkway Street, Batam Centre Batam 29461 Telp. 62-778 469856 469861 Fax. 62-778 463620 http://www.polibatam.ac.id

DAFTAR ISI1. 2. 3. 4. 5. 6. 7. 8. 9. 10. AVR ATMega 8535L Operasi Aritmatika, Logika dan Percabangan Interupsi Timer/Counter Pengendalian Motor Stepper LCD 16x2 PWM dan Pengendalian Motor DC Motor Servo Keypad Komunikasi Serial USART

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 2 of 68

BAB I

AVR ATMega 8535L1.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

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 3 of 68

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 Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic Page 4 of 68

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 Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic Page 5 of 68

Bit 4 S : Sign Bit Bit S merupakan hasil exlusive or dari Negative Flag N dan Twos Complement Overflow Flag V. Bit 3 V : Twos 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 out ldi out ldi out out cbi cbi stop: rjmp r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,0xff ddra,r16 PortA,r16 PortA,0 PortA,1 stop Program utama

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 rjmp 0x0000 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. main: ldi out ldi out r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 ; low byte address RAM = 5F ; high byte address RAM = 02 Page 6 of 68

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

BAB II

Operasi Port Input Output2.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 1 0 Output No Output Low 1 1 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

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 7 of 68

Contoh Program 1: .include "m8535def.inc" .org 0x00 rjmp main main: ldi out ldi out ldi out ldi out out ulang: in out ldi out cbi sbic cbi sbi sbis sbi ldi out out rjmp r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,0x00 ddra,r16 r16,0xff ddrb,r16 ddrc,r16 r16,PortA PortB,r16 r16,0x0f PortC,r16 PortC,0 PortA,5 PortC,1 PortC,6 PortA,5 PortC,7 r16,0x00 PortB,r16 PortC,r16 ulang ; PortA as input ; PortB as output ; PortC as output

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.

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 8 of 68

Jawaban Latihan no 3: .include "m8535def.inc" .org 0x00 rjmp main main: ldi out ldi out ldi out ldi out out ldi ldi sbis rjmp sbis rjmp out rjmp out rjmp r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,0xff ddra,r16 r16,0x00 ddrc,r16 ddrd,r16 r16,0x00 r17,0x15 PortC,1 ulang1 PortD,2 ulang1 PortA,r17 ulang PortA,r16 ulang ; PortA as output ; PortC as output ; PortD as output

ulang:

ulang1:

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 9 of 68

BAB III

Operasi Aritmatika3.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 mul : Mengurangi isi dua register. Contoh : sub r19,r14 ; r19=r19-r14 : 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 ldi add ldi adc rjmp r16,0x80 r17,0x80 r16,r17 r18,0x02 r16,r18 here

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 ldi sub ldi sub ldi sub rjmp r16,0x09 r17,0x06 r16,r17 r17,0x03 r16,r17 r17,0x06 r16,r17 here Page 10 of 68

here:

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Perkalian .include "m8535def.inc" .org 0x00 rjmp main main: ldi out ldi out ldi ldi mul movw rjmp r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,5 r17,100 r16,r17 r17:r16,r1:r0 here

here:

; Copy r1:r0 to r17:r16

Pembagian .include "m8535def.inc" .org 0x00 .def drem8u =r15 .def dres8u =r16 .def dd8u =r16 .def dv8u =r17 .def dcnt8u =r18 rjmp main: ldi out ldi out ldi ldi rcall rjmp sub ldi rol dec brne ret rol sub brcc add clc rjmp sec rjmp main r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 dd8u,4 dv8u,2 div8u here drem8u,drem8u dcnt8u,9 dd8u dcnt8u d8u_2

;remainder/sisa ;result/hasil ;dividend/yang dibagi ;divisor/pembagi ;loop counter

here: ; div8u: d8u_1:

d8u_2:

d8u_3:

;clear remainder and carry ;init loop counter ;shift left dividend ;decrement counter ;if done ;return drem8u ;shift dividend into remainder drem8u,dv8u remainder = remainder - divisor d8u_3 ;if result negative drem8u,dv8u ;restore remainder ;clear carry to be shifted into result d8u_1 ;else ;set carry to be shifted into result d8u_1

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 11 of 68

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)

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 12 of 68

BAB IV

Operasi Logika4.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 out ldi out ldi ldi and ori clr inc ser dec here: rjmp r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,0b01110111 r17,0b00001111 r16,r17 r16,0b00001000 r16 r16 r16 r16 here

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 13 of 68

Latihan : 1. Buatlah program untuk memecahkan persoalan berikut :PinA PinB 0xf0 r20 PortC

2.

Buatlah program dengan ketentuan sbb : Input PortA,1 PortA,0 0 0 0 1 1 1 0 1 Aksi Clear isi r20 dan r21 Isi r20 dengan 0 kemudian naikkan isi r20 sampai nilainya = 10, jika sudah sampai 10 ulangi lagi dari 0 Isi r21 dengan 10 kemudian turunkan isi r21 sampai 0, jika sudah 0 ulangi lagi dari 10. Set isi r20 dan r21

Jawaban no 2: .include "m8535def.inc" .org 0x00 rjmp main: main ldi out ldi out sbic rjmp rjmp r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 PortA,1 cek10_11 cek00_01 PortA,0 setAll r21,10 r21 r21 r21 r21 r21 r21 r21 r21 r21 r21 ulang r20 r21 mulai ; skip if PortA,1 = 0

mulai:

cek10_11: sbic rjmp ulang: ldi dec dec dec dec dec dec dec dec dec dec rjmp setAll: ser ser rjmp

; PortA,1=1 ; PortA,1=1, PortA,0=0 (10) ;

; cek00_01: sbis PortA,0 rjmp clearAll Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

; PortA,1=0 ; skip if PortA,0=1 Page 14 of 68

ulang2:

ldi inc inc inc inc inc inc inc inc inc inc rjmp

r20,0 r20 r20 r20 r20 r20 r20 r20 r20 r20 r20 ulang2 r20 r21 mulai

clearAll: clr clr rjmp

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 15 of 68

BAB V

Percabangan5.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 out ldi out clr inc cpi breq rjmp ldi dec cp brne rjmp r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16 ; r16=0x00 r16 ; increment r16 r16,5 ; r16=5 ? lagi ; branch to lagi if r16 = 5 naik ; jump to naik if r16 5 r18,5 r16 r16,r18 lompat lagi ; ; ; ; ; r18 = 5 decrement r16 compare r16 & r18 branch to lompat if r16=r18 jump to lagi if r16r18

naik:

lagi:

lompat: henti: rutin1: rutin2:

rcall rutin1 rcall rutin2 rjmp henti mov ret mov ret r17,r16 r19,r18

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 16 of 68

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

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 17 of 68

BAB VI

InterupsiInterupsi 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

ISR

ISR

ISR

Main Time

Main

Main

Main

(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 Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic Page 18 of 68

7 SM2

6 SE

5 SM1

4 SM0

3 ISC11

2 ISC10

1 ISC01

0 ISC00

MCUCR / MCU Control RegisterBit 7,5,4 Symbol SM2..0 Fuction 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 Sleep Enable. Digunakan untuk mengaktifkan mode Sleep dengan memberikan logika 1 pada SE sebelum Sleep dijalankan . Setelah Wake-up harus segera diberi logika 0.

6 3,2

SE

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

1,0

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 19 of 68

7 INT1

6 INT0

5 INT2

4 -

3 -

2 -

1 IVSEL

0 IVCE

GICR / General Interrupt Control RegisterBit 7 6 5 4,3,2 1 Symbol INT1 INT0 INT1 IVSEL Fuction External Interrupt Request 1 Enable. Digunakan untuk mengaktifkan INT1 dengan syarat bit I pada SREG juga diset . External Interrupt Request 0 Enable. Digunakan untuk mengaktifkan INT0 dengan syarat bit I pada SREG juga diset . External Interrupt Request 2 Enable. Digunakan untuk mengaktifkan INT2 dengan syarat bit I pada SREG juga diset . Reserved 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. Interrupt Vector Change Enable . Digunakan untuk mengaktifkan perubahan interrupt vector .

1

IVCE

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 20 of 68

Contoh Program :

Interrupt 0.include "m8535def.inc" .org 0x0000 rjmp main .org 0x0001 rjmp ex_int0 main: ldi out ldi out ldi out out set_int: ldi out ldi out sei loop: rjmp ex_int0: push in push ldi out out pop out pop reti r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,0xff ddrd,r16 PortD,r16 r17,0b01000000 GICR,r17 r17,0b00000000 MCUCR,r17 loop r16 r16,SREG r16 r17,0xff ddra,r17 PortA,r17 r16 SREG,r16 r16

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 21 of 68

BAB VII

Timer/Counter1. 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 Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic Page 22 of 68

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.

7OCIE2

6TOIE2

5TICIE1

4OCIE1A

3OCIE1B

2TOIE1

1OCIE0

0TOIE0

TIMSK / Timer/Counter Interrupt Mask Register

Bit 7 6 5 4 3 2 4 0

Symbol OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0

Fuction Timer/Counter2 Output Compare Match Interrupt Enable . Timer/Counter2 Overflow Interrupt Enable. Timer1 Input Capture Interrupt Enable Timer/Counter1A Output Compare Match Interrupt Enable . Timer/Counter1B Output Compare Match Interrupt Enable . Timer/Counter1 Overflow Interrupt Enable. Timer/Counter0 Output Compare Match Interrupt Enable . Timer/Counter0 Overflow Interrupt Enable.

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 23 of 68

7OCF2

6TOV2

5ICF1

4OCF1A

3OCF1B

2TOV1

1OCF0

0TOV0

TIFR / Timer/Counter Interrupt Flag Register

Bit 7 6 5 4 3 2 4 0

Symbol OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0

Fuction Output Compare Flag2. Timer/Counter2 Overflow Flag. Timer1 Input Capture Interrupt Flag Output Compare Flag1A. Output Compare Flag1B. Timer/Counter1 Overflow Flag. Output Compare Flag0. 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 Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic Page 24 of 68

TCNT = (1 + FFFF h) (Dimana : TCNT : Nilai timer (Hex)

Ttimer f CLK ) N

f CLK TtimerN 1+FFFFh Contoh :

: Frekuensi clock (crystal) yang digunakan (Hz) : Waktu timer yang diinginkan (detik) : Prescaler (1, 8, 64, 256, 1024) : Nilai max timer adalah FFFFh dan overflow saat FFFFh ke 0000h

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 = D5D0hDengan 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 hDengan nilai maksimum FFFFh maka akan dihasilkan waktu timer selama :

FFFFh = (

Ttimer 11059200 ) 1024 65535 = (Ttimer 10800)

Ttimer = 6,0680555555 detik

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 25 of 68

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.

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 26 of 68

Contoh Program : .include "m8535def.inc" .equ timer_value = 0xD5D0 .org 0x0000 rjmp mulai mulai: ldi out ldi out ulang: ldi out out rcall ldi out rcall rjmp timer1d: ldi out ldi out ldi out ldi out r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,0xff ddra,r16 PortA,r16 timer1d r16,0x00 PortA,r16 timer1d ulang r16,0b00000100 TIMSK,r16 r16,high(timer_value) TCNT1H,r16 r16,low(timer_value) TCNT1L,r16 r16,0b00000101 TCCR1B,r16 ;aktifkan enable interupt ;masukkan nilai timer

;masukkan prescaler 1024

looptimer: in r17,TIFR sbrs r17,TOV1 rjmp looptimer ldi r16,0b00000100 out TIFR,r16 ret

;tunggu sampai timer1 overflow set ;TOV1 dinolkan dengan memberi logika 1

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 27 of 68

BAB VIII

Pengendalian Motor Stepper1. 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 --->

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 28 of 68

1 N S N 2 S N S 1 SN N

1

1 SN S S N S

1

N

S

N 2 2 NS

S

S 2

2N S N

2

2

S

N

2

S

N N S

N 1 1 1

Step 11 N

Step 2

Step 31 S

Step 41

1

S 1 1

N 1 1

Step 51 NS

Step 61

Step 71 SN

Step 81

S S

N S

N

N

N

S

2S S

2

S

2

N

S 2

2N N

2

2

S

N S N

S

N

N

S

N

S 1 1

S

N 1 1

Step 9

Step 10

Step 11

Step 12

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 = 3600 / 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

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 29 of 68

S

N

N

S

N

2

N

S

N

S

N

S

2S S N

2

S 2

2

2

2

S

N

S

S

N SN

S

N

S N N

N 2

N 2

Skema Rangkaian Driver Motor Stepper+12V 10K

10K

TIP 122 PA.0 1N4001 1K TIP 122 1K 1N4001 PA.3

10K 10K MOTOR STEPPER TIP 122 PA.1 1N4001 1K TIP 122 1K 1N4001 PA.2

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 .include "m8535def.inc" .org 0x0000 rjmp main main: ldi out ldi out ldi out ldi out rcall ror cpi brne out rcall ldi rjmp r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,0xff ddra,r16 r19,0x08 PortA,r19 delay r19 r19,0x01 Step PortA,r19 delay r19,0x08 Step Arah Putaran CCW .include "m8535def.inc" .org 0x0000 rjmp main main: ldi out ldi out ldi out ldi out rcall rol cpi brne out rcall ldi rjmp r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,0xff ddra,r16 r19,0x01 PortA,r19 delay r19 r19,0x08 Step PortA,r19 delay r19,0x01 Step Page 30 of 68

Step:

Step:

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

delay: dl1: dl2: dl3:

ldi ldi ldi dec cpi brne dec cpi brne dec cpi brne ret

r20,0x02 r21,0xff r22,0xff r22 r22,0x00 dl3 r21 r21,0x00 dl2 r20 r20,0x00 dl1

delay: dl1: dl2: dl3:

ldi ldi ldi dec cpi brne dec cpi brne dec cpi brne ret r19

r20,0x02 r21,0xff r22,0xff r22 r22,0x00 dl3 r21 r21,0x00 dl2 r20 r20,0x00 dl1

Pada program, jika instruksi ror r19 diganti menjadi rol 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 main: ldi out ldi out ldi out ldi ldi rcall dec cpi brne nop rjmp cpi brne out rcall ldi ret out rcall ror ret r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,0xff ddra,r16 r19,0x08 r17,25 Step r17 r17,0 Loop Stop r19,0x01 Shift PortA,r19 delay r19,0x08 PortA,r19 delay r19

Loop:

Stop: Step:

Shift:

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 31 of 68

delay: dl1: dl2: dl3:

ldi ldi ldi dec cpi brne dec cpi brne dec cpi brne ret

r20,0x02 r21,0xff r22,0xff r22 r22,0x00 dl3 r21 r21,0x00 dl2 r20 r20,0x00 dl1 r17,50 maka posisi akhir motor stepper

Jika instruksi ldi adalah 900

r17,25 diganti menjadi ldi

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 out ldi out ldi out ldi out rcall ror cpi brne out rcall ldi rjmp ldi ldi ldi dec cpi brne dec cpi brne dec cpi r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,0xff ddra,r16 r19,0x08 PortA,r19 delay r19 r19,0x01 Step PortA,r19 delay r19,0x08 Step r20,0x20 r21,0xff r22,0xff r22 r22,0x00 dl3 r21 r21,0x00 dl2 r20 r20,0x00 Page 32 of 68

Step:

delay: dl1: dl2: dl3:

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

brne ret Jika instruksi ldi bertambah. 5. Kendali Torsi

dl1 r20,0x02 maka kecepatan motor stepper akan

r20,0x20 menjadi ldi

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 out ldi out ldi out ldi out rcall ror cpi brne out rcall ldi rjmp ldi ldi ldi dec cpi brne dec cpi brne dec cpi brne ret ldi cpi ldi cpi r16,low(RAMEND) SPL,r16 r16,high(RAMEND) SPH,r16 r16,0xff ddra,r16 r19,0x4c PortA,r19 delay r19 r19,0x09 Step PortA,r19 delay r19,0x4c Step r20,0x20 r21,0xff r22,0xff r22 r22,0x00 dl3 r21 r21,0x00 dl2 r20 r20,0x00 dl1 r19,0x4c r19,0x09 r19,0x08 r19,0x01

Step:

delay: dl1: dl2: dl3:

Jika instruksi diubah menjadi

maka torsi motor stepper akan turun menjadi setengahnya. Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 33 of 68

BAB IX

Liquid Crystal Display1. Konfigurasi Pin LCD 16x2

LIQUID CRYSTAL DISPLAY 16 CHARACTER X 2 LINESVSS VDD VO RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 A K

1

16

Gambar 9.1 Konfigurasi Pin LCD 16 Karakter x 2 Baris Pin No. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Symbol VSS VDD VO RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 A K Level 0V 5V (Variable) H/L H/L H, H->L H/L H/L H/L H/L H/L H/L H/L H/L 4,2 4,6 V 0V Description Ground Supply voltage for logic Operating voltage for LCD H : Data, L : Instruction code H : Read, L : Write Chip Enable signal Data bit 0 Data bit 1 Data bit 2 Data bit 3 Data bit 4 Data bit 5 Data bit 6 Data bit 7 LED + LED -

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 34 of 68

2. Rangkaian Skematik Mikrokontroler dan LCD 16x2

2x16 LCDVSS 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 D1 PA.3

+5V

+5V R1 5K

1N4001

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 0 0 1 1 R/W 0 1 0 1 Operation Menulis instruksi ke IR, seperti display clear, cursor shift Membaca busy flag (DB7) dan address counter (DB0 s/d DB7) Menulis data ke DDRAM atau CGRAM 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 : 1 00 40 2 01 41 3 02 42 4 03 43 5 04 44 6 05 45 7 06 46 8 07 47 9 08 48 10 09 49 11 0A 4A 12 0B 4B 13 0C 4C 14 0D 4D 15 0E 4E 16 0F 4F

Character Generator ROM (CGROM) CGROM akan menghasilkan karakter dengan format 5x8 dot atau 5x10 dot. Lihat tabel Format Karakter CGROM Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic Page 35 of 68

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

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 36 of 68

5. Pola Karakter CGROM

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 37 of 68

6. Tabel Instruksi InstruksiClear display Return home

Kode InstruksiRS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

DeskripsiMenghapus semua tampilan pada display Set DDRAM address ke 00h dan kembalikan cursor ke posisi awal. Isi DDRAM tidak berubah Menentukan auto increment / decrement DDRAM address karakter atau cursor berikutnya yang akan ditulis ke display. Set display (D), cursor (C), dan cursor blinking (B) ON/OFF Menentukan pergeseran display atau cursor serta menentukan arah pergeseran display Menentukan panjang data interface (DL: 8 atau 4 bit), jumlah baris (N: 1 atau 2 baris) dan tipe font (F: 5x10 atau 5x7 dot) Set CGRAM address Set DDRAM address Mengetahui apakah LCD sedang mengerjakan instruksi atau tidak. Isi address counter juga dapat dibaca Menulis data ke internal RAM (DDRAM/CGRAM) Membaca data dari internal RAM (DDRAM/CGRAM) F=1 F=0 BF = 1 BF = 0 ACG ADD : 5x7 dots : 5x10 dots : Busy : Can Accept Data : CGRAM Address : DDRAM Address

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 1

1 *

Entry mode set Display ON/OFF control Cursor or Display shift

0 0 0

0 0 0

0 0 0

0 0 0

0 0 0

0 0 1

0 1 S/C

1 D R/L

I/D C *

S B *

Function set Set CGRAM address Set DDRAM address Read Busy Flag and address Write data to RAM Read data from RAM I/D = 1 I/D = 0 S=1 S=0 D=1 D=0 : Increment : Decrement : DisplayShift : No Display Shift : Display ON : Display OFF

0 0 0 0 1 1

0 0 0 1 0 1 C=1 C=0 B=1 B=0 S/C = 1 S/C = 0

0 0 1 BF D7 D7

0 1

1

DL

N ACG ADD AC

F

*

*

D6 D6

D5 D5

D4 D4

D3 D3 R/L = 1 R/L = 0 DL = 1 DL = 0 N=1 N=0

D2 D2

D1 D1

D0 D0

: Cursor ON : Cursor OFF : Blink ON : Blink OFF : Display Shift : Cursor Move

: Right Shift : Left Shift : 8 bits : 4 bits : 2 Lines : 1 Line

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 38 of 68

7. Inisialisasi LCDPower 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 N 1 0 0 F 0 0 1 * 0 0 I/ D * 0 1 S Function Set (Interface 8 bit) Display OFF Display Clear Entry Mode Set

Inisialisasi selesai

Interface 8 bit

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 39 of 68

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 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 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 N 0 1 0 0 0 0 0 0 F 0 0 0 0 0 0 1 1 * 0 0 0 0 0 I/D 0 0 * 0 0 0 1 0 S Function Set (Interface 4 bit) Function Set (Interface 4 bit) Display OFF Display Clear Entry Mode Set

Inisialisasi selesai

Interface 4 bit

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 40 of 68

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: ldi r17,0x80 rcall SLcd rjmp Wr1 WM2LCD: ldi r17,0xC0 rcall SLcd Wr1: clr r1 LoopWr1: lpm mov r19,r0 cpi r19,0 brne NextCHR ret NextCHR: rcall WLCD adiw ZL,1 rjmp LoopWr1 ;----------------------; Inisialisasi LCD ;----------------------InitLCD: ldi r20,8 LoopDelay: rcall delay5mS dec r20 cpi r20,0 brne LoopDelay ldi out sbi cbi rcall r17,0x03 PortA,r17 PortA,6 PortA,6 delay5mS

;1st line, 1st col

;load program memory

;write character ;get next char

;Function set ;E=1 ;E=0 Page 41 of 68

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

ldi out sbi cbi rcall ldi out sbi rcall cbi

r17,0x03 PortA,r17 PortA,6 PortA,6 delay100uS r17,0x02 PortA,r17 PortA,6 delay100uS PortA,6

;Function set ;E=1 ;E=0 ;Function set:4 bit operation ;E=1 ;E=0 ;Function set:4 bit op;2lines ;Turn Off LCD ;Turn On LCD ;Clear Display ;Entry mode set; Inc addr

;

ldi r17,0x28 rcall SLcd ldi r17,0x08 rcall SLcd ldi r17,0x0C rcall SLcd ldi r17,0x01 rcall SLcd ldi r17,0x06 rcall SLcd ret ;----------------------; Rutin kirim instruksi ;----------------------SLcd: mov r18,r17 andi r18,$F0 swap r18 out PortA,r18 sbi PortA,6 cbi PortA,6 ; mov r18,r17 andi r18,$0F out PortA,r18 sbi PortA,6 cbi PortA,6 rcall delay100uS ret ;----------------------; Rutin kirim karakter ;----------------------WLcd: mov r18,r19 andi r18,$F0 swap r18 out PortA,r18 sbi PortA,4 sbi PortA,6 cbi PortA,6 ; mov r18,r19 andi r18,$0F out PortA,r18 Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

;Get high nibble ;E=1 ;E=0 ;Get low nibble ;E=1 ;E=0

;Get high nibble ;RS=1 ;E=1 ;E=0 ;Get low nibble Page 42 of 68

sbi PortA,4 ;RS=1 sbi PortA,6 ;E=1 cbi PortA,6 ;E=0 rcall delay100uS ret ;----------------------; 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

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 43 of 68

Catatan Tambahan : Register X, Register Y dan Register Z Register R26R31 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 ldi lpm mov text: .org 1000h ZL,low(2*text) ZH,high(2*text) r19,r0 .db ; ; ; ; ZL=00h ZH=10h r0=H (Karakter H) r19=H

"Hello World",0

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 44 of 68

BAB X

Pengendalian Motor DC1. 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 Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic Page 45 of 68

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.

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 46 of 68

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 Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic Page 47 of 68

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.

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 48 of 68

IC1 BIT0 1 R6 1 2 680 2 1 2 3 Anoda NC 6 5 4 +12V 1 R1 1 2 10K 2 Q1 TIP120

+12V

Katoda Kolektor NC 4N25 Emiter

Q2 TIP120

2

R2 2 1 10K

1

M1 1 IC2 BIT1 R7 680 1 2 3 Anoda NC 6 5 4 +12V 1 R3 1 2 10K 2 1 2 2

MOTOR DC Q3 TIP120 Q4 TIP120 1 R4 1 2 10K 2

Katoda Kolektor NC 4N25 Emiter

IC3 1 2 3 4 5 6 7 1A 1B 1Y 2A 2B 2Y G Vcc 4A 4B 4Y 3A 3B 3Y

VCC 14 13 BIT0 12 BIT1 11 1 10 9 8

R5 1 2 1K

2

Q5 BC548

74LS00

Gambar 10.7 Rangkaian Driver Motor DC Tabel 10.1 Tabel Kebenaran Rangkaian Driver Motor DC Input BIT 1 BIT 0 0 0 0 1 1 0 1 1 Aksi Motor Berhenti Berputar searah jarum jam Berputar berlawanan arah jarum jam Berhenti

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 49 of 68

Contoh Program : .include .org rjmp main: "m8535def.inc" 0x0000 main ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16,0xff out ddra,r16 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 ldi r20,0x10 ldi r21,0xff ldi r22,0xff dec r22 cpi r22,0x00 brne dl3 dec r21 cpi r21,0x00 brne dl2 dec r20 cpi r20,0x00 brne dl1 ret

Run:

delay: dl1: dl2: dl3:

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 50 of 68

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.20 %

50%

90 %

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.

VS io

vo

0

t1

T

Gambar 2.9 Pulsa PWM

Vo =V0 VS t1 T

t1 VS T

: Tegangan Output (Volt) : Tegangan Pulsa PWM (Volt) : Perioda pulsa high (Secon) : Periode pulsa (Secon)

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 51 of 68

Contoh Program : .include .equ .org rjmp main: "m8535def.inc" timer_value1000 = 0xd4cd 0x0000 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

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 52 of 68

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

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 53 of 68

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 54 of 68

BAB IX

Motor Servo1. 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 : 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).

Gambar 9.1 Konstruksi Motor ServoSumber : http://www.servocity.com

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.

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 55 of 68

Periode 20 ms

Lebar Pulsa 1.1 ms (min) 1.9 (max)

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 Lebar Pulsa 1.1 ms

900

Lebar Pulsa 1.5 ms

1800 Lebar Pulsa 1.9 ms

Gambar 9.2 Lebar Pulsa dan Posisi Servo 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).

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 56 of 68

Gambar 9.3 HSR-5995TG Ultra TorqueSumber : http://www.servocity.com

Detailed SpecificationsControl System: +Pulse Width Control 1500usec Neutral Required Pulse: 3.3-7.4 Volt Peak to Peak Square Wave Operating Voltage Range: 4.8-7.4 Volts Operating Temperature Range: -20 to +60 Degree C (-68F to +140F) Operating Speed (6.0V): 0.15sec/60 degrees at no load Operating Speed (7.4V): 0.12sec/60 degrees at no load Stall Torque (6.0V): 333.29oz/in. (24kg.cm) Stall Torque (7.4V): 416.61oz/in. (30kg.cm) Standing Torque (6.0V): 433.27oz/in. (31.2kg.cm) 5 degree deflection Standing Torque (7.4V): 541.59oz/in. (39kg.cm) 5 degree deflection Operating Angle: 90 Deg. one side pulse traveling 400usec 360 Modifiable: Yes Direction: Clockwise/Pulse Traveling 1500 to 1900usec Idle Current Drain (6.0V): 3mA at stop Idle Current Drain (7.4V): 3mA at stop Current Drain (6.0V): 300mA/idle and 4.2 amps at lock/stall Current Drain (7.4V): 380mA/idle and 5.2 amps at lock/stall Dead Band Width: 2usec Motor Type: Coreless Metal Brush Potentiometer Drive: 6 Slider Indirect Drive Bearing Type: Dual Ball Bearing MR106 Gear Type: 4 Titanium Gears Connector Wire Length: 11.81" (300mm) Dimensions: 1.57" x 0.78"x 1.45" (40 x 20 x 37mm) Weight: 2.18oz (62g)

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 57 of 68

2. Kendali Posisi 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 .equ timer_value = 0xc0 .org 0x0000 rjmp main main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 sbi DDRD,5 ;timer 20mS ;timer 1.5mS

;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 Electrical Engineering Batam Polytechnic Page 58 of 68

rjmp ldi out ret

P20mS r16,0b00000100 TIFR,r16

;TOV1 dinolkan dg memberi logika 1

Catatan Tambahan : Timer/Counter1 Control Register B - TCCR1B 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.

Contoh Program dilakukan setting sbb : ldi out r16,0b00000011 TCCR1B,r16 ;enable Timer 1 with 64 prescaler

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 59 of 68

Timer/Counter0 Control Register TCCR0

CS02..00: Clock Select bits ; Tiga bit pemilih prescaler timer/counter 0 dan hubungannya dengan clock eksternal pada pin T0.

Pada Contoh Program dilakukan setting sbb : ldi r16,0b00000100 out TCCR0,r16 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 Timer 0 menghasilkan 1.5mS : TCNT=(1+FFh)-((Ttimer x fclk)/N) TCNT=100h-((0.0015 x 11059200)/256) TCNT=100h-64.8d TCNT=100h-40h TCNT=C0h 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) Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic Page 60 of 68 ;Presaling 256 untuk timer0

BAB X

Keypad1. Konfigurasi Keypad Pada dasarnya keypad adalah sejumlah tombol yang disusun sedemikian rupa sehingga membentuk susunan tombol angka dan beberapa menu lainnya. Berikut adalah contoh konfigurasi keypad 4x4 :Kolom1 Kolom2 Kolom3 Kolom4

Baris1

1 4 7CAN

2 5 8 0

3 6 9ENT

COR MEN

Baris2

Baris3

Baris4

Gambar 10.1 Konfigurasi Keypad 4x4 2. Cara Mengakses Keypad Berikut ini adalah cara menghubungkan keypad ke mikrokontroler :

PD.7 PD.6

ATmega8535

PD.5 PD.4 PD.0 PD.1 PD.2 PD.3B1

K1

K2

K3

K4

1 4 7CAN

2 5 8 0

3 6 9ENT

COR MEN

B2

B3

B4

Gambar 10.2 Menghubungkan Keypad ke Microkontroler

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 61 of 68

Untuk mengetahui tombol mana yang ditekan maka kita harus melakukan proses scanning pada keypad dengan langkah sebagai berikut : Langkah 1 :PD.4 PD.5 PD.6 PD.7

0PD.0

1 2 5 8 0

1 3 6 9ENT

1COR MEN

1 1 1 1

1 4 7CAN

PD.1

PD.2

a. Set kondisi Port D = 11101111 b. Baca kondisi Port D : Jika PD.0 = 0 maka Tombol 1 ditekan Jika PD.1 = 0 maka Tombol 4 ditekan Jika PD.2 = 0 maka Tombol 7 ditekan Jika PD.3 = 0 maka Tombol CAN ditekan

PD.3

Langkah 2 :PD.4 PD.5 PD.6 PD.7

1PD.0

0 2 5 8 0

1 3 6 9ENT

1COR MEN

1 1 1 1

1 4 7CAN

PD.1

PD.2

a. Set kondisi Port D = 11011111 b. Baca kondisi Port D : Jika PD.0 = 0 maka Tombol 2 ditekan Jika PD.1 = 0 maka Tombol 5 ditekan Jika PD.2 = 0 maka Tombol 8 ditekan Jika PD.3 = 0 maka Tombol 0 ditekan

PD.3

Langkah 3 :PD.4 PD.5 PD.6 PD.7

1PD.0

1 2 5 8 0

0 3 6 9ENT

1COR MEN

1 1 1 1

1 4 7CAN

PD.1

a. Set kondisi Port D = 10111111 b. Baca kondisi Port D : Jika PD.0 = 0 maka Tombol 3 ditekan Jika PD.1 = 0 maka Tombol 6 ditekan Jika PD.2 = 0 maka Tombol 9 ditekan Jika PD.3 = 0 maka Tombol ENT ditekan

PD.2

PD.3

Langkah 4 :PD.4 PD.5 PD.6 PD.7

1PD.0

1 2 5 8 0

1 3 6 9ENT

0COR MEN

1 1 1 1

1 4 7CAN

PD.1

PD.2

PD.3

a. Set kondisi Port D = 01111111 b. Baca kondisi Port D : Jika PD.0 = 0 maka Tombol COR ditekan Jika PD.1 = 0 maka Tombol MEN ditekan Jika PD.2 = 0 maka Tombol UP ditekan Jika PD.3 = 0 maka Tombol DOWN ditekan Jika kondisi PD.0 ..PD.3 = 1 maka tidak ada penekanan tombol

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 62 of 68

Contoh Program : .include .def .def .def .def .equ .equ .equ .equ .org rjmp main: "m8535def.inc" temp =r22 dly =r23 dly1 =r24 Key =r25 col1 =0b11101111 col2 =0b11011111 col3 =0b10111111 col4 =0b01111111 0x0000 main ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16,0xff out ddra,r16 ldi r16,0xf0 out ddrd,r16 loopx: rcall check_keys rjmp loopx ;------------------------; Check keypad sub routine ;------------------------check_keys: ldi temp,col1 out PORTD,temp rcall delay sbic PIND,PD0 rjmp key4 ldi key,0x01 out PortA,key ret key4: sbic rjmp ldi out ret sbic rjmp ldi out ret sbic rjmp ldi out ret ldi out rcall sbic PIND,PD1 key7 key,0x04 PortA,key PIND,PD2 keyCAN key,0x07 PortA,key PIND,PD3 key2 key,0x0A PortA,key temp,col2 PORTD,temp delay PIND,PD0

;Column ;Column ;Column ;Column

1 2 3 4

;PortA as output ;PD[7:4]=output PD[3:0]=input

;Enable column1 ; Pressed key No1 ? ; if Not, check next key ; if yes... ; key=0x01 ; Pressed key No4 ? ; if Not, check next key ; if yes... ; ; ; ; ; ; ; ; key=0x04 Pressed key No7 ? if Not, check next key if yes... key=0x07 Pressed key CAN ? if Not, check next key if yes...

key7:

keyCAN:

key2:

; key=0x0A ; Disable the first column... ; and enable the second ; Pressed key No2 ? Page 63 of 68

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

key5:

key8:

key0:

key3:

key6:

key9:

keyENT:

keyCOR:

keyMEN:

rjmp ldi out ret sbic rjmp ldi out ret sbic rjmp ldi out ret sbic rjmp ldi out ret ldi out rcall sbic rjmp ldi out ret sbic rjmp ldi out ret sbic rjmp ldi out ret sbic rjmp ldi out ret ldi out rcall sbic rjmp ldi out ret sbic rjmp ldi out ret

key5 key,0x02 PortA,key PIND,PD1 key8 key,0x05 PortA,key PIND,PD2 key0 key,0x08 PortA,key PIND,PD3 key3 key,0x00 PortA,key temp,col3 PORTD,temp delay PIND,PD0 key6 key,0x03 PortA,key PIND,PD1 key9 key,0x06 PortA,key PIND,PD2 keyENT key,0x09 PortA,key PIND,PD3 keyCOR key,0x0B PortA,key temp,col4 PORTD,temp delay PIND,PD0 keyMEN key,0x0C PortA,key PIND,PD1 keyUP key,0x0D PortA,key

; if Not... ; if yes... ; ; ; ; ; ; ; ; ; ; ; ; key=0x02 Pressed key No5 ? if Not... if yes... key=0x05 Pressed key No8 ? if Not... if yes... key=0x08 Pressed key No0 ? if Not... if yes...

; key=0x00 ; Disable 2nd column... ; and enable the 3th ; Pressed key No3 ? ; if Not... ; if yes... ; ; ; ; ; ; ; ; ; ; ; ; key=0x03 Pressed key No6 ? if Not... if yes... key=0x06 Pressed key No9 ? if Not... if yes... key=0x09 Pressed key ENT ? if Not... if yes...

; key=0x0B ; ; Pressed key COR ? ; if Not... ; if yes... ; ; ; ; key=0x0C Pressed key MEN ? if Not... if yes...

; key=0x0D Page 64 of 68

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

keyUP:

sbic PIND,PD2 rjmp keyDW ldi key,0x0E out PortA,key ret keyDW: sbic PIND,PD3 rjmp check_keys ldi key,0x0F out PortA,key ret ;-----------------------; Delay sub routine ;-----------------------delay: ldi dly,0x10 dl1: ldi dly1,0xff dl2: dec dly1 cpi dly1,0x00 brne dl2 dec dly cpi dly,0x00 brne dl1 ret

; Pressed key UP ? ; if Not... ; if yes... ; ; ; ; key=0x0E Pressed key DOWN ? if Not... if yes...

; key=0x0F

Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic

Page 65 of 68

BAB XI

Serial USART1. Inisialisasi USART Berikut register yang perlu disetting untuk mengatur komunikasi serial USART : UBRR (USART Baud Rate Register) UCSRB (USART Control and Status Register B) UCSRC (USART Control and Status Register C) UBRR Digunakan untuk menentukan baud rate USART.

Rumus : UBRR = (fosc/16xbaudrate)-1 UCSRB Digunakan untuk mengaktifkan penerimaan dan pengiriman data USART

RXEN : Jika di set 1 maka akan mengaktifkan penerimaan TXEN : Jika di set 1 maka akan mengaktifkan pengiriman RXCIE : Jika di set 1 maka akan mengaktifkan interupsi penerimaan 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

Contoh inisialisasi USART : Basic AVR Tutorial by Hendawan Soebhakti Electrical Engineering Batam Polytechnic Page 66 of 68

.equ fclock =11059200 .equ baud_rate =19200 .equ ubbr_value =(fclock / (16*baud_rate)) - 1 init_usart: ldi temp,high(ubbr_value) out UBRRH,temp ldi temp,low(ubbr_value) out UBRRL,temp ldi temp,(1