Basic AVR Microcontroller Tutorial Oleh : Hendawan oebhakti, T Agustus 2007 Parkway treet, Batam Centre Batam 2946 Telp. 62-778 469856 46986 Fax. 62-778 463620 http://www.polibatam.ac.id
DAFTAR II. AVR ATMega 8535L 2. Operasi Aritmatika, Logika dan Percabangan 3. Interupsi 4. Timer/Counter 5. Pengendalian Motor tepper 6. LCD 6x2 7. PWM dan Pengendalian Motor DC 8. Motor ervo 9. Keypad 0. Komunikasi erial UART Basic AVR Tutorial by Hendawan oebhakti Page 2 of 68
BAB I AVR ATMega 8535L. ekilas Tentang AVR AVR : Alf and Vegard RIC atau AVR : Advanced Virtual RIC RIC: Reduced Instruction et Computer Arsitektur mikrokontroler jenis AVR pertamakali dikembangkan pada tahun 996 oleh dua orang mahasiswa orwegian Institute of Technology yaitu Alf-Egil Bogen dan Vegard Wollan. Mikrokontroler AVR kemudian dikembangkan lebih lanjut oleh Atmel. eri pertama AVR yang dikeluarkan adalah mikrokontroler 8 bit AT90855, dengan konfigurasi pin yang sama dengan mikrokontroler 805, termasuk address dan data bus yang termultipleksi. Mikrokontroler AVR menggunakan teknologi RIC 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. amun 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 RIC 8 bit, semua instruksi berukuran 6 bit dan sebagian besar dieksekusi dalam siklus clock. Berbeda dengan mikrokontroler MC-5 yang instruksinya bervariasi antara 8 bit sampai 32 bit dan dieksekusi selama sampai 4 siklus mesin, dimana siklus mesin membutuhkan 2 periode clock. Dalam perkembangannya, AVR dibagi menjadi beberapa varian yaitu AT90xx, ATMega, AT86RFxx dan ATTiny. Pada dasarnya yang membedakan masing-masing varian adalah kapasitas memori dan beberapa fitur tambahan saja..2 Karakteristik mikrokontroler AVR seri ATMega8535.2. Fitur ATMega8535 Fitur yang tersedia pada ATMega 8535 adalah : Frekuensi clock maksimum 6 MHz Jalur I/O 32 buah, yang terbagi dalam PortA, PortB, PortC dan PortD Analog to Digital Converter 0 bit sebanyak 8 input Timer/Counter sebanyak 3 buah CPU 8 bit yang terdiri dari 32 register Watchdog Timer dengan osilator internal RAM sebesar 52 byte Memori Flash sebesar 8 Kbyte dengan kemampuan read while write Interrupt internal maupun eksternal Port komunikasi PI EEPROM sebesar 52 byte yang dapat diprogram saat operasi Analog Comparator Komunikasi serial standar UART dengan kecepatan maksimal 2,5 Mbps Basic AVR Tutorial by Hendawan oebhakti Page 3 of 68
.2.2 Konfigurasi Pin ATMega8535 Gambar. Konfigurasi Pin ATMega8535.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-ystem Reprogrammable Flash Memory untuk menyimpan program. Untuk alasan keamanan, program memory dibagi menjadi dua bagian yaitu Boot Flash ection dan Application Flash ection. Boot Flash ection digunakan untuk menyimpan program Boot Loader, yaitu program yang harus dijalankan pada saat AVR reset atau pertamakali diaktifkan. Application Flash ection digunakan untuk menyimpan program aplikasi yang dibuat user. AVR tidak dapat menjalankan program aplikasi ini sebelum menjalankan program Boot Loader. Besarnya memori Boot Flash ection dapat diprogram dari 28 word sampai 024 word tergantung setting pada konfigurasi bit di register BOOTZ. Jika Boot Loader diproteksi, maka program pada Application Flash ection juga sudah aman. Gambar.2 Peta Program Memory Basic AVR Tutorial by Hendawan oebhakti Page 4 of 68
Data Memory Gambar berikut menunjukkan peta memori RAM pada ATMega8535. Terdapat 608 lokasi address data memori. 96 lokasi address digunakan untuk Register File dan I/O Memory sementara 52 lokasi address lainnya digunakan untuk internal data RAM. Register File terdiri dari 32 general purpose working register, I/O register terdiri dari 64 register. Gambar.3 Peta Data Memory EEPROM Data Memory ATMega8535 memiliki EEPROM sebesar 52 byte untuk menyimpan data. Lokasinya terpisah dengan sistem address register, data register dan control register yang dibuat khusus untuk EEPROM..3 tatus Register (REG) tatus 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 EI. Bit 6 T : Bit Copy torage Instruksi bit copy BLD dan BT menggunakan bit T sebagai sumber atau tujuan dalam operasi bit. Bit 5 H : Half Carry Flag Basic AVR Tutorial by Hendawan oebhakti Page 5 of 68
Bit 4 : ign Bit Bit merupakan hasil exlusive or dari egative Flag dan Two s Complement Overflow Flag V. Bit 3 V : Two s Complement Overflow Flag Digunakan dalam operasi aritmatika Bit 2 : egative Flag Jika operasi aritmatika menghasilkan bilangan negatif, maka bit ini akan set. Bit Z : Zero Flag Jika operasi aritmatika menghaslkan bilangan nol, maka bit ini akan set..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 ldi r6,low(ramed) PL,r6 r6,high(ramed) PH,r6 ldi r6,0xff ddra,r6 Program utama PortA,r6 cbi PortA,0 cbi PortA, stop: rjmp stop ebuah 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 :. 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 tack Pointer dengan address terakhir RAM (RAMED). Untuk ATMega8535 yaitu 0x025F. Ini dimaksudkan agar program utama mulai ditulis setelah address terakhir RAM. main: ldi r6,low(ramed) ; low byte address RAM = 5F PL,r6 ldi r6,high(ramed) ; high byte address RAM = 02 PH,r6 Basic AVR Tutorial by Hendawan oebhakti Page 6 of 68
BAB II Operasi Port Input Output 2. Register I/O etiap port ATMega8535 terdiri dari 3 register I/O yaitu DDRx, Portx dan PIx. DDRx (Data Direction Register) Register DDRx digunakan untuk memilih arah pin. Jika DDRx = maka Pxn sebagai pin put Jika DDRx = 0 maka Pxn sebagai input. Portx (Port Data Register) Register Portx digunakan untuk 2 keperluan yaitu untuk jalur put atau untuk mengaktifkan resistor pullup.. Portx berfungsi sebagai put jika DDRx = maka : Portxn = 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 = maka pin Pxn sebagai pin input dengan resistor pull up. Portxn = 0 maka pin Pxn sebagai put tanpa resistor pull up. Tabel 2. Konfigurasi Port DDRxn Portxn I/O Pull up Comment 0 0 Input o Tri state (Hi-Z) 0 Input Yes Pull up aktif 0 Output o Output Low Output o Output High Catatan : x menunjukkan nama port (A,B,C,D) n menunjukkan nomor bit (0,,2,3,4,5,6,7) ilai awal (initial value) seluruh register I/O adalah 00h. PIx (Port Input Pin Address) Digunakan sebagai register input. 2.2 Instruksi I/O in : membaca data I/O port ke dalam register contoh : in r6,pina : menulis data register ke I/O port contoh : PortA,r6 ldi : (load immediate) : menulis konstanta ke register sebelum konstanta tersebut dikeluarkan ke I/O port contoh : ldi r6,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 oebhakti Page 7 of 68
Contoh Program :.include "m8535def.inc".org 0x00 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0x00 ddra,r6 ; PortA as input ldi r6,0xff ddrb,r6 ; PortB as put ddrc,r6 ; PortC as put ulang: in r6,porta PortB,r6 ldi cbi sbic cbi sbi sbis sbi ldi rjmp r6,0x0f PortC,r6 PortC,0 PortA,5 PortC, PortC,6 PortA,5 PortC,7 r6,0x00 PortB,r6 PortC,r6 ulang Latihan :. Buatlah program agar dapat membaca data pada PortC dan mengeluarkan data tersebut pada PortA. 2. Buatlah program agar PortA mengeluarkan data 20h jika PortB, berlogika 0. 3. Buatlah program agar PortA mengeluarkan data 5h jika PortC, dan PortD,2 berlogika, selain kondisi tersebut PortA mengeluarkan data 00h. Basic AVR Tutorial by Hendawan oebhakti Page 8 of 68
Jawaban Latihan no 3:.include "m8535def.inc".org 0x00 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0xff ddra,r6 ; PortA as put ldi r6,0x00 ddrc,r6 ; PortC as put ddrd,r6 ; PortD as put ldi r6,0x00 ldi r7,0x5 ulang: sbis PortC, rjmp ulang sbis PortD,2 rjmp ulang PortA,r7 rjmp ulang ulang: PortA,r6 rjmp ulang Basic AVR Tutorial by Hendawan oebhakti Page 9 of 68
BAB III Operasi Aritmatika 3. Operasi Aritmatika Instruksi Aritmatika add : Menambahkan isi dua register. Contoh : add r5,r4 ; r5=r5+r4 adc : Menambahkan isi dua register dan isi carry flag Contoh : adc r5,r4 ; r5=r5+r4+c sub mul : Mengurangi isi dua register. Contoh : sub r9,r4 ; r9=r9-r4 : Mengalikan dua register. Perkalian 8 bit dengan 8 bit menghasilkan bilangan 6 bit yang disimpan di r0 untuk byte rendah dan di r untuk byte tinggi. Untuk memindahkan bilangan 6 bit antar register digunakan instruksi movw (copy register word) Contoh : mul r2,r20 ; r:r0=r2*r20 3.2 Contoh Program Penjumlahan.include "m8535def.inc".org 0x00 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0x80 ldi r7,0x80 add r6,r7 ldi r8,0x02 adc r6,r8 here: rjmp here Pengurangan.include "m8535def.inc".org 0x00 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0x09 ldi r7,0x06 sub r6,r7 ldi r7,0x03 sub r6,r7 ldi r7,0x06 sub r6,r7 here: rjmp here Basic AVR Tutorial by Hendawan oebhakti Page 0 of 68
Perkalian.include "m8535def.inc".org 0x00 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,5 ldi r7,00 mul r6,r7 movw r7:r6,r:r0 here: rjmp here ; Copy r:r0 to r7:r6 Pembagian.include "m8535def.inc".org 0x00.def drem8u =r5 ;remainder/sisa.def dres8u =r6 ;result/hasil.def dd8u =r6 ;dividend/yang dibagi.def dv8u =r7 ;divisor/pembagi.def dcnt8u =r8 ;loop counter rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi dd8u,4 ldi dv8u,2 rcall div8u here: rjmp here ; div8u: sub drem8u,drem8u ;clear remainder and carry ldi dcnt8u,9 ;init loop counter d8u_: rol dd8u ;shift left dividend dec dcnt8u ;decrement counter brne d8u_2 ;if done ;urn d8u_2: rol drem8u ;shift dividend into remainder sub drem8u,dv8u remainder = remainder - divisor brcc d8u_3 ;if result negative add drem8u,dv8u ;restore remainder clc ;clear carry to be shifted into result rjmp d8u_ ;else d8u_3: sec ;set carry to be shifted into result rjmp d8u_ Basic AVR Tutorial by Hendawan oebhakti Page of 68
Latihan : Buatlah program untuk menyelesaikan persamaan matematika berikut ini :. r2=r22+5 2. r2=r22-5 3. r6:r7=r2*5 4. r6:r7=(r2+5)*(r22-5) Basic AVR Tutorial by Hendawan oebhakti Page 2 of 68
BAB IV Operasi Logika 4. 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,0b0000 or : Untuk meng-or-kan dua register Contoh : or r8,r7 ; r8=r8 or r7 ori : Untuk meng-or-kan register dengan konstanta immediate Contoh : ori r5,0xfe inc : Untuk menaikkan satu isi sebuah register Contoh : inc r4 dec : Untuk menurunkan satu isi sebuah register Contoh : dec r5 clr : Untuk mengosongkan (membuat jadi nol) isi register Contoh : clr r5 ; r5=0x00 ser : et all bit in register. Membuat jadi satu isi register Contoh : ser r6 ; r6=0xff 4.2 Contoh Program Operasi Logika.include "m8535def.inc".org 0x00 rjmp main main: ldi ldi ldi ldi and ori clr inc ser dec here: rjmp r6,low(ramed) PL,r6 r6,high(ramed) PH,r6 r6,0b00 r7,0b0000 r6,r7 r6,0b0000000 r6 r6 r6 r6 here Basic AVR Tutorial by Hendawan oebhakti Page 3 of 68
Latihan :. Buatlah program untuk memecahkan persoalan berikut : PinA PinB 0xf0 r20 PortC 2. Buatlah program dengan ketentuan sbb : Input PortA, PortA,0 Aksi 0 0 Clear isi r20 dan r2 0 Isi r20 dengan 0 kemudian naikkan isi r20 sampai nilainya = 0, jika sudah sampai 0 ulangi lagi dari 0 0 Isi r2 dengan 0 kemudian turunkan isi r2 sampai 0, jika sudah 0 ulangi lagi dari 0. et isi r20 dan r2 Jawaban no 2:.include "m8535def.inc".org 0x00 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 mulai: sbic PortA, ; skip if PortA, = 0 rjmp cek0_ rjmp cek00_0 cek0_: ; PortA,= sbic PortA,0 ; PortA,=, PortA,0=0 (0) rjmp setall ; ulang: ldi r2,0 dec r2 dec r2 dec r2 dec r2 dec r2 dec r2 dec r2 dec r2 dec r2 dec r2 rjmp ulang setall: ser r20 ser r2 rjmp mulai ; cek00_0: ; PortA,=0 sbis PortA,0 ; skip if PortA,0= rjmp clearall Basic AVR Tutorial by Hendawan oebhakti Page 4 of 68
ulang2: ldi r20,0 inc r20 inc r20 inc r20 inc r20 inc r20 inc r20 inc r20 inc r20 inc r20 inc r20 rjmp ulang2 clearall: clr clr rjmp r20 r2 mulai Basic AVR Tutorial by Hendawan oebhakti Page 5 of 68
BAB V Percabangan 5. Operasi Percabangan Instruksi Percabangan sbic (skip if bit in I/O is cleared) : kip jika bit I/O yang diuji clear sbis (skip if bit in I/O is set) : kip jika bit I/O yang diuji set sbrc (skip if bit in register is clear) : kip 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. (urn) : Keluar dari sub rutin. 5.2 Contoh Program Operasi Percabangan.include "m8535def.inc".org 0x00 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 clr r6 ; r6=0x00 naik: inc r6 ; increment r6 cpi r6,5 ; r6=5? breq lagi ; branch to lagi if r6 = 5 rjmp naik ; jump to naik if r6 5 lagi: ldi r8,5 ; r8 = 5 dec r6 ; decrement r6 cp r6,r8 ; compare r6 & r8 brne lompat ; branch to lompat if r6=r8 rjmp lagi ; jump to lagi if r6 r8 lompat: rcall rutin rcall rutin2 henti: rjmp henti rutin: mov r7,r6 rutin2: mov r9,r8 Basic AVR Tutorial by Hendawan oebhakti Page 6 of 68
Latihan : Buatlah program delay dari flowchart berikut ini : Mulai Isi r7 dengan 0x05 Isi r6 dengan 0x0A Kurangi isi r6 Tdk r6=0? Ya Kurangi isi r7 Tdk r7=0? Ya elesai Basic AVR Tutorial by Hendawan oebhakti Page 7 of 68
BAB VI Interupsi Interupsi adalah kondisi yang memaksa mikrokontroler menghentikan sementara eksekusi program utama untuk mengeksekusi rutin interrupt tertentu / Interrupt ervice Rine (IR) etelah melaksanakan IR secara lengkap, maka mikrokontroler akan kembali melanjutkan eksekusi program utama yang tadi ditinggalkan. Time Main Program (a). Program execution with interrupts IR IR IR Main Main Main Main Time (b). Program execution with interrupts Pada Atmega 8535 terdapat 2 sumber interupsi yaitu : Tabel 6. Interrupt Vector pada ATmega 8535 Vector Program o Address ource Interrupt Definition 0x0000 REET External Pin, Power-on Reset, Brown- Reset and Watchdog Reset 2 0x000 IT0 External Interrupt Request 0 3 0x0002 IT External Interrupt Request 4 0x0003 TIMER2 COMP Timer/Counter2 Compare Match 5 0x0004 TIMER2 OVF Timer/Counter2 Overflow 6 0x0005 TIMER CAPT Timer/Counter Capture Event 7 0x0006 TIMER COMPA Timer/Counter Compare Match A 8 0x0007 TIMER COMPB Timer/Counter Compare Match B 9 0x0008 TIMER OVF Timer/Counter Overflow 0 0x0009 TIMER0 OVF Timer/Counter0 Overflow 0x000A PI, TC erial Transfer Complete 2 0x000B UART, RXC UART, Rx Complete 3 0x000C UART, UDRE UART Data Register Empty 4 0x000D UART, TXC UART, Tx Complete 5 0x000E ADC ADC Conversion Complete 6 0x000F EE_RDY EEPROM Ready 7 0x000 AA_COMP Analog Comparator 8 0x00 TWI Two-wire erial Interface 9 0x002 IT2 External Interrupt Request 2 20 0x003 TIMER0 COMP Timer/Counter0 Compare Match 2 0x004 PM_RDY tore Program Memory Ready Basic AVR Tutorial by Hendawan oebhakti Page 8 of 68
7 6 5 4 3 2 0 M2 E M M0 IC IC0 IC0 IC00 MCUCR / MCU Control Register Bit ymbol Fuction 7,5,4 M2..0 leep Mode elect Bits. Digunakan untuk memilih mode sleep MCU M2 M M0 leep Mode 0 0 0 Idle 0 0 ADC oise Reduction 0 0 Power-down 0 Power-save 0 0 Reserved 0 Reserved 0 tandby Extended tandby 6 E leep Enable. Digunakan untuk mengaktifkan mode leep dengan memberikan logika pada E sebelum leep dijalankan. etelah Wake-up harus segera diberi logika 0. 3,2 IC, IC0 Interrupt ense Control Bit. Digunakan untuk memilih jenis pulsa trigger External Interrupt (IT). IC IC0 Description 0 0 The low level of IT generates an interrupt request. 0 Any logical change on IT generate an interrupt request 0 The falling edge of IT generate an interrupt request. The rising edge of IT generate an interrupt request.,0 IC0, IC00 Interrupt ense Control 0 Bit. Digunakan untuk memilih jenis pulsa trigger External Interrupt 0 (IT0). IC0 IC00 Description 0 0 The low level of IT0 generates an interrupt request. 0 Any logical change on IT0 generate an interrupt request 0 The falling edge of IT0 generate an interrupt request. The rising edge of IT0 generate an interrupt request. Basic AVR Tutorial by Hendawan oebhakti Page 9 of 68
7 6 5 4 3 2 0 IT IT0 IT2 - - - IVEL IVCE GICR / General Interrupt Control Register Bit ymbol Fuction 7 IT External Interrupt Request Enable. Digunakan untuk mengaktifkan IT dengan syarat bit I pada REG juga diset. 6 IT0 External Interrupt Request 0 Enable. Digunakan untuk mengaktifkan IT0 dengan syarat bit I pada REG juga diset. 5 IT External Interrupt Request 2 Enable. Digunakan untuk mengaktifkan IT2 dengan syarat bit I pada REG juga diset. 4,3,2 - Reserved IVEL Interrupt Vector elect. Jika IVEL = 0 maka interrupt vector ditempatkan pada start address flash memory Jika IVEL = maka interrupt vector ditempatkan pada awal bootloader dalam flash memory. IVCE Interrupt Vector Change Enable. Digunakan untuk mengaktifkan perubahan interrupt vector. Basic AVR Tutorial by Hendawan oebhakti Page 20 of 68
Contoh Program : Interrupt 0.include "m8535def.inc".org 0x0000 rjmp main.org 0x000 rjmp ex_int0 main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi set_int: ldi ldi sei r6,0xff ddrd,r6 PortD,r6 r7,0b0000000 GICR,r7 r7,0b00000000 MCUCR,r7 loop: rjmp loop ex_int0: push r6 in r6,reg push r6 ldi pop pop i r7,0xff ddra,r7 PortA,r7 r6 REG,r6 r6 Basic AVR Tutorial by Hendawan oebhakti Page 2 of 68
BAB VII Timer/Counter. 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 024. Berikut penjelasannya : ebuah AVR menggunakan crystal dengan frekuensi 8 MHz dan timer yang digunakan adalah timer 6 bit, maka maksimum waktu timer yang bisa dihasilkan adalah : TMAX = /fclk x (FFFFh+) = 0.25u x 65536 = 0.00892 Untuk menghasilkan waktu timer yang lebih lama dapat digunakan prescaler, misalnya 024, maka maksimum waktu timer yang bisa dihasilkan adalah : TMAX = /fclk x (FFFFh+) x = 0.25u x 65536 x 024 = 8.388608 Ketika presacaler digunakan, waktu timer dapat diperpanjang namun tingkat ketelitiannya menjadi turun. Misalnya dengan prescaler 024 nilai timer akan bertambah setiap kelipatan 024 pulsa dan membutuhkan waktu /fclk x 024 = 0.25u x 024 = 28 u bandingkan tingkat resolusi ini jika tanpa precsaler (0.25u). 2. Timer 6 Bit ormal Mode Pada mode normal, TCT akan menghitung naik dan membangkitkan interrupt Timer/Counter ketika nilainya berubah dari 0xFFFF ke 0x0000. eringkali kita menganggap untuk menggunakan timer cukup dengan memasukkan nilai yang diinginkan ke TCT 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 TCT. Gambar 7. Blok Diagram Timer 6 Bit Basic AVR Tutorial by Hendawan oebhakti Page 22 of 68
3. Register Timer 6 Bit TCT Timer/Counter Register digunakan untuk menyimpan nilai timer yang diinginkan. TCT dibagi menjadi 2 register 8 bit yaitu TCTH dan TCTL. TIMK & TIFR Timer Interrupt Mask Register (TIMK) dan Timer Interrupt Flag (TIFR) Register digunakan untuk mengendalikan interrupt mana yang diaktifkan dengan cara melakukan setting pada TIMK dan untuk mengetahui interrupt mana yang sedang terjadi. 7 6 5 4 3 2 0 OCIE2 TOIE2 TICIE OCIEA OCIEB TOIE OCIE0 TOIE0 TIMK / Timer/Counter Interrupt Mask Register Bit ymbol Fuction 7 OCIE2 Timer/Counter2 Output Compare Match Interrupt Enable. 6 TOIE2 Timer/Counter2 Overflow Interrupt Enable. 5 TICIE Timer Input Capture Interrupt Enable 4 OCIEA Timer/CounterA Output Compare Match Interrupt Enable. 3 OCIEB Timer/CounterB Output Compare Match Interrupt Enable. 2 TOIE Timer/Counter Overflow Interrupt Enable. 4 OCIE0 Timer/Counter0 Output Compare Match Interrupt Enable. 0 TOIE0 Timer/Counter0 Overflow Interrupt Enable. Basic AVR Tutorial by Hendawan oebhakti Page 23 of 68
7 6 5 4 3 2 0 OCF2 TOV2 ICF OCFA OCFB TOV OCF0 TOV0 TIFR / Timer/Counter Interrupt Flag Register Bit ymbol Fuction 7 OCF2 Output Compare Flag2. 6 TOV2 Timer/Counter2 Overflow Flag. 5 ICF Timer Input Capture Interrupt Flag 4 OCFA Output Compare FlagA. 3 OCFB Output Compare FlagB. 2 TOV Timer/Counter Overflow Flag. 4 OCF0 Output Compare Flag0. 0 TOV0 Timer/Counter0 Overflow Flag. TCCRB Timer/Counter Control Register B digunakan untuk mengatur mode timer, prescaler dan pilihan lainnya. C2..0: Clock elect bits ; Tiga bit pemilih prescaler timer/counter dan hubungannya dengan clock eksternal pada pin T. 4. Perhitungan Waktu Timer Basic AVR Tutorial by Hendawan oebhakti Page 24 of 68
Dimana : TCT f CLK : ilai timer (Hex) T TCT = ( + FFFF h) ( timer : Frekuensi clock (crystal) yang digunakan (Hz) f CLK ) T timer : Waktu timer yang diinginkan (detik) : Prescaler (, 8, 64, 256, 024) +FFFFh : ilai max timer adalah FFFFh dan overflow saat FFFFh ke 0000h Contoh : Diinginkan sebuah timer 6 bit bekerja selama detik, dengan frekuensi clock sebesar,0592mhz dan presecaller 024 maka diperoleh nilai TCT sebesar : TCT TCT TCT TCT 059200 = + FFFFh) 024 = 0000h 0800d = 0000h 2A30h = D5D0h Dengan demikian nilai TCTH = D5h dan TCTL = D0h 5. Maksimum Waktu Timer Timer 6 bit AVR8535 dapat menghasilkan waktu tunda maksimum sebesar 6,068055555 detik pada frekuensi,0592mhz TCT = (+ FFFFh) FFFFh = (0000 h) (FFFFh) = 000h Dengan nilai maksimum FFFFh maka akan dihasilkan waktu timer selama : Ttimer 059200 FFFFh = ( ) 024 65535 = (T 0800) T timer timer = 6,0680555555 detik Basic AVR Tutorial by Hendawan oebhakti Page 25 of 68
7. Mengaktifkan Timer etelah tahu nilai yang harus dituliskan ke TCT 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 TOIE pada TIMK Masukkan nilai timer ke TCT misalnya : D5D0h et prescaler pada 024 ( set bit C2 dan C0 pada TCCRB) Aktifkan bit global interrupt pada REG Tunggu. Atau lakukan hal yang lain. emua perhitungan dan pengecekan flag dilakukan oleh hardware. Basic AVR Tutorial by Hendawan oebhakti Page 26 of 68
Contoh Program :.include "m8535def.inc".equ timer_value = 0xD5D0.org 0x0000 rjmp mulai mulai: ldi ldi r6,low(ramed) PL,r6 r6,high(ramed) PH,r6 ulang: ldi r6,0xff ddra,r6 PortA,r6 rcall timerd ldi r6,0x00 PortA,r6 rcall timerd rjmp ulang timerd: ldi r6,0b0000000 ;aktifkan enable interupt TIMK,r6 ldi r6,high(timer_value) ;masukkan nilai timer TCTH,r6 ldi r6,low(timer_value) TCTL,r6 ldi r6,0b000000 ;masukkan prescaler 024 TCCRB,r6 looptimer: in r7,tifr sbrs r7,tov ;tunggu sampai timer overflow set rjmp looptimer ldi r6,0b0000000 ;TOV dinolkan dengan memberi logika TIFR,r6 Basic AVR Tutorial by Hendawan oebhakti Page 27 of 68
BAB VIII Pengendalian Motor tepper. Dasar Motor tepper Motor stepper adalah sebuah peralatan elektromekanik yang mengubah pulsa elektrik menjadi pergerakan mekanik. haft 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. edangkan besarnya frekuensi dari pulsa akan mempengaruhi kecepatan putaran motor stepper. Motor tepper Unipolar Gambar 2. Motor tepper Unipolar Motor stepper unipolar baik tipe 5 atau 6 kabel biasanya dihubungkan seperti pada gambar 2., 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. dibuat dari magnet permanent dengan 6 kutub, 3 kutub utara dan 3 kutub selatan. eperti terlihat pada gambar, arus mengalir dari center tap kumparan 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.. Jika arus pada kumparan dimatikan dan kumparan 2 dinyalakan, maka rotor akan berputar 30 derajat, atau step. Untuk berputar secara kontinyu, kita hanya perlu menghubungkan supplay power ke 2 kumparan secara berurutan. Dengan asumsi bahwa logika berarti arus mengalir pada kumparan motor, maka berikut adalah urutan yang harus dipenuhi agar motor dapat berputar sebanyak 24 step atau 2 putaran : Kumparan a 000000000000000000 Kumparan b 0000000000000000000 Kumparan 2a 0000000000000000000 Kumparan 2b 0000000000000000000 waktu ---> Basic AVR Tutorial by Hendawan oebhakti Page 28 of 68
Basic AVR Tutorial by Hendawan oebhakti Page 29 of 68 2 2 2 2 2 2 2 2 tep tep 2 tep 3 tep 4 2 2 2 2 2 2 2 2 tep 5 tep 6 tep 7 tep 8 2 2 2 2 2 2 2 2 tep 9 tep 0 tep tep 2 Gambar 2.2 Bergeraknya Motor tepper tep Angle / A Motor stepper bergerak per step. etiap bergerak satu step, motor stepper akan berputar beberapa derajat sesuai dengan step anglenya. tep angle tergantung dari jumlah kutub magnet motor stepper. Jumlah putaran yang diperlukan agar motor stepper bergerak putaran penuh (360 0 ) adalah : tep = 360 0 / tep Angle Misalnya, sebuah motor stepper memiliki A=,80 maka untuk untuk berputar satu putaran penuh memerlukan jumlah step sebanyak : 360 /,8 = 200 step
kema Rangkaian Driver Motor tepper 0K +2V 0K PA.0 K TIP 22 400 400 TIP 22 K PA.3 0K MOTOR TEPPER 0K PA. K TIP 22 400 400 TIP 22 K PA.2 Gambar 2.3 kema Rangkaian Driver Motor tepper 2. Kendali Arah Putaran Arah putaran motor stepper ditentukan oleh arah urutan aktifasi kumparannya. ecara 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 r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0xff ddra,r6 ldi r9,0x08 tep: PortA,r9 rcall delay ror r9 cpi r9,0x0 brne tep PortA,r9 rcall delay ldi r9,0x08 rjmp tep Arah Putaran CCW.include "m8535def.inc".org 0x0000 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0xff ddra,r6 ldi r9,0x0 tep: PortA,r9 rcall delay rol r9 cpi r9,0x08 brne tep PortA,r9 rcall delay ldi r9,0x0 rjmp tep Basic AVR Tutorial by Hendawan oebhakti Page 30 of 68
delay: ldi r20,0x02 dl: ldi r2,0xff dl2: ldi r22,0xff dl3: dec r22 cpi r22,0x00 brne dl3 dec r2 cpi r2,0x00 brne dl2 dec r20 cpi r20,0x00 brne dl delay: ldi r20,0x02 dl: ldi r2,0xff dl2: ldi r22,0xff dl3: dec r22 cpi r22,0x00 brne dl3 dec r2 cpi r2,0x00 brne dl2 dec r20 cpi r20,0x00 brne dl Pada program, jika instruksi ror r9 diganti menjadi rol r9 Maka arah putaran motor stepper akan berubah. 3. Kendali Posisi Derajat putaran motor stepper ditentukan oleh banyaknya jumlah pergeseran aktifasi kumparannya. ecara program, ini bisa dilakukan dengan mengubah jumlah pergeseran bit. Pada motor stepper dengan A=,8 0, agar motor stepper bergerak 45 0 maka diperlukan pergeseran step sebanyak : 45/,8 =25 step.include "m8535def.inc".org 0x0000 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0xff ddra,r6 ldi r9,0x08 ldi r7,25 Loop: rcall tep dec r7 cpi r7,0 brne Loop top: nop rjmp top tep: cpi r9,0x0 brne hift PortA,r9 rcall delay ldi r9,0x08 hift: PortA,r9 rcall delay ror r9 Basic AVR Tutorial by Hendawan oebhakti Page 3 of 68
delay: ldi r20,0x02 dl: ldi r2,0xff dl2: ldi r22,0xff dl3: dec r22 cpi r22,0x00 brne dl3 dec r2 cpi r2,0x00 brne dl2 dec r20 cpi r20,0x00 brne dl Jika instruksi ldi r7,25 diganti menjadi ldi r7,50 maka posisi akhir motor stepper adalah 90 0 4. Kendali Kecepatan Kecepatan motor stepper ditentukan oleh kecepatan aktifasi kumparannya. ecara program, ini bisa dilakukan dengan mengubah delay waktu pergeseran tiap bitnya. emakin cepat delay waktunya, kecepatan motor stepper juga akan bertambah..include "m8535def.inc".org 0x0000 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0xff ddra,r6 ldi r9,0x08 tep: PortA,r9 rcall delay ror r9 cpi r9,0x0 brne tep PortA,r9 rcall delay ldi r9,0x08 rjmp tep delay: ldi r20,0x20 dl: ldi r2,0xff dl2: ldi r22,0xff dl3: dec r22 cpi r22,0x00 brne dl3 dec r2 cpi r2,0x00 brne dl2 dec r20 cpi r20,0x00 Basic AVR Tutorial by Hendawan oebhakti Page 32 of 68
brne dl 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. ecara program, ini bisa dilakukan dengan mengubah kondisi bit..include "m8535def.inc".org 0x0000 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0xff ddra,r6 ldi r9,0x4c tep: PortA,r9 rcall delay ror r9 cpi r9,0x09 brne tep PortA,r9 rcall delay ldi r9,0x4c rjmp tep delay: ldi r20,0x20 dl: ldi r2,0xff dl2: ldi r22,0xff dl3: dec r22 cpi r22,0x00 brne dl3 dec r2 cpi r2,0x00 brne dl2 dec r20 cpi r20,0x00 brne dl Jika instruksi ldi r9,0x4c cpi r9,0x09 diubah menjadi ldi r9,0x08 cpi r9,0x0 maka torsi motor stepper akan turun menjadi setengahnya. Basic AVR Tutorial by Hendawan oebhakti Page 33 of 68
BAB IX Liquid Crystal Display. Konfigurasi Pin LCD 6x2 LIQUID CRYTAL DIPLAY 6 CHARACTER X 2 LIE V VDD VO R R/W E DB0 DB DB2 DB3 DB4 DB5 DB6 DB7 A K 6 Gambar 9. Konfigurasi Pin LCD 6 Karakter x 2 Baris Pin o. ymbol Level Description V 0V Ground 2 VDD 5V upply voltage for logic 3 VO (Variable) Operating voltage for LCD 4 R 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 DB H/L Data bit 9 DB2 H/L Data bit 2 0 DB3 H/L Data bit 3 DB4 H/L Data bit 4 2 DB5 H/L Data bit 5 3 DB6 H/L Data bit 6 4 DB7 H/L Data bit 7 5 A 4,2 4,6 V LED + 6 K 0V LED - Basic AVR Tutorial by Hendawan oebhakti Page 34 of 68
2. Rangkaian kematik Mikrokontroler dan LCD 6x2 2x6 LCD V VCC VEE R RW E DB0 DB DB2 DB3 DB4 DB5 DB6 DB7 A K +5V +5V R 5K PA.4 PA.6 PA.0 PA. PA.2 PA.3 +5V D Gambar 9.2 Rangkaian kematik LCD 400 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). R R/W Operation 0 0 Menulis instruksi ke IR, seperti display clear, cursor shift 0 Membaca busy flag (DB7) dan address counter (DB0 s/d DB7) 0 Menulis data ke DDRAM atau CGRAM Membaca data dari DDRAM atau CGRAM Busy Flag (BF) Busy flag = saat kontroler sedang mengerjakan instruksi, selama instruksi tersebut belum selesai dikerjakan, kontroler tidak akan menerima instruksi apapun. Ketika R=0 dan R/W=, busy flag mengeluarkan logika 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 6x2 : 2 3 4 5 6 7 8 9 0 2 3 4 5 6 00 0 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 40 4 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F Character Generator ROM (CGROM) CGROM akan menghasilkan karakter dengan format 5x8 dot atau 5x0 dot. Lihat tabel Format Karakter CGROM Basic AVR Tutorial by Hendawan oebhakti 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 5x0 dapat dibuat 4 karakter. Lihat tabel 4. Hubungan CGRAM Address, DDRAM dan Pola Karakter Basic AVR Tutorial by Hendawan oebhakti Page 36 of 68
5. Pola Karakter CGROM Basic AVR Tutorial by Hendawan oebhakti Page 37 of 68
6. Tabel Instruksi Instruksi Kode Instruksi Deskripsi R R/W DB7 DB6 DB5 DB4 DB3 DB2 DB DB0 Clear display 0 0 0 0 0 0 0 0 0 Menghapus semua tampilan pada display et DDRAM address ke 00h dan Return home 0 0 0 0 0 0 0 0 * kembalikan cursor ke posisi awal. Isi DDRAM tidak berubah Menentukan auto increment / Entry mode set 0 0 0 0 0 0 0 I/D decrement DDRAM address karakter atau cursor berikutnya yang akan ditulis ke display. Display O/OFF et display (D), cursor (C), dan 0 0 0 0 0 0 D C B control cursor blinking (B) O/OFF Menentukan pergeseran display atau Cursor or Display shift 0 0 0 0 0 /C R/L * * cursor serta menentukan arah pergeseran display Menentukan panjang data interface Function set 0 0 0 0 DL F * * (DL: 8 atau 4 bit), jumlah baris (: atau 2 baris) dan tipe font (F: 5x0 atau 5x7 dot) et CGRAM address 0 0 0 ACG et CGRAM address et DDRAM address 0 0 ADD et DDRAM address Mengetahui apakah LCD sedang Read Busy Flag and 0 BF AC mengerjakan instruksi atau tidak. Isi address address counter juga dapat dibaca Write data to RAM 0 D7 D6 D5 D4 D3 D2 D D0 Menulis data ke internal RAM (DDRAM/CGRAM) Read data from RAM D7 D6 D5 D4 D3 D2 D D0 Membaca data dari internal RAM (DDRAM/CGRAM) I/D = : Increment C = : Cursor O R/L = : Right hift F = : 5x7 dots I/D = 0 : Decrement C = 0 : Cursor OFF R/L = 0 : Left hift F = 0 : 5x0 dots = : Displayhift B = : Blink O DL = : 8 bits BF = : Busy = 0 : o Display hift B = 0 : Blink OFF DL = 0 : 4 bits BF = 0 : Can Accept Data D = : Display O /C = : Display hift = : 2 Lines ACG : CGRAM Address D = 0 : Display OFF /C = 0 : Cursor Move = 0 : Line ADD : DDRAM Address Basic AVR Tutorial by Hendawan oebhakti Page 38 of 68
7. Inisialisasi LCD Power On Tunggu = 5 m setelah VCC naik sampai 4,5V BF belum bisa dicek sebelum instruksi ini R R/W DB7 DB6 DB5 DB4 DB3 DB2 DB DB0 0 0 0 0 * * * * Function et (Interface 8 bit) Tunggu = 4, m BF belum bisa dicek sebelum instruksi ini R R/W DB7 DB6 DB5 DB4 DB3 DB2 DB DB0 0 0 0 0 * * * * Function et (Interface 8 bit) Tunggu = 00 u BF belum bisa dicek sebelum instruksi ini R R/W DB7 DB6 DB5 DB4 DB3 DB2 DB DB0 0 0 0 0 * * * * Function et (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. R R/W DB7 DB6 DB5 DB4 DB3 DB2 DB DB0 0 0 0 0 0 0 F * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 I/ D Function et (Interface 8 bit) Display OFF Display Clear Entry Mode et Inisialisasi selesai Interface 8 bit Basic AVR Tutorial by Hendawan oebhakti Page 39 of 68
Power On Tunggu = 5 m setelah VCC naik sampai 4,5V BF belum bisa dicek sebelum instruksi ini R R/W DB7 DB6 DB5 DB4 0 0 0 0 Function et (Interface 8 bit) Tunggu = 4, m BF belum bisa dicek sebelum instruksi ini R R/W DB7 DB6 DB5 DB4 0 0 0 0 Function et (Interface 8 bit) Tunggu = 00 u BF belum bisa dicek sebelum instruksi ini R R/W DB7 DB6 DB5 DB4 0 0 0 0 Function et (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. R R/W DB7 DB6 DB5 DB4 0 0 0 0 0 0 0 0 0 0 0 0 F * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 I/D Function et (Interface 4 bit) Function et (Interface 4 bit) Display OFF Display Clear Entry Mode et Inisialisasi selesai Interface 4 bit Basic AVR Tutorial by Hendawan oebhakti Page 40 of 68
8. Contoh Program.include "m8535def.inc".equ timer_value = 0xffca.equ timer_value00 = 0xfbaf.cseg.org 0x0000 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0xff ddra,r6 rcall InitLCD tart: ldi r7,0x0 rcall Lcd Loopx: ldi ZL,low(2*text) ldi ZH,high(2*text) rcall WMLCD ldi ZL,low(2*text2) ldi ZH,high(2*text2) rcall WM2LCD end: rjmp Loopx ;----------------------- ; Write Message to LCD ;----------------------- WMLCD: ldi r7,0x80 ;st line, st col rcall Lcd rjmp Wr WM2LCD: ldi r7,0xc0 rcall Lcd Wr: clr r LoopWr: lpm ;load program memory mov r9,r0 cpi r9,0 brne extchr extchr: rcall WLCD ;write character adiw ZL, ;get next char rjmp LoopWr ;----------------------- ; Inisialisasi LCD ;----------------------- InitLCD: ldi r20,8 LoopDelay: rcall delay5m dec r20 cpi r20,0 brne LoopDelay ldi r7,0x03 ;Function set PortA,r7 sbi PortA,6 ;E= cbi PortA,6 ;E=0 rcall delay5m Basic AVR Tutorial by Hendawan oebhakti Page 4 of 68
ldi r7,0x03 ;Function set PortA,r7 sbi PortA,6 ;E= cbi PortA,6 ;E=0 rcall delay00u ldi r7,0x02 ;Function set:4 bit operation PortA,r7 sbi PortA,6 ;E= ; rcall delay00u cbi PortA,6 ;E=0 ldi r7,0x28 ;Function set:4 bit op;2lines rcall Lcd ldi r7,0x08 ;Turn Off LCD rcall Lcd ldi r7,0x0c ;Turn On LCD rcall Lcd ldi r7,0x0 ;Clear Display rcall Lcd ldi r7,0x06 ;Entry mode set; Inc addr rcall Lcd ;----------------------- ; Rutin kirim instruksi ;----------------------- Lcd: mov r8,r7 andi r8,$f0 ;Get high nibble swap r8 PortA,r8 sbi PortA,6 ;E= cbi PortA,6 ;E=0 ; mov r8,r7 andi r8,$0f ;Get low nibble PortA,r8 sbi PortA,6 ;E= cbi PortA,6 ;E=0 rcall delay00u ;----------------------- ; Rutin kirim karakter ;----------------------- WLcd: mov r8,r9 andi r8,$f0 ;Get high nibble swap r8 PortA,r8 sbi PortA,4 ;R= sbi PortA,6 ;E= cbi PortA,6 ;E=0 ; mov r8,r9 andi r8,$0f ;Get low nibble PortA,r8 Basic AVR Tutorial by Hendawan oebhakti Page 42 of 68
sbi PortA,4 ;R= sbi PortA,6 ;E= cbi PortA,6 ;E=0 rcall delay00u ;----------------------- ; Rutin delay 5ms ;----------------------- delay5ms: ldi r6,0b0000000 TIMK,r6 ldi r6,high(timer_value) TCTH,r6 ldi r6,low(timer_value) TCTL,r6 ldi r6,0b000000 TCCRB,r6 loop: in r2,tifr sbrs r2,tov rjmp loop ldi r6,0b0000000 TIFR,r6 ;----------------------- ; Rutin delay 00u ;----------------------- delay00us: ldi r6,0b0000000 TIMK,r6 ldi r6,high(timer_value00) TCTH,r6 ldi r6,low(timer_value00) TCTL,r6 ldi r6,0b0000000 TCCRB,r6 loop: in r2,tifr sbrs r2,tov rjmp loop ldi r6,0b0000000 TIFR,r6 ; "234567890234567890" text:.db "Hello World",0 text2:.db "How Are You?",0 Basic AVR Tutorial by Hendawan oebhakti Page 43 of 68
Catatan Tambahan : Register X, Register Y dan Register Z Register R26 R3 memiliki fungsi tambahan sebagai register serbaguna. Register-register ini dapat berfungsi sebagai register 6 bit yang dapat menyimpan address pada operasi pemindahan data dalam mode indirect addressing. Fungsinya seperti register Data Pointer / DPTR pada MC-5. Register 6 bit ini adalah register X, Y dan Z seperti gambar berikut : Gambar 9.3 Register X, Y dan Z LPM (Load Program Memory) Load byte isi address yang ditunjukkan oleh register Z ke R0. Instruksi ini mirip dengan instruksi mov A,@DPTR pada MC-5. Contoh : ldi ZL,low(2*text) ; ZL=00h ldi ZH,high(2*text) ; ZH=0h lpm ; r0= H (Karakter H) mov r9,r0 ; r9= H.org 000h text:.db "Hello World",0 Basic AVR Tutorial by Hendawan oebhakti Page 44 of 68
BAB X Pengendalian Motor DC. Motor DC etiap 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 0. berikut ini. Gambar 0. Kaidah Tangan Kiri Jika suatu konduktor yang dialiri arus listrik ditempatkan dalam sebuah medan magnet, kombinasi medan magnet akan ditunjukkan oleh gambar 0.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 0.2 Konduktor Berarus Listrik Dalam Medan Magnet Basic AVR Tutorial by Hendawan oebhakti 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. ementara 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. ebuah 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. ementara 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. ebuah 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 0.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 0.3. Gambar 0.3 Bergeraknya ebuah Motor ebuah 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 0.4. Basic AVR Tutorial by Hendawan oebhakti Page 46 of 68
Gambar 0.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 (ewton) Dimana : B = kerapatan fluks magnet (weber) L = panjang konduktor (meter) I = arus listrik ( ampere) Gambar 0.5 Konstruksi Dasar Motor DC Basic AVR Tutorial by Hendawan oebhakti Page 47 of 68
Pada gambar 0.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 0.5 diatas. Arah garis gaya medan magnet yang dihasilkan oleh magnet permanen adalah dari kutub utara menuju ke selatan. ementara 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. ementara 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 0.5 diatas. 2. Kendali Arah Putaran Gambar 0.6 Arah Putaran Motor DC Dari gambar 0.6 diatas, agar arah putaran motor dc berubah, maka polaritas tegangan pada terminal motor harus dibalik. Basic AVR Tutorial by Hendawan oebhakti Page 48 of 68
R6 2 680 2 BIT0 2 3 IC Anoda C Katoda Kolektor C Emiter 425 6 5 4 +2V R 2 0K 2 Q TIP20 +2V Q2 TIP20 2 R2 2 0K M R7 680 BIT 2 3 IC2 Anoda C Katoda Kolektor C Emiter 425 6 5 4 +2V R3 2 0K 2 Q3 TIP20 2 MOTOR DC 2 Q4 TIP20 R4 2 0K 2 2 3 4 5 6 7 IC3 A Vcc B 4A Y 4B 2A 4Y 2B 3A 2Y 3B G 3Y 74L00 VCC 4 3 BIT0 2 BIT 0 9 8 R5 K 2 2 Q5 BC548 Gambar 0.7 Rangkaian Driver Motor DC Tabel 0. Tabel Kebenaran Rangkaian Driver Motor DC Input BIT BIT 0 Aksi Motor 0 0 Berhenti 0 Berputar searah jarum jam 0 Berputar berlawanan arah jarum jam Berhenti Basic AVR Tutorial by Hendawan oebhakti Page 49 of 68
Contoh Program :.include "m8535def.inc".org 0x0000 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0xff ddra,r6 Run: ldi r9,0b0000000 PortA,r9 rcall delay ldi r9,0b00000000 PortA,r9 rcall delay ldi r9,0b0000000 PortA,r9 rcall delay ldi r9,0b000000 PortA,r9 rcall delay rjmp Run delay: ldi r20,0x0 dl: ldi r2,0xff dl2: ldi r22,0xff dl3: dec r22 cpi r22,0x00 brne dl3 dec r2 cpi r2,0x00 brne dl2 dec r20 cpi r20,0x00 brne dl Basic AVR Tutorial by Hendawan oebhakti 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 inyal PWM dengan Berbagai Duty Cycle Pada gambar 2.8 menunjukkan tiga sinyal PWM yang berbeda. inyal yang paling atas menunjukkan sinyal PWM dengan duty cycle 0%. 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. ebagai contoh jika supply tegangan sebesar 9V dan duty cycle 20%, maka menghasilkan,8v. V io vo 0 t T Gambar 2.9 Pulsa PWM V o = t T V V 0 V t T : Tegangan Output (Volt) : Tegangan Pulsa PWM (Volt) : Perioda pulsa high (econ) : Periode pulsa (econ) Basic AVR Tutorial by Hendawan oebhakti Page 5 of 68
Contoh Program :.include "m8535def.inc".equ timer_value000 = 0xd4cd.org 0x0000 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0xff ddra,r6 ldi r6,0x00 PortA,r6 Loop: sbi PortA,0 ;Output Bit Pulse rcall Pulse cbi PortA,0 ;Output Bit Pulse rcall P_m rjmp Loop Pulse: ldi r6,0b0000000 ;o prescaling untuk timer TCCRb,r6 ldi r6,0b000000 ;Presaling 024 untuk timer0 TCCR0,r6 ldi r6,0b000000 ;Timer0& overflow interrupt enable TIMK,r6 ldi r6,high(timer_value000) ;ilai timer TCTH,r6 ldi r6,low(timer_value000) ;ilai timer TCTL,r6 ldi r8,$f6 ;Bilangan hex, $f6 = 0xf6 TCT0,r8 ;ilai timer0 P_300u: in r7,tifr ;Baca Timer Interrupt Flag Register sbrs r7,tov0 ;Tunggu sampai timer0 overflow set rjmp P_300u ldi r6,0b0000000 ;TOV0 dinolkan dg memberi logika TIFR,r6 P_m: in r9,tifr ;Baca Timer Interrupt Flag Register sbrs r9,tov ;Tunggu sampai timer overflow set rjmp P_m ldi r6,0b0000000 ;TOV dinolkan dg memberi logika TIFR,r6 Basic AVR Tutorial by Hendawan oebhakti Page 52 of 68
Catatan Tambahan : Timer/Counter0 Control Register TCCR0 C : elect bit Timer Interrupt Mask Register TIMK Timer Interrupt Flag Register - TIFR Timer/Counter Control Register B TCCRB Basic AVR Tutorial by Hendawan oebhakti Page 53 of 68
Basic AVR Tutorial by Hendawan oebhakti Page 54 of 68
BAB IX Motor ervo. Dasar Motor ervo Motor ervo terdiri dari sebuah motor DC, serangkaian gear, sebuah potensiometer, sebuah put shaft dan sebuah rangkaian kontrol elektronik. Biasanya, motor servo berbentuk kotak segi empat dengan sebuah put 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 put shaft untuk mengetahui posisi aktual shaft. Ketika motor dc berputar, maka put 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. udut operasi motor servo (Operating Angle) bervariasi tergantung jenis motor servo. Ada 2 jenis motor servo yaitu : Motor ervo tandard Yaitu motor servo yang mampu bergerak CW dan CCW dengan sudut operasi tertentu, misalnya 60 0, 90 0 atau 80 0. Motor ervo Continuous Yaitu motor servo yang mampu bergerak CW dan CCW tanpa batasan sudut operasi (berputar secara kontinyu). Gambar 9. Konstruksi Motor ervo umber : http://www.servocity.com Motor servo dikendalikan dengan cara mengirimkan sebuah pulsa yang lebar pulsanya bervariasi. Pulsa tersebut dimasukkan melalui kabel kontrol motor servo. udut atau posisi shaft motor servo akan diturunkan dari lebar pulsa. Biasanya lebar pulsanya antara. ms sampai.9 ms dengan periode pulsa sebesar 20 m. Basic AVR Tutorial by Hendawan oebhakti Page 55 of 68
Periode 20 ms Lebar Pulsa. ms (min).9 (max) Lebar pulsa akan mengakibatkan perubahan posisi pada servo. Misalnya sebuah pulsa.5 ms akan memutar motor pada posisi 90 0 (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. Lebar Pulsa. ms 0 0 90 0 Lebar Pulsa.5 ms Lebar Pulsa.9 ms 80 0 Gambar 9.2 Lebar Pulsa dan Posisi ervo Ketika sebuah pulsa yang dikirim ke servo kurang dari.5 ms, servo akan berputar counterclockwise menuju ke posisi tertentu dari posisi netral. Jika pulsa yang dikirim lebih dari.5 ms, servo akan berputar clockwise menuju ke posisi tertentu dari posisi netral. etiap servo memiliki spesifikasi lebar pulsa minimum dan maksimum sendiri-sendiri, tergantung jenis dan merk servo. Umumnya antara. ms sampai.9 ms. Parameter lain yang berbeda antara servo satu dengan servo lainnya adalah kecepatan servo untuk berubah dari posisi satu ke posisi lainnya (Operating peed). Basic AVR Tutorial by Hendawan oebhakti Page 56 of 68
Detailed pecifications Gambar 9.3 HR-5995TG Ultra Torque umber : http://www.servocity.com Control ystem: +Pulse Width Control 500usec eutral Required Pulse: 3.3-7.4 Volt Peak to Peak quare Wave Operating Voltage Range: 4.8-7.4 Volts Operating Temperature Range: -20 to +60 Degree C (-68F to +40F) Operating peed (6.0V): 0.5sec/60 degrees at no load Operating peed (7.4V): 0.2sec/60 degrees at no load tall Torque (6.0V): 333.29oz/in. (24kg.cm) tall Torque (7.4V): 46.6oz/in. (30kg.cm) tanding Torque (6.0V): 433.27oz/in. (3.2kg.cm) 5 degree deflection tanding Torque (7.4V): 54.59oz/in. (39kg.cm) 5 degree deflection Operating Angle: 90 Deg. one side pulse traveling 400usec 360 Modifiable: Yes Direction: Clockwise/Pulse Traveling 500 to 900usec 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 lider Indirect Drive Bearing Type: Dual Ball Bearing MR06 Gear Type: 4 Titanium Gears Connector Wire Length:.8" (300mm) Dimensions:.57" x 0.78"x.45" (40 x 20 x 37mm) Weight: 2.8oz (62g) Basic AVR Tutorial by Hendawan oebhakti Page 57 of 68
2. Kendali Posisi Untuk mengendalikan motor servo dapat digunakan 2 buah timer pada AVR yaitu : Timer digunakan untuk menjaga agar periode pulsa PWM sebesar 20m Timer 0 digunakan untuk menghasilkan lebar pulsa high untuk menentukan posisi servo Pada contoh program dibawah ini motor servo akan diberi pulsa high selama.5m setiap 20m sekali. Posisi motor servo ada di posisi netral / centre..include "m8535def.inc".equ timer_value20 = 0xf280 ;timer 20m.equ timer_value = 0xc0 ;timer.5m.org 0x0000 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 sbi DDRD,5 ;PortD.5 as put ldi r6,25 Loop: sbi PortD,5 rcall Pulse cbi PortD,5 rcall P20m dec r6 cpi r6,0 brne Loop top: nop rjmp top ;----------------------------------------------------------- ; Generate pulse.5m ervo position at centre ;----------------------------------------------------------- Pulse: ldi r6,0b000000 ;Prescaling 64 untuk timer TCCRb,r6 ldi r6,0b000000 ;Presaling 024 untuk timer0 TCCR0,r6 ldi r6,0b000000 ;Timer0& overflow interrupt enable TIMK,r6 ldi r6,high(timer_value20) ;ilai timer = 20m TCTH,r6 ldi r6,low(timer_value20) ;ilai timer TCTL,r6 ldi r8,0xf0 ;Bilangan hex, 0xf0 = timer.5 m TCT0,r8 ;ilai timer0 P_500u: in r7,tifr ;Baca Timer Interrupt Flag Register sbrs r7,tov0 ;Tunggu sampai timer0 overflow set rjmp P_500u ldi r6,0b0000000 ;TOV0 dinolkan dg memberi logika TIFR,r6 P20m:in r9,tifr ;Baca Timer Interrupt Flag Register sbrs r9,tov ;Tunggu sampai timer overflow set Basic AVR Tutorial by Hendawan oebhakti Page 58 of 68
rjmp P20m ldi r6,0b0000000 ;TOV dinolkan dg memberi logika TIFR,r6 Catatan Tambahan : Timer/Counter Control Register B - TCCRB Digunakan untuk mengatur mode timer, prescaler dan pilihan lainnya. C2..0: Clock elect bits ; Tiga bit pemilih prescaler timer/counter dan hubungannya dengan clock eksternal pada pin T. Contoh Program dilakukan setting sbb : ldi r6,0b000000 ;enable Timer with 64 prescaler TCCRB,r6 Basic AVR Tutorial by Hendawan oebhakti Page 59 of 68
Timer/Counter0 Control Register TCCR0 C02..00: Clock elect bits ; Tiga bit pemilih prescaler timer/counter 0 dan hubungannya dengan clock eksternal pada pin T0. Pada Contoh Program dilakukan setting sbb : ldi r6,0b0000000 ;Presaling 256 untuk timer0 TCCR0,r6 Perhitungan Timer Timer menghasilkan 20 m : TCT=(+FFFFh)-((Ttimer x fclk)/) TCT=0000h-((0.2 x 059200)/64) TCT=0000h-3456d TCT=0000h-0D80h TCT=F280h Timer 0 menghasilkan.5m : TCT=(+FFh)-((Ttimer x fclk)/) TCT=00h-((0.005 x 059200)/256) TCT=00h-64.8d TCT=00h-40h TCT=C0h Dimana : TCT : ilai timer (Hex) fclk : Frekuensi clock (crystal) yang digunakan (Hz) Ttimer : Waktu timer yang diinginkan (detik) : Prescaler (, 8, 64, 256, 024) Basic AVR Tutorial by Hendawan oebhakti Page 60 of 68
BAB X Keypad. 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 : Kolom Kolom2 Kolom3 Kolom4 Baris Baris2 Baris3 2 3 4 5 6 7 8 9 COR ME Baris4 CA 0 ET Gambar 0. 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. B B2 K K2 K3 K4 2 3 4 5 6 COR ME PD.2 B3 7 8 9 PD.3 B4 CA 0 ET Gambar 0.2 Menghubungkan Keypad ke Microkontroler Basic AVR Tutorial by Hendawan oebhakti Page 6 of 68
Untuk mengetahui tombol mana yang ditekan maka kita harus melakukan proses scanning pada keypad dengan langkah sebagai berikut : Langkah : PD.0 PD. PD.2 PD.4 PD.5 PD.6 PD.7 0 2 3 4 5 6 7 8 9 COR ME a. et kondisi Port D = 0 b. Baca kondisi Port D : Jika PD.0 = 0 maka Tombol ditekan Jika PD. = 0 maka Tombol 4 ditekan Jika PD.2 = 0 maka Tombol 7 ditekan Jika PD.3 = 0 maka Tombol CA ditekan PD.3 CA 0 ET Langkah 2 : PD.0 PD. PD.2 PD.4 PD.5 PD.6 PD.7 0 2 3 4 5 6 7 8 9 COR ME a. et kondisi Port D = 0 b. Baca kondisi Port D : Jika PD.0 = 0 maka Tombol 2 ditekan Jika PD. = 0 maka Tombol 5 ditekan Jika PD.2 = 0 maka Tombol 8 ditekan Jika PD.3 = 0 maka Tombol 0 ditekan PD.3 CA 0 ET Langkah 3 : PD.0 PD. PD.2 PD.4 PD.5 PD.6 PD.7 0 2 3 4 5 6 7 8 9 COR ME a. et kondisi Port D = 0 b. Baca kondisi Port D : Jika PD.0 = 0 maka Tombol 3 ditekan Jika PD. = 0 maka Tombol 6 ditekan Jika PD.2 = 0 maka Tombol 9 ditekan Jika PD.3 = 0 maka Tombol ET ditekan PD.3 CA 0 ET Langkah 4 : PD.0 PD. PD.2 PD.3 PD.4 PD.5 PD.6 PD.7 0 2 3 4 5 6 7 8 9 CA 0 ET COR ME a. et kondisi Port D = 0 b. Baca kondisi Port D : Jika PD.0 = 0 maka Tombol COR ditekan Jika PD. = 0 maka Tombol ME ditekan Jika PD.2 = 0 maka Tombol UP ditekan Jika PD.3 = 0 maka Tombol DOW ditekan Jika kondisi PD.0..PD.3 = maka tidak ada penekanan tombol Basic AVR Tutorial by Hendawan oebhakti Page 62 of 68
Contoh Program :.include "m8535def.inc".def temp =r22.def dly =r23.def dly =r24.def Key =r25.equ col =0b0 ;Column.equ col2 =0b0 ;Column 2.equ col3 =0b0 ;Column 3.equ col4 =0b0 ;Column 4.org 0x0000 rjmp main main: ldi r6,low(ramed) PL,r6 ldi r6,high(ramed) PH,r6 ldi r6,0xff ddra,r6 ;PortA as put ldi r6,0xf0 ;PD[7:4]=put PD[3:0]=input ddrd,r6 loopx: rcall check_keys rjmp loopx ;------------------------- ; Check keypad sub rine ;------------------------- check_keys: ldi temp,col ;Enable column PORTD,temp rcall delay sbic PID,PD0 ; Pressed key o? rjmp key4 ; if ot, check next key ldi key,0x0 ; if yes... PortA,key ; key=0x0 key4: sbic PID,PD ; Pressed key o4? rjmp key7 ; if ot, check next key ldi key,0x04 ; if yes... PortA,key ; key=0x04 key7: sbic PID,PD2 ; Pressed key o7? rjmp keyca ; if ot, check next key ldi key,0x07 ; if yes... PortA,key ; key=0x07 keyca: sbic PID,PD3 ; Pressed key CA? rjmp key2 ; if ot, check next key ldi key,0x0a ; if yes... PortA,key ; key=0x0a key2: ldi temp,col2 ; Disable the first column... PORTD,temp ; and enable the second rcall delay sbic PID,PD0 ; Pressed key o2? Basic AVR Tutorial by Hendawan oebhakti Page 63 of 68
rjmp key5 ; if ot... ldi key,0x02 ; if yes... PortA,key ; key=0x02 key5: sbic PID,PD ; Pressed key o5? rjmp key8 ; if ot... ldi key,0x05 ; if yes... PortA,key ; key=0x05 key8: sbic PID,PD2 ; Pressed key o8? rjmp key0 ; if ot... ldi key,0x08 ; if yes... PortA,key ; key=0x08 key0: sbic PID,PD3 ; Pressed key o0? rjmp key3 ; if ot... ldi key,0x00 ; if yes... PortA,key ; key=0x00 key3: ldi temp,col3 ; Disable 2nd column... PORTD,temp ; and enable the 3th rcall delay sbic PID,PD0 ; Pressed key o3? rjmp key6 ; if ot... ldi key,0x03 ; if yes... PortA,key ; key=0x03 key6: sbic PID,PD ; Pressed key o6? rjmp key9 ; if ot... ldi key,0x06 ; if yes... PortA,key ; key=0x06 key9: sbic PID,PD2 ; Pressed key o9? rjmp keyet ; if ot... ldi key,0x09 ; if yes... PortA,key ; key=0x09 keyet: sbic PID,PD3 ; Pressed key ET? rjmp keycor ; if ot... ldi key,0x0b ; if yes... PortA,key ; key=0x0b keycor: ldi temp,col4 ; PORTD,temp rcall delay sbic PID,PD0 ; Pressed key COR? rjmp keyme ; if ot... ldi key,0x0c ; if yes... PortA,key ; key=0x0c keyme: sbic PID,PD ; Pressed key ME? rjmp keyup ; if ot... ldi key,0x0d ; if yes... PortA,key ; key=0x0d Basic AVR Tutorial by Hendawan oebhakti Page 64 of 68
keyup: sbic PID,PD2 ; Pressed key UP? rjmp keydw ; if ot... ldi key,0x0e ; if yes... PortA,key ; key=0x0e keydw: sbic PID,PD3 ; Pressed key DOW? rjmp check_keys ; if ot... ldi key,0x0f ; if yes... PortA,key ; key=0x0f ;------------------------ ; Delay sub rine ;------------------------ delay: ldi dly,0x0 dl: ldi dly,0xff dl2: dec dly cpi dly,0x00 brne dl2 dec dly cpi dly,0x00 brne dl Basic AVR Tutorial by Hendawan oebhakti Page 65 of 68
BAB XI erial UART. Inisialisasi UART Berikut register yang perlu disetting untuk mengatur komunikasi serial UART : UBRR (UART Baud Rate Register) UCRB (UART Control and tatus Register B) UCRC (UART Control and tatus Register C) UBRR Digunakan untuk menentukan baud rate UART. Rumus : UBRR = (fosc/6xbaudrate)- UCRB Digunakan untuk mengaktifkan penerimaan dan pengiriman data UART RXE : Jika di set maka akan mengaktifkan penerimaan TXE : Jika di set maka akan mengaktifkan pengiriman RXCIE : Jika di set maka akan mengaktifkan interupsi penerimaan UCRC Digunakan untuk mengatur mode komunikasi UART UREL : Jika di set maka register UCRC bisa diakses, sebab alamat register UCRC dan UBRR sama UCZ2..UCZ0 : Menentukan ukuran karakter yang dikirimkan. Jika UCZ2..UCZ0 = 000 maka ukuran karakter 5 bit Jika UCZ2..UCZ0 = 00 maka ukuran karakter 6 bit Jika UCZ2..UCZ0 = 00 maka ukuran karakter 7 bit Jika UCZ2..UCZ0 = 0 maka ukuran karakter 8 bit Jika UCZ2..UCZ0 = 00-0 tidak digunakan Jika UCZ2..UCZ0 = maka ukuran karakter 9 bit Contoh inisialisasi UART : Basic AVR Tutorial by Hendawan oebhakti Page 66 of 68
.equ fclock =059200.equ baud_rate =9200.equ ubbr_value =(fclock / (6*baud_rate)) - init_usart: ldi temp,high(ubbr_value) UBRRH,temp ldi temp,low(ubbr_value) UBRRL,temp ldi temp,(<<rxe) (<<TXE) (<<RXCIE) UCRB,temp ldi temp,(<<urel) (3<<UCZ0) UCRC,temp 2. Pengiriman Data Pengiriman data dilakukan per byte menunggu UDR kosong (UDR = register tempat menyimpan data UART, menjadi satu dengan register UBRR). Jika kosong, maka bit UDRE(UART Data Register Empty) pada UCRA akan set sehingga siap menerima data baru yang akan dikirim. Contoh pengiriman UART : usart_tx: sbis UCRA,UDRE rjmp usart_tx UDR,txbyte 3. Penerimaan Data Penerimaan data dilakukan dengan memeriksa bit RXC (UART Receive Complete) pada register UCRA. RXC akan set jika ada data yang siap dibaca. Data yang diterima akan disimpan pada register UDR. Contoh penerimaan UART : usart_rx: sbis UCRA,RXC rjmp usart_rx in rxbyte,udr Basic AVR Tutorial by Hendawan oebhakti Page 67 of 68
Contoh Program :.include"m8535def.inc".def temp =r6.def txbyte =r7.def rxbyte =r8.equ fclock =059200.equ baud_rate =9200.equ ubbr_value =(fclock / (6*baud_rate)) -.org 0x0000 rjmp main main: ldi temp,low(ramend) spl,temp ldi temp,high(ramend) sph,temp rcall init_usart loop: ldi zl,low(2*msg) ldi zh,high(2*msg) load: lpm mov txbyte,r0 cpi txbyte,0 breq done rcall usart_tx inc zl rjmp load done: rjmp done init_usart: ldi ldi ldi ldi usart_tx: sbis rjmp usart_rx: sbis rjmp in msg:.db temp,high(ubbr_value) UBRRH,temp temp,low(ubbr_value) UBRRL,temp temp,(<<rxe) (<<TXE) (<<RXCIE) UCRB,temp temp,(<<urel) (3<<UCZ0) UCRC,temp UCRA,UDRE usart_tx UDR,txbyte UCRA,RXC usart_rx rxbyte,udr "******Welcome To Politeknik Batam******",3,0,0 Keterangan : angka 3,0 adalah kode ACII untuk Enter. Jadi pesan akan ditampilkan pada baris baru di editor Hyper Terminal. Angka 0 menunjukkan akhir karakter dari pesan yang dikirim. Basic AVR Tutorial by Hendawan oebhakti Page 68 of 68