Docstoc

basic-avr-microcontroller-tutorial_v3

Document Sample
basic-avr-microcontroller-tutorial_v3 Powered By Docstoc
					Basic AVR Microcontroller Tutorial




               Oleh :
        Hendawan Soebhakti, ST




             Agustus 2007

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

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




Basic AVR Tutorial by Hendawan Soebhakti                  Page 2 of 68
Electrical Engineering – Batam Polytechnic
                                                                                                        BAB I
                                                                     AVR ATMega 8535L

1.1 Sekilas Tentang AVR

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

Arsitektur mikrokontroler jenis AVR pertamakali dikembangkan pada tahun 1996 oleh dua orang mahasiswa
Norwegian Institute of Technology yaitu Alf-Egil Bogen dan Vegard Wollan.

Mikrokontroler AVR kemudian dikembangkan lebih lanjut oleh Atmel. Seri pertama AVR yang dikeluarkan adalah
mikrokontroler 8 bit AT90S8515, dengan konfigurasi pin yang sama dengan mikrokontroler 8051, termasuk address
dan data bus yang termultipleksi.

Mikrokontroler AVR menggunakan teknologi RISC dimana set instruksinya dikurangi dari segi ukurannya dan
kompleksitas mode pengalamatannya. Pada awal era industri komputer, bahasa pemrograman masih menggunakan
kode mesin dan bahasa assembly. Untuk mempermudah dalam pemrograman para desainer komputer kemudian
mengembangkan bahasa pemrograman tingkat tinggi yang mudah dipahami manusia. Namun akibatnya, instruksi
yang ada menjadi semakin komplek dan membutuhkan lebih banyak memori. Dan tentu saja siklus eksekusi
instruksinya menjadi semakin lama. Dalam AVR dengan arsitektur RISC 8 bit, semua instruksi berukuran 16 bit dan
sebagian besar dieksekusi dalam 1 siklus clock. Berbeda dengan mikrokontroler MCS-51 yang instruksinya bervariasi
antara 8 bit sampai 32 bit dan dieksekusi selama 1 sampai 4 siklus mesin, dimana 1 siklus mesin membutuhkan 12
periode clock.

Dalam perkembangannya, AVR dibagi menjadi beberapa varian yaitu AT90Sxx, ATMega, AT86RFxx dan ATTiny.
Pada dasarnya yang membedakan masing-masing varian adalah kapasitas memori dan beberapa fitur tambahan saja.

1.2 Karakteristik mikrokontroler AVR seri ATMega8535

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




Basic AVR Tutorial by Hendawan Soebhakti                                                          Page 3 of 68
Electrical Engineering – Batam Polytechnic
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                                                          Page 4 of 68
Electrical Engineering – Batam Polytechnic
•    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                                                                  Page 5 of 68
Electrical Engineering – Batam Polytechnic
Bit 4 – S : Sign Bit
Bit S merupakan hasil exlusive or dari Negative Flag N dan Two’s Complement Overflow Flag V.

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

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

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

1.4 Bahasa Assembly AVR

Bahasa yang dipakai untuk memprogram mikrokontroler AVR adalah bahasa assembly AVR atau bahasa C. Dalam
buku ini semua program ditulis dalam bahasa assembly AVR. Berikut adalah contoh sebuah program aplikasi untuk
mikrokontroler AVR :
.include “m8535def.inc”
.org 0x0000
          rjmp main                                   Inisialisasi program

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

      ldi           r16,0xff
      out           ddra,r16                                Program utama
      out           PortA,r16
      cbi           PortA,0
      cbi           PortA,1
stop: rjmp          stop

Sebuah program harus terdiri dari dua bagian, yaitu inisialisasi program dan program utama. Inisialisasi program harus
disertakan agar program utama dapat berjalan. Berikut adalah urutan langkah inisialisasi program :

1.   Menentukan jenis mikrokontroler yang digunakan dengan cara memasukkan file definisi device (m8535def.inc) ke
     dalam program utama.

     .include “m8535def.inc”                                ;

2.   Menuliskan original address program, yaitu 0x0000. Kemudian dilanjutkan dengan instruksi rjmp / relative jump ke
     label main. Hal ini dimaksudkan agar program memory tidak tumpang tindih dengan data memory.

     .org           0x0000
     rjmp           main

3.   Menentukan isi Stack Pointer dengan address terakhir RAM (RAMEND). Untuk ATMega8535 yaitu 0x025F. Ini
     dimaksudkan agar program utama mulai ditulis setelah address terakhir RAM.

     main:          ldi       r16,low(RAMEND)                         ; low byte address RAM = 5F
                    out       SPL,r16
                    ldi       r16,high(RAMEND)                        ; high byte address RAM = 02
                    out       SPH,r16
Basic AVR Tutorial by Hendawan Soebhakti                                                              Page 6 of 68
Electrical Engineering – Batam Polytechnic
                                                                                                             BAB II
                                                                   Operasi Port Input Output

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

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

•   Portx (Port Data Register)
    Register Portx digunakan untuk 2 keperluan yaitu untuk jalur output atau untuk mengaktifkan resistor pullup.
    1. Portx berfungsi sebagai output jika DDRx = 1 maka :
         Portxn = 1 maka pin Pxn akan berlogika high.
         Portxn = 0 maka pin Pxn akan berlogika low.

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

    Tabel 2.1 Konfigurasi Port
      DDRxn Portxn               I/O      Pull up        Comment
         0            0       Input      No           Tri state (Hi-Z)
         0            1       Input      Yes          Pull up aktif
         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                                                               Page 7 of 68
Electrical Engineering – Batam Polytechnic
    Contoh Program 1:

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

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

                 ldi      r16,0x00
                 out      ddra,r16          ; PortA as input
                 ldi      r16,0xff
                 out      ddrb,r16          ; PortB as output
                 out      ddrc,r16          ; PortC as output

    ulang:       in       r16,PortA
                 out      PortB,r16

                 ldi      r16,0x0f
                 out      PortC,r16

                 cbi      PortC,0
                 sbic     PortA,5
                 cbi      PortC,1
                 sbi      PortC,6
                 sbis     PortA,5
                 sbi      PortC,7

                 ldi      r16,0x00
                 out      PortB,r16
                 out      PortC,r16
                 rjmp     ulang


    Latihan :
    1. Buatlah program agar dapat membaca data pada PortC dan mengeluarkan data tersebut pada PortA.
    2. Buatlah program agar PortA mengeluarkan data 20h jika PortB,1 berlogika 0.
    3. Buatlah program agar PortA mengeluarkan data 15h jika PortC,1 dan PortD,2 berlogika 1, selain kondisi
         tersebut PortA mengeluarkan data 00h.




Basic AVR Tutorial by Hendawan Soebhakti                                                     Page 8 of 68
Electrical Engineering – Batam Polytechnic
    Jawaban Latihan no 3:

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

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

                 ldi        r16,0xff
                 out        ddra,r16     ; PortA as output
                 ldi        r16,0x00
                 out        ddrc,r16     ; PortC as output
                 out        ddrd,r16     ; PortD as output

                 ldi        r16,0x00
                 ldi        r17,0x15
    ulang:       sbis       PortC,1
                 rjmp       ulang1
                 sbis       PortD,2
                 rjmp       ulang1
                 out        PortA,r17
                 rjmp       ulang
    ulang1:      out        PortA,r16
                 rjmp       ulang




Basic AVR Tutorial by Hendawan Soebhakti                     Page 9 of 68
Electrical Engineering – Batam Polytechnic
                                                                                                        BAB III
                                                                          Operasi Aritmatika
3.1 Operasi Aritmatika
Instruksi Aritmatika
add        : Menambahkan isi dua register.
              Contoh : add r15,r14              ; r15=r15+r14
adc        : Menambahkan isi dua register dan isi carry flag
              Contoh : adc r15,r14              ; r15=r15+r14+C

sub     : Mengurangi isi dua register.
          Contoh : sub r19,r14                ; r19=r19-r14
mul     : Mengalikan dua register. Perkalian 8 bit dengan 8 bit menghasilkan bilangan 16 bit yang disimpan di r0
          untuk byte rendah dan di r1 untuk byte tinggi. Untuk memindahkan bilangan 16 bit antar register
          digunakan instruksi movw (copy register word)
          Contoh : mul r21,r20                ; r1:r0=r21*r20

3.2 Contoh Program
• Penjumlahan
     .include "m8535def.inc"
     .org 0x00
                 rjmp main
     main:       ldi  r16,low(RAMEND)
                 out  SPL,r16
                 ldi  r16,high(RAMEND)
                 out  SPH,r16

                 ldi       r16,0x80
                 ldi       r17,0x80
                 add       r16,r17
                 ldi       r18,0x02
                 adc       r16,r18
    here:        rjmp      here

•   Pengurangan
    .include "m8535def.inc"
    .org 0x00
                rjmp main
    main:       ldi  r16,low(RAMEND)
                out  SPL,r16
                ldi  r16,high(RAMEND)
                out  SPH,r16

                 ldi       r16,0x09
                 ldi       r17,0x06
                 sub       r16,r17
                 ldi       r17,0x03
                 sub       r16,r17
                 ldi       r17,0x06
                 sub       r16,r17
    here:        rjmp      here

Basic AVR Tutorial by Hendawan Soebhakti                                                           Page 10 of 68
Electrical Engineering – Batam Polytechnic
•   Perkalian
    .include "m8535def.inc"
    .org 0x00
              rjmp main

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

                ldi      r16,5
                ldi      r17,100
                mul      r16,r17
                movw     r17:r16,r1:r0       ; Copy r1:r0 to r17:r16
    here:       rjmp     here

•   Pembagian
    .include "m8535def.inc"
    .org 0x00
    .def      drem8u     =r15                ;remainder/sisa
    .def      dres8u     =r16                ;result/hasil
    .def      dd8u       =r16                ;dividend/yang dibagi
    .def      dv8u       =r17                ;divisor/pembagi
    .def      dcnt8u     =r18                ;loop counter

                rjmp     main

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

                ldi      dd8u,4
                ldi      dv8u,2
                rcall    div8u
    here:       rjmp     here
    ;
    div8u:      sub      drem8u,drem8u     ;clear remainder and carry
                ldi      dcnt8u,9          ;init loop counter
    d8u_1:      rol      dd8u              ;shift left dividend
                dec      dcnt8u            ;decrement counter
                brne     d8u_2             ;if done
                ret                        ;return
    d8u_2:      rol      drem8u            ;shift dividend into remainder
                sub      drem8u,dv8u       remainder = remainder - divisor
                brcc     d8u_3             ;if result negative
                add      drem8u,dv8u       ;restore remainder
                clc                  ;clear carry to be shifted into result
                rjmp     d8u_1       ;else
    d8u_3:      sec                  ;set carry to be shifted into result
                rjmp     d8u_1


Basic AVR Tutorial by Hendawan Soebhakti                               Page 11 of 68
Electrical Engineering – Batam Polytechnic
    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                                     Page 12 of 68
Electrical Engineering – Batam Polytechnic
                                                                                  BAB IV
                                                                        Operasi Logika
4.1 Operasi Logika
Instruksi Logika
and        : Untuk meng-and-kan dua register
              Contoh : and r23,r27                  ; r23=r23 and r27
andi : Untuk meng-and-kan register dengan konstanta immediate
              Contoh : andi r25,0b11110000
or         : Untuk meng-or-kan dua register
              Contoh : or r18,r17                   ; r18=r18 or r17
ori        : Untuk meng-or-kan register dengan konstanta immediate
              Contoh : ori r15,0xfe
inc        : Untuk menaikkan satu isi sebuah register
              Contoh : inc r14
dec        : Untuk menurunkan satu isi sebuah register
              Contoh : dec r15
clr        : Untuk mengosongkan (membuat jadi nol) isi register
              Contoh : clr r15                      ; r15=0x00
ser        : Set all bit in register. Membuat jadi satu isi register
              Contoh : ser r16                      ; r16=0xff

4.2 Contoh Program
• Operasi Logika

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

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

    ldi          r16,0b01110111
    ldi          r17,0b00001111
    and          r16,r17

    ori          r16,0b00001000
    clr          r16
    inc          r16
    ser          r16
    dec          r16

    here:
    rjmp         here




Basic AVR Tutorial by Hendawan Soebhakti                                       Page 13 of 68
Electrical Engineering – Batam Polytechnic
   Latihan :
   1. Buatlah program untuk memecahkan persoalan berikut :
         PinA                   r20
         PinB                                 PortC

         0xf0

   2.   Buatlah program dengan ketentuan sbb :

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

   Jawaban no 2:
   .include "m8535def.inc"
   .org 0x00

   rjmp             main

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

   mulai:           sbic              PortA,1                    ; skip if PortA,1 = 0
                    rjmp              cek10_11
                    rjmp              cek00_01

   cek10_11:                                                     ; PortA,1=1
            sbic                      PortA,0                    ; PortA,1=1, PortA,0=0 (10)
            rjmp                      setAll                     ;
   ulang:   ldi                       r21,10
            dec                       r21
            dec                       r21
            dec                       r21
            dec                       r21
            dec                       r21
            dec                       r21
            dec                       r21
            dec                       r21
            dec                       r21
            dec                       r21
            rjmp                      ulang

   setAll:          ser               r20
                    ser               r21
                    rjmp              mulai
    ;
    cek00_01:                                                    ; PortA,1=0
                  sbis            PortA,0                        ; skip if PortA,0=1
                  rjmp            clearAll
Basic AVR Tutorial by Hendawan Soebhakti                                                          Page 14 of 68
Electrical Engineering – Batam Polytechnic
    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                 r20
             clr                 r21
             rjmp                mulai




Basic AVR Tutorial by Hendawan Soebhakti     Page 15 of 68
Electrical Engineering – Batam Polytechnic
                                                                                       BAB V
                                                                        Percabangan

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

5.2 Contoh Program
•    Operasi Percabangan

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

    main:       ldi        r16,low(RAMEND)
                out        SPL,r16
                ldi        r16,high(RAMEND)
                out        SPH,r16
                clr        r16         ; r16=0x00
    naik:       inc        r16         ; increment r16
                cpi        r16,5       ; r16=5 ?
                breq       lagi        ; branch to lagi if r16 = 5
                rjmp       naik        ; jump to naik if r16 ≠ 5

    lagi:       ldi        r18,5         ;   r18 = 5
                dec        r16           ;   decrement r16
                cp         r16,r18       ;   compare r16 & r18
                brne       lompat        ;   branch to lompat if r16=r18
                rjmp       lagi          ;   jump to lagi if r16≠r18

    lompat:     rcall rutin1
                rcall rutin2
    henti:      rjmp henti

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

Basic AVR Tutorial by Hendawan Soebhakti                                           Page 16 of 68
Electrical Engineering – Batam Polytechnic
    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                                        Page 17 of 68
Electrical Engineering – Batam Polytechnic
                                                                                                      BAB VI
                                                                                             Interupsi
Interupsi adalah kondisi yang memaksa mikrokontroler menghentikan sementara eksekusi program utama untuk
mengeksekusi rutin interrupt tertentu / Interrupt Service Routine (ISR)

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


                                                   Main Program

                                       (a). Program execution without interrupts


                         ISR                 ISR                                    ISR




                Main            Main                                 Main                   Main

                Time

                                        (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                                                           Page 18 of 68
Electrical Engineering – Batam Polytechnic
         7         6           5             4            3             2            1             0

       SM2         SE        SM1          SM0          ISC11        ISC10         ISC01        ISC00


 MCUCR / MCU Control Register
 Bit          Symbol         Fuction

 7,5,4        SM2..0         Sleep Mode Select Bits. Digunakan untuk memilih mode sleep MCU
                             SM2           SM1             SM0            Sleep Mode
                             0             0               0              Idle
                             0             0               1              ADC Noise Reduction
                             0             1               0              Power-down
                             0             1               1              Power-save
                             1             0               0              Reserved
                             1             0               1              Reserved
                             1             1               0              Standby
                             1             1               1              Extended Standby

 6            SE             Sleep Enable. Digunakan untuk mengaktifkan mode Sleep dengan memberikan logika
                             1 pada SE sebelum Sleep dijalankan . Setelah Wake-up harus segera diberi logika 0.

 3,2          ISC11, ISC10 Interrupt Sense Control 1 Bit. Digunakan untuk memilih jenis pulsa trigger External
                           Interrupt 1 (INT1).
                           ISC11            ISC10           Description
                           0                0               The low level of INT1 generates an interrupt request.
                           0                1               Any logical change on INT1 generate an interrupt request
                           1                0               The falling edge of INT1 generate an interrupt request.
                           1                1               The rising edge of INT1 generate an interrupt request.

 1,0          ISC01, ISC00 Interrupt Sense Control 0 Bit. Digunakan untuk memilih jenis pulsa trigger External
                           Interrupt 0 (INT0).
                           ISC01            ISC00           Description
                           0                0               The low level of INT0 generates an interrupt request.
                           0                1               Any logical change on INT0 generate an interrupt request
                           1                0               The falling edge of INT0 generate an interrupt request.
                           1                1               The rising edge of INT0 generate an interrupt request.




Basic AVR Tutorial by Hendawan Soebhakti                                                               Page 19 of 68
Electrical Engineering – Batam Polytechnic
         7         6         5             4            3             2            1             0

       INT1       INT0    INT2            -             -             -        IVSEL          IVCE


 GICR / General Interrupt Control Register

 Bit          Symbol       Fuction

 7            INT1         External Interrupt Request 1 Enable. Digunakan untuk mengaktifkan INT1 dengan syarat
                           bit I pada SREG juga diset .

 6            INT0         External Interrupt Request 0 Enable. Digunakan untuk mengaktifkan INT0 dengan syarat
                           bit I pada SREG juga diset .

 5            INT1         External Interrupt Request 2 Enable. Digunakan untuk mengaktifkan INT2 dengan syarat
                           bit I pada SREG juga diset .

 4,3,2        -            Reserved

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

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




Basic AVR Tutorial by Hendawan Soebhakti                                                             Page 20 of 68
Electrical Engineering – Batam Polytechnic
    Contoh Program :

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

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

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

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

    loop:    rjmp        loop
    ex_int0: push        r16
             in          r16,SREG
             push        r16

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




Basic AVR Tutorial by Hendawan Soebhakti     Page 21 of 68
Electrical Engineering – Batam Polytechnic
                                                                                 BAB VII
                                                                     Timer/Counter
1. Prescaler
Timer pada dasarnya hanya menghitung pulsa clock. Frekuensi pulsa clock yang dihitung
tersebut bisa sama dengan frekuensi crystal yang dipasang atau dapat diperlambat
menggunakan prescaler dengan faktor 8, 64, 256 atau 1024. Berikut penjelasannya :
Sebuah AVR menggunakan crystal dengan frekuensi 8 MHz dan timer yang digunakan adalah
timer 16 bit, maka maksimum waktu timer yang bisa dihasilkan adalah :
                      TMAX    = 1/fCLK x (FFFFh+1)
                              = 0.125uS x 65536
                              = 0.008192 S

Untuk menghasilkan waktu timer yang lebih lama dapat digunakan prescaler, misalnya 1024,
maka maksimum waktu timer yang bisa dihasilkan adalah :
                   TMAX     = 1/fCLK x (FFFFh+1) x N
                            = 0.125uS x 65536 x 1024
                            = 8.388608 S

Ketika presacaler digunakan, waktu timer dapat diperpanjang namun tingkat ketelitiannya
menjadi turun. Misalnya dengan prescaler 1024 nilai timer akan bertambah 1 setiap kelipatan
1024 pulsa dan membutuhkan waktu 1/fCLK x 1024 = 0.125uS x 1024 = 128 uS bandingkan
tingkat resolusi ini jika tanpa precsaler (0.125uS).

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




                              Gambar 7.1 Blok Diagram Timer 16 Bit


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


            7         6         5             4             3              2            1     0

        OCIE2       TOIE2    TICIE1       OCIE1A       OCIE1B          TOIE1      OCIE0     TOIE0


    TIMSK / Timer/Counter Interrupt Mask Register


    Bit            Symbol      Fuction

    7              OCIE2       Timer/Counter2 Output Compare Match Interrupt Enable .

    6              TOIE2       Timer/Counter2 Overflow Interrupt Enable.

    5              TICIE1      Timer1 Input Capture Interrupt Enable

    4              OCIE1A      Timer/Counter1A Output Compare Match Interrupt Enable .

    3              OCIE1B      Timer/Counter1B Output Compare Match Interrupt Enable .

    2              TOIE1       Timer/Counter1 Overflow Interrupt Enable.

    4              OCIE0       Timer/Counter0 Output Compare Match Interrupt Enable .

    0              TOIE0       Timer/Counter0 Overflow Interrupt Enable.




Basic AVR Tutorial by Hendawan Soebhakti                                                          Page 23 of 68
Electrical Engineering – Batam Polytechnic
            7              6       5             4            3         2      1       0

          OCF2            TOV2   ICF1        OCF1A        OCF1B        TOV1   OCF0   TOV0


    TIFR / Timer/Counter Interrupt Flag Register


    Bit               Symbol     Fuction

    7                 OCF2       Output Compare Flag2.

    6                 TOV2       Timer/Counter2 Overflow Flag.

    5                 ICF1       Timer1 Input Capture Interrupt Flag

    4                 OCF1A      Output Compare Flag1A.

    3                 OCF1B      Output Compare Flag1B.

    2                 TOV1       Timer/Counter1 Overflow Flag.

    4                 OCF0       Output Compare Flag0.

    0                 TOV0       Timer/Counter0 Overflow Flag.




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




                CS12..10: Clock Select bits ;
                Tiga bit pemilih prescaler timer/counter 1 dan hubungannya dengan clock eksternal pada
                pin T1.




4. Perhitungan Waktu Timer
Basic AVR Tutorial by Hendawan Soebhakti                                                   Page 24 of 68
Electrical Engineering – Batam Polytechnic
                                                       Ttimer × f CLK
                             TCNT = (1 + FFFF h) − (                  )
                                                              N
Dimana :
TCNT            : Nilai timer (Hex)
f CLK           : Frekuensi clock (crystal) yang digunakan (Hz)
Ttimer          : Waktu timer yang diinginkan (detik)
N               : Prescaler (1, 8, 64, 256, 1024)
1+FFFFh         : Nilai max timer adalah FFFFh dan overflow saat FFFFh ke 0000h

Contoh :

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

                                                1 × 11059200  
                           TCNT = 1 + FFFFh) − 
                                                              
                                                     1024    
                           TCNT = 10000h − 10800d
                           TCNT = 10000h − 2 A30h
                           TCNT = D5D0h
Dengan demikian nilai TCNTH = D5h dan TCNTL = D0h


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

TCNT = (1 + FFFFh) − FFFFh
         = (10000 h) − (FFFFh)
         = 0001 h
Dengan nilai maksimum FFFFh maka akan dihasilkan waktu timer selama :
          Ttimer × 11059200
FFFFh = (                   )
                  1024
 65535 = (Ttimer × 10800)
  Ttimer = 6,0680555555 detik




Basic AVR Tutorial by Hendawan Soebhakti                                           Page 25 of 68
Electrical Engineering – Batam Polytechnic
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                                        Page 26 of 68
Electrical Engineering – Batam Polytechnic
    Contoh Program :

    .include "m8535def.inc"
    .equ timer_value = 0xD5D0
    .org 0x0000
       rjmp mulai

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

    ulang:
       ldi      r16,0xff
       out      ddra,r16
       out      PortA,r16
       rcall    timer1d
       ldi      r16,0x00
       out      PortA,r16
       rcall    timer1d
       rjmp     ulang

    timer1d:
       ldi      r16,0b00000100                 ;aktifkan enable interupt
       out      TIMSK,r16
       ldi      r16,high(timer_value)         ;masukkan nilai timer
       out      TCNT1H,r16
       ldi      r16,low(timer_value)
       out      TCNT1L,r16
       ldi      r16,0b00000101                 ;masukkan prescaler 1024
       out      TCCR1B,r16

    looptimer:
       in    r17,TIFR
       sbrs r17,TOV1                     ;tunggu sampai timer1 overflow set
       rjmp looptimer
       ldi   r16,0b00000100              ;TOV1 dinolkan dengan memberi logika 1
       out   TIFR,r16
       ret




Basic AVR Tutorial by Hendawan Soebhakti                                   Page 27 of 68
Electrical Engineering – Batam Polytechnic
                                                                                  BAB VIII
                                                Pengendalian Motor Stepper

1. Dasar Motor Stepper

Motor stepper adalah sebuah peralatan elektromekanik yang mengubah pulsa elektrik menjadi
pergerakan mekanik. Shaft atau kumparan motor stepper berputar per step ketika pulsa elektrik
dimasukkan ke kumparan tersebut dengan urutan yang benar. Urutan pemberian pulsa ke motor
stepper akan menyebabkan arah putaran yang berbeda. Sedangkan besarnya frekuensi dari
pulsa akan mempengaruhi kecepatan putaran motor stepper.

Motor Stepper Unipolar




                                   Gambar 2.1 Motor Stepper Unipolar

Motor stepper unipolar baik tipe 5 atau 6 kabel biasanya dihubungkan seperti pada gambar 2.1,
dengan sebuah center tap pada tiap kumparan. Pada penggunaannya, center tap dihubungkan
ke supply positif, dan dua ujung kumparan lainnya dihubungkan ke ground.

Bagian rotor motor pada gambar 2.1 dibuat dari magnet permanent dengan 6 kutub, 3 kutub
utara dan 3 kutub selatan.

Seperti terlihat pada gambar, arus mengalir dari center tap kumparan 1 ke terminal a
menyebabkan kutub stator yang atas menjadi berkutub utara dan kutub stator yang bawah
berkutub selatan. Kondisi ini menyebabkan rotor berada pada posisi seperti gambar 2.1.

Jika arus pada kumparan 1 dimatikan dan kumparan 2 dinyalakan, maka rotor akan berputar 30
derajat, atau 1 step. Untuk berputar secara kontinyu, kita hanya perlu menghubungkan supplay
power ke 2 kumparan secara berurutan.

Dengan asumsi bahwa logika 1 berarti arus mengalir pada kumparan motor, maka berikut adalah
urutan yang harus dipenuhi agar motor dapat berputar sebanyak 24 step atau 2 putaran :

              Kumparan 1a 1000100010001000100010001
              Kumparan 1b 0010001000100010001000100
              Kumparan 2a 0100010001000100010001000
              Kumparan 2b 0001000100010001000100010
              waktu --->




Basic AVR Tutorial by Hendawan Soebhakti                                        Page 28 of 68
Electrical Engineering – Batam Polytechnic
             1                              1                            1                               1
             N                                                           S

             S




                                                                        N
                                        N        S




                                                                                                             N
                                                                                                     S
      N             N




                                                                   S




                                                                             S
 2                      2   2   N   S                N   S 2   2                     2   2   S                        N   2




                                                                                                                  S
                                                                                                 N
      S             S




                                                                   N




                                                                                N
                                        N        S




                                                                                                             N
                                                                                                     S
             N




                                                                         S
             S                                                           N
             1                              1                            1                               1


          Step 1                        Step 2                         Step 3                        Step 4


             1                              1                            1                               1
             N                                                           S
             S




                                                 S                       N
                                        N                                                            S        N
                    N




                                                                   S             S
       N




                                                     N
 2                      2                                      2                     2   2   S                        N 2
                                    S
                            2                            S 2
                                                                                                 N
                                N
                                                                                                                  S
                                                                   N            N
                    S
       S




                                        N        S                       S                           S        N
             N




             S                                                           N
             1                              1                            1                               1


          Step 5                        Step 6                         Step 7                        Step 8

             1                              1                            1                               1
             N                                                           S
             S




                                                                         N


                                                                                                     S        N
                                        N


                                                 S
       N




                    N




                                                                                S
                                                                   S




 2                      2   2   N                        S 2   2                     2   2   S   N                S   N 2
                                                     N
                                    S
       S




                    S




                                                                                N
                                                                   N




                                                                                                     S        N
                                        N


                                                 S
             N




                                                                         S




             S                                                           N
             1                              1                            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                                                                     Page 29 of 68
Electrical Engineering – Batam Polytechnic
Skema Rangkaian Driver Motor Stepper


                                                +12V
                                                                                10K
                             10K


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




                                                                                10K
                             10K                       MOTOR STEPPER


                                                                                 TIP 122
                                       1N4001                          1N4001
PA.1                                                                                                PA.2
               1K            TIP 122
                                                                                      1K




                              Gambar 2.3 Skema Rangkaian Driver Motor Stepper

2. Kendali Arah Putaran

Arah putaran motor stepper ditentukan oleh arah urutan aktifasi kumparannya. Secara program,
ini bisa dilakukan dengan mengubah arah pergeseran bit.

Jika arah pergesarannya ke kiri, maka motor stepper akan berputar kearah kiri pula (CCW)
Jika arah pergeserannya ke kanan, maka motor stepper akan berputar ke arah kanan (CW)

               Arah Putaran CW                                    Arah Putaran CCW
       .include "m8535def.inc"                             .include "m8535def.inc"
       .org     0x0000                                     .org     0x0000
       rjmp     main                                       rjmp     main

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

                    ldi     r19,0x08                                    ldi      r19,0x01
       Step:        out     PortA,r19                      Step:        out      PortA,r19
                    rcall   delay                                       rcall    delay
                    ror     r19                                         rol      r19
                    cpi     r19,0x01                                    cpi      r19,0x08
                    brne    Step                                        brne     Step
                    out     PortA,r19                                   out      PortA,r19
                    rcall   delay                                       rcall    delay
                    ldi     r19,0x08                                    ldi      r19,0x01
                    rjmp    Step                                        rjmp     Step


Basic AVR Tutorial by Hendawan Soebhakti                                                   Page 30 of 68
Electrical Engineering – Batam Polytechnic
    delay:      ldi      r20,0x02              delay:      ldi    r20,0x02
    dl1:        ldi      r21,0xff              dl1:        ldi    r21,0xff
    dl2:        ldi      r22,0xff              dl2:        ldi    r22,0xff
    dl3:        dec      r22                   dl3:        dec    r22
                cpi      r22,0x00                          cpi    r22,0x00
                brne     dl3                               brne   dl3
                dec      r21                               dec    r21
                cpi      r21,0x00                          cpi    r21,0x00
                brne     dl2                               brne   dl2
                dec      r20                               dec    r20
                cpi      r20,0x00                          cpi    r20,0x00
                brne     dl1                               brne   dl1
                ret                                        ret

Pada program, jika instruksi ror r19 diganti menjadi rol   r19
Maka arah putaran motor stepper akan berubah.

3. Kendali Posisi

Derajat putaran motor stepper ditentukan oleh banyaknya jumlah pergeseran aktifasi
kumparannya. Secara program, ini bisa dilakukan dengan mengubah jumlah pergeseran bit.

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      r16,low(RAMEND)
                out      SPL,r16
                ldi      r16,high(RAMEND)
                out      SPH,r16
                ldi      r16,0xff
                out      ddra,r16
                ldi      r19,0x08

                ldi      r17,25
    Loop:       rcall    Step
                dec      r17
                cpi      r17,0
                brne     Loop
    Stop:       nop
                rjmp     Stop
    Step:       cpi      r19,0x01
                brne     Shift
                out      PortA,r19
                rcall    delay
                ldi      r19,0x08
                ret
    Shift:      out      PortA,r19
                rcall    delay
                ror      r19
                ret

Basic AVR Tutorial by Hendawan Soebhakti                                  Page 31 of 68
Electrical Engineering – Batam Polytechnic
    delay:      ldi      r20,0x02
    dl1:        ldi      r21,0xff
    dl2:        ldi      r22,0xff
    dl3:        dec      r22
                cpi      r22,0x00
                brne     dl3
                dec      r21
                cpi      r21,0x00
                brne     dl2
                dec      r20
                cpi      r20,0x00
                brne     dl1
                ret

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

4. Kendali Kecepatan

Kecepatan motor stepper ditentukan oleh kecepatan aktifasi kumparannya. Secara program, ini
bisa dilakukan dengan mengubah delay waktu pergeseran tiap bitnya. Semakin cepat delay
waktunya, kecepatan motor stepper juga akan bertambah.

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

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

                ldi      r19,0x08
    Step:       out      PortA,r19
                rcall    delay
                ror      r19
                cpi      r19,0x01
                brne     Step
                out      PortA,r19
                rcall    delay
                ldi      r19,0x08
                rjmp     Step
    delay:      ldi      r20,0x20
    dl1:        ldi      r21,0xff
    dl2:        ldi      r22,0xff
    dl3:        dec      r22
                cpi      r22,0x00
                brne     dl3
                dec      r21
                cpi      r21,0x00
                brne     dl2
                dec      r20
                cpi      r20,0x00
Basic AVR Tutorial by Hendawan Soebhakti                                       Page 32 of 68
Electrical Engineering – Batam Polytechnic
                 brne     dl1
                 ret

Jika instruksi ldi     r20,0x20 menjadi ldi   r20,0x02 maka kecepatan motor stepper akan
bertambah.

5. Kendali Torsi

Torsi motor stepper ditentukan oleh banyaknya jumlah kumparan yang aktif pada saat yang
sama. Torsi akan bertambah besar jika 2 kumparan aktif pada saat yang sama.
Secara program, ini bisa dilakukan dengan mengubah kondisi bit.

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

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

                 ldi      r19,0x4c
    Step:        out      PortA,r19
                 rcall    delay
                 ror      r19
                 cpi      r19,0x09
                 brne     Step
                 out      PortA,r19
                 rcall    delay
                 ldi      r19,0x4c
                 rjmp     Step

    delay:       ldi      r20,0x20
    dl1:         ldi      r21,0xff
    dl2:         ldi      r22,0xff
    dl3:         dec      r22
                 cpi      r22,0x00
                 brne     dl3
                 dec      r21
                 cpi      r21,0x00
                 brne     dl2
                 dec      r20
                 cpi      r20,0x00
                 brne     dl1
                 ret

Jika instruksi   ldi      r19,0x4c
                 cpi      r19,0x09
diubah menjadi
                 ldi      r19,0x08
                 cpi      r19,0x01

maka torsi motor stepper akan turun menjadi setengahnya.
Basic AVR Tutorial by Hendawan Soebhakti                                     Page 33 of 68
Electrical Engineering – Batam Polytechnic
                                                                                                        BAB IX
                                                                   Liquid Crystal Display
1. Konfigurasi Pin LCD 16x2




                              LIQUID CRYSTAL DISPLAY
                              16 CHARACTER X 2 LINES

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

              1                                                                                  16



                              Gambar 9.1 Konfigurasi Pin LCD 16 Karakter x 2 Baris

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




Basic AVR Tutorial by Hendawan Soebhakti                                                             Page 34 of 68
Electrical Engineering – Batam Polytechnic
2. Rangkaian Skematik Mikrokontroler dan LCD 16x2


                                                               2x16 LCD

                            VSS VCC VEE     RS    RW       E   DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7                A   K



                                  +5V




                                           PA.4



                                                       PA.6




                                                                               PA.0

                                                                                       PA.1

                                                                                              PA.2

                                                                                                      PA.3
                            +5V

                                                                                      +5V        D1

                                      R1
                                      5K
                                                                                                 1N4001
                                           Gambar 9.2 Rangkaian Skematik LCD

3. Fungsi Register LCD

Modul display LCD sudah dilengkapi dengan sebuah kontroler yang memiliki dua register 8 bit yaitu instruction register
(IR) dan data register (DR).
IR menyimpan kode instruksi, seperti display clear, cursor shift dan informasi address untuk display data RAM
(DDRAM) dan character generator (CGRAM).


      RS         R/W          Operation
       0          0           Menulis instruksi ke IR, seperti display clear, cursor shift
       0          1           Membaca busy flag (DB7) dan address counter (DB0 s/d DB7)
       1          0           Menulis data ke DDRAM atau CGRAM
       1          1           Membaca data dari DDRAM atau CGRAM

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

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

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

 1         2    3       4         5        6           7         8       9     10             11             12       13   14      15     16

 00        01   02     03         04       05      06            07     08     09             0A             0B   0C       0D      0E     0F
 40        41   42     43         44       45      46            47     48     49             4A             4B   4C       4D      4E     4F

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                                                                                        Page 35 of 68
Electrical Engineering – Batam Polytechnic
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                                                      Page 36 of 68
Electrical Engineering – Batam Polytechnic
5. Pola Karakter CGROM




Basic AVR Tutorial by Hendawan Soebhakti     Page 37 of 68
Electrical Engineering – Batam Polytechnic
    6. Tabel Instruksi

          Instruksi                                              Kode Instruksi                                                    Deskripsi
                                   RS   R/W       DB7      DB6        DB5   DB4       DB3      DB2         DB1   DB0
                                                                                                                       Menghapus semua tampilan pada
    Clear display                  0     0         0        0          0     0          0       0           0     1
                                                                                                                       display
                                                                                                                       Set DDRAM address ke ‘00h’ dan
    Return home                    0     0         0        0          0     0          0       0           1     *    kembalikan cursor ke posisi awal. Isi
                                                                                                                       DDRAM tidak berubah
                                                                                                                       Menentukan auto increment /
                                                                                                                       decrement DDRAM address karakter
    Entry mode set                 0     0         0        0          0     0          0       1          I/D   S
                                                                                                                       atau cursor berikutnya yang akan
                                                                                                                       ditulis ke display.
    Display ON/OFF                                                                                                     Set display (D), cursor (C), dan
                                   0     0         0        0          0     0          1      D            C    B
    control                                                                                                            cursor blinking (B) ON/OFF
                                                                                                                       Menentukan pergeseran display atau
    Cursor or Display shift        0     0         0        0          0     1        S/C      R/L          *     *    cursor serta menentukan arah
                                                                                                                       pergeseran display
                                                                                                                       Menentukan panjang data interface
                                                                                                                       (DL: 8 atau 4 bit), jumlah baris (N: 1
    Function set                   0     0         0        0          1    DL          N       F           *     *
                                                                                                                       atau 2 baris) dan tipe font (F: 5x10
                                                                                                                       atau 5x7 dot)
    Set CGRAM address              0     0         0        1                            ACG                           Set CGRAM address
    Set DDRAM address              0     0         1                                  ADD                              Set DDRAM address
                                                                                                                       Mengetahui apakah LCD sedang
    Read Busy Flag and
                                   0     1        BF                                  AC                               mengerjakan instruksi atau tidak. Isi
    address
                                                                                                                       address counter juga dapat dibaca
                                                                                                                       Menulis data ke internal RAM
    Write data to RAM              1     0        D7       D6         D5    D4         D3      D2          D1    D0
                                                                                                                       (DDRAM/CGRAM)
                                                                                                                       Membaca data dari internal RAM
    Read data from RAM             1     1        D7       D6         D5    D4        D3       D2          D1    D0
                                                                                                                       (DDRAM/CGRAM)

I/D = 1       : Increment               C=1             : Cursor ON               R/L = 1       : Right Shift          F=1            : 5x7 dots
I/D = 0       : Decrement               C=0             : Cursor OFF              R/L = 0       : Left Shift           F=0            : 5x10 dots

S=1           : DisplayShift            B=1             : Blink ON                DL = 1        : 8 bits               BF = 1         : Busy
S=0           : No Display Shift        B=0             : Blink OFF               DL = 0        : 4 bits               BF = 0         : Can Accept Data

D=1           : Display ON              S/C = 1         : Display Shift           N=1           : 2 Lines              ACG            : CGRAM Address
D=0           : Display OFF             S/C = 0         : Cursor Move             N=0           : 1 Line               ADD            : DDRAM Address




    Basic AVR Tutorial by Hendawan Soebhakti                                                                                     Page 38 of 68
    Electrical Engineering – Batam Polytechnic
7. Inisialisasi LCD

                              Power On



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


                                                                BF belum bisa dicek sebelum instruksi ini

       RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
        0   0  0    0   1   1  *   *   *    *                   Function Set (Interface 8 bit)




                          Tunggu = 4,1 mS


                                                                BF belum bisa dicek sebelum instruksi ini

       RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
        0   0  0    0   1   1  *   *   *    *                   Function Set (Interface 8 bit)




                          Tunggu = 100 uS


                                                                BF belum bisa dicek sebelum instruksi ini

       RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
        0   0  0    0   1   1  *   *   *    *                   Function Set (Interface 8 bit)


                                                                BF bisa dicek setelah instruksi-instruksi berikut.
                                                                Jika BF tidak dicek, tundaan waktu tiap instruksi
                                                                harus lebih lama dari waktu eksekusi instruksi.
       RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
        0    0        0   0     0     0     N    F   *      *   Function Set (Interface 8 bit)
        0    0        0   0     0     0      1   0    0     0   Display OFF
        0    0        0   0     0     0      0   0    0     1   Display Clear
        0    0        0   0    0      0      0   1   I/ D   S   Entry Mode Set




                          Inisialisasi selesai



                          Interface 8 bit




Basic AVR Tutorial by Hendawan Soebhakti                                                                Page 39 of 68
Electrical Engineering – Batam Polytechnic
                          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      1   0          Function Set (Interface 4 bit)
                 0    0     0     0     1    0
                                                        Function Set (Interface 4 bit)
                 0    0     N     F     *    *
                 0    0     0     0      0   0
                                                        Display OFF
                 0    0     1     0      0   0
                 0    0     0     0      0   0
                                                        Display Clear
                 0    0     0     0      0   1
                 0    0     0     0      0   0
                                                        Entry Mode Set
                 0    0     0     0    I/D   S




                      Inisialisasi selesai



                      Interface 4 bit




Basic AVR Tutorial by Hendawan Soebhakti                                                        Page 40 of 68
Electrical Engineering – Batam Polytechnic
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             ;1st line, 1st col
            rcall        SLcd
            rjmp         Wr1
WM2LCD:     ldi         r17,0xC0
            rcall        SLcd
Wr1:        clr         r1
LoopWr1:    lpm                              ;load program memory
            mov          r19,r0
            cpi          r19,0
            brne         NextCHR
            ret
NextCHR:    rcall       WLCD                 ;write character
            adiw         ZL,1                ;get next char
            rjmp         LoopWr1
;-----------------------
; Inisialisasi LCD
;-----------------------
InitLCD:    ldi         r20,8
LoopDelay: rcall        delay5mS
            dec          r20
            cpi          r20,0
            brne         LoopDelay

                ldi              r17,0x03    ;Function set
                out              PortA,r17
                sbi              PortA,6     ;E=1
                cbi              PortA,6     ;E=0
                rcall            delay5mS
Basic AVR Tutorial by Hendawan Soebhakti                            Page 41 of 68
Electrical Engineering – Batam Polytechnic
                ldi              r17,0x03     ;Function set
                out              PortA,r17
                sbi              PortA,6      ;E=1
                cbi              PortA,6      ;E=0
                rcall            delay100uS

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

            ldi          r17,0x28             ;Function set:4 bit op;2lines
            rcall        SLcd
            ldi          r17,0x08             ;Turn Off LCD
            rcall        SLcd
            ldi          r17,0x0C             ;Turn On LCD
            rcall        SLcd
            ldi          r17,0x01             ;Clear Display
            rcall        SLcd
            ldi          r17,0x06             ;Entry mode set; Inc addr
            rcall        SLcd
            ret
;-----------------------
; Rutin kirim instruksi
;-----------------------
SLcd:       mov         r18,r17
            andi         r18,$F0              ;Get high nibble
            swap         r18
            out          PortA,r18
            sbi          PortA,6              ;E=1
            cbi          PortA,6              ;E=0
;
            mov          r18,r17
            andi         r18,$0F              ;Get low nibble
            out          PortA,r18
            sbi          PortA,6              ;E=1
            cbi          PortA,6              ;E=0
            rcall        delay100uS
            ret
;-----------------------
; Rutin kirim karakter
;-----------------------
WLcd:       mov         r18,r19
            andi         r18,$F0              ;Get high nibble
            swap         r18
            out          PortA,r18
            sbi          PortA,4              ;RS=1
            sbi          PortA,6              ;E=1
            cbi          PortA,6              ;E=0
;
            mov          r18,r19
            andi         r18,$0F              ;Get low nibble
            out          PortA,r18
Basic AVR Tutorial by Hendawan Soebhakti                          Page 42 of 68
Electrical Engineering – Batam Polytechnic
            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            Page 43 of 68
Electrical Engineering – Batam Polytechnic
Catatan Tambahan :

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




                                  Gambar 9.3 Register X, Y dan Z

LPM (Load Program Memory)
Load 1 byte isi address yang ditunjukkan oleh register Z ke R0. Instruksi ini mirip dengan instruksi
mov    A,@DPTR pada MCS-51.

Contoh :
       ldi               ZL,low(2*text)           ;   ZL=00h
       ldi               ZH,high(2*text)          ;   ZH=10h
       lpm                                        ;   r0=”H” (Karakter H)
       mov               r19,r0                   ;   r19=”H”

        .org    1000h
text:                    .db     "Hello World",0




Basic AVR Tutorial by Hendawan Soebhakti                                               Page 44 of 68
Electrical Engineering – Batam Polytechnic
                                                                                    BAB X
                                                     Pengendalian Motor DC
1. Motor DC

      Setiap arus yang mengalir melalui sebuah konduktor akan menimbulkan medan magnet.
Arah medan magnet dapat ditentukan dengan kaidah tangan kiri. Ibu jari tangan menunjukkan
arah aliran arus listrik sedangkan jari-jari yang lain menunjukkan arah medan magnet yang
timbul, seperti yang ditunjukkan oleh gambar 10.1 berikut ini.




                                      Gambar 10.1 Kaidah Tangan Kiri

     Jika suatu konduktor yang dialiri arus listrik ditempatkan dalam sebuah medan magnet,
kombinasi medan magnet akan ditunjukkan oleh gambar 10.2. Arah aliran arus listrik dalam
konduktor ditunjukkan dengan tanda “x” atau “.”. Tanda “x” menunjukkan arah arus listrik
mengalir menjauhi pembaca gambar, tanda “.” menunjukkan arah arus listrik mengalir
mendekati pembaca gambar.




                     Gambar 10.2 Konduktor Berarus Listrik Dalam Medan Magnet

Basic AVR Tutorial by Hendawan Soebhakti                                        Page 45 of 68
Electrical Engineering – Batam Polytechnic
     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                                          Page 46 of 68
Electrical Engineering – Batam Polytechnic
                           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                                     Page 47 of 68
Electrical Engineering – Batam Polytechnic
         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                                         Page 48 of 68
Electrical Engineering – Batam Polytechnic
                                                                                                                        +12V
                                    IC1
                         BIT0   1                      6
                                     Anoda      NC
          1   R6     2          2                      5   +12V
               1 2                   Katoda Kolektor                                                          Q1                        Q2
              680                                                                 R1                                                                 R2
                                3                      4                      1               2               TIP120                    TIP120   2             1
                                     NC       Emiter                                1 2                                                                2 1
                                                                                  10K                                                                10K
                                    4N25

                                                                                                                       M1

                                                                                                          1                         2
                                                                                                                 1           2
                                    IC2
                         BIT1   1                      6
                                     Anoda      NC
                                                                                                                  MOTOR DC
              R7                2                      5   +12V
                                     Katoda Kolektor                                                          Q3                        Q4
              680                                                                 R3                                                                 R4
                                3                      4                      1               2               TIP120                    TIP120   1             2
                                     NC       Emiter                                1 2                                                                1 2
                                                                                  10K                                                                10K
                                    4N25



                                                                  IC3                   VCC
                                                            1                     14
                                                                   1A   Vcc
                                                            2                     13 BIT0
                                                                   1B   4A
                                                            3                     12 BIT1                                   Q5
                                                                   1Y   4B                    R5
                                                            4                     11      1           2                     BC548
                                                                   2A   4Y                     1 2
                                                            5                     10          1K
                                                                   2B   3A
                                                            6                     9
                                                                   2Y   3B
                                                            7                     8
                                                                   G    3Y
                                                                  74LS00




                                             Gambar 10.7 Rangkaian Driver Motor DC

                            Tabel 10.1 Tabel Kebenaran Rangkaian Driver Motor DC

                                    Input
                                                                                                  Aksi Motor
                                BIT 1   BIT 0
                                  0       0                       Berhenti
                                  0       1                       Berputar searah jarum jam
                                  1       0                       Berputar berlawanan arah jarum jam
                                  1       1                       Berhenti




Basic AVR Tutorial by Hendawan Soebhakti                                                                                                                     Page 49 of 68
Electrical Engineering – Batam Polytechnic
Contoh Program :

    .include    "m8535def.inc"
    .org        0x0000
    rjmp        main
    main:       ldi   r16,low(RAMEND)
                out   SPL,r16
                ldi   r16,high(RAMEND)
                out   SPH,r16
                ldi   r16,0xff
                out   ddra,r16
    Run:        ldi   r19,0b00000010
                out   PortA,r19
                rcall delay
                ldi   r19,0b00000000
                out   PortA,r19
                rcall delay
                ldi   r19,0b00000001
                out   PortA,r19
                rcall delay
                ldi   r19,0b00000011
                out   PortA,r19
                rcall delay
                rjmp Run
    delay:      ldi   r20,0x10
    dl1:        ldi   r21,0xff
    dl2:        ldi   r22,0xff
    dl3:        dec   r22
                cpi   r22,0x00
                brne dl3
                dec   r21
                cpi   r21,0x00
                brne dl2
                dec   r20
                cpi   r20,0x00
                brne dl1
                ret




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

                                                    t1
                                             Vo =      VS
                                                    T
                            V0   : Tegangan Output (Volt)
                            VS   : Tegangan Pulsa PWM (Volt)
                            t1   : Perioda pulsa high (Secon)
                            T    : Periode pulsa (Secon)




Basic AVR Tutorial by Hendawan Soebhakti                                        Page 51 of 68
Electrical Engineering – Batam Polytechnic
Contoh Program :

    .include "m8535def.inc"
    .equ     timer_value1000 = 0xd4cd
    .org     0x0000
    rjmp     main
    main:    ldi   r16,low(RAMEND)
             out   SPL,r16
             ldi   r16,high(RAMEND)
             out   SPH,r16
             ldi   r16,0xff
             out   ddra,r16
             ldi   r16,0x00
             out   PortA,r16
    Loop:    sbi   PortA,0           ;Output Bit Pulse
             rcall Pulse
             cbi   PortA,0            ;Output Bit Pulse
             rcall P_1mS
             rjmp Loop
    Pulse:   ldi   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                       Page 52 of 68
Electrical Engineering – Batam Polytechnic
    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         Page 53 of 68
Electrical Engineering – Batam Polytechnic
Basic AVR Tutorial by Hendawan Soebhakti     Page 54 of 68
Electrical Engineering – Batam Polytechnic
                                                                                      BAB IX
                                                                          Motor Servo
1. Dasar Motor Servo

Motor Servo terdiri dari sebuah motor DC, serangkaian gear, sebuah potensiometer, sebuah
output shaft dan sebuah rangkaian kontrol elektronik.

Biasanya, motor servo berbentuk kotak segi empat dengan sebuah output shaft motor dan
konektor dengan 3 kabel yaitu power, kontrol dan ground. Gear motor servo ada yang terbuat
dari plastic, metal atau titanium. Didalam motor servo terdapat potensiometer yang digunakan
sebagai sensor posisi. Potensiometer tersebut dihubungkan dengan output shaft untuk
mengetahui posisi aktual shaft.

Ketika motor dc berputar, maka output shaft juga berputar dan sekaligus memutar potensiometer.
Rangkaian kontrol kemudian dapat membaca kondisi potensiometer tersebut untuk mengetahui
posisi aktual shaft. Jika posisinya sesuai dengan yang diinginkan, maka motor dc akan berhenti.
Sudut operasi motor servo (Operating Angle) bervariasi tergantung jenis motor servo. Ada 2 jenis
motor servo yaitu :
• 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 Servo
                                  Sumber : 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                                           Page 55 of 68
Electrical Engineering – Batam Polytechnic
                          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                                                  Page 56 of 68
Electrical Engineering – Batam Polytechnic
                             Gambar 9.3 HSR-5995TG Ultra Torque
                                  Sumber : http://www.servocity.com


Detailed Specifications

Control 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                               Page 57 of 68
Electrical Engineering – Batam Polytechnic
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              ;timer 20mS
.equ timer_value = 0xc0                  ;timer 1.5mS
.org 0x0000
      rjmp main
main: ldi   r16,low(RAMEND)
      out   SPL,r16
      ldi   r16,high(RAMEND)
      out   SPH,r16
      sbi   DDRD,5                       ;PortD.5 as output

      ldi   r16,25
Loop: sbi   PortD,5
      rcall Pulse
      cbi   PortD,5
      rcall P20mS
      dec   r16
      cpi   r16,0
      brne Loop
Stop: nop
      rjmp Stop
;-----------------------------------------------------------
; Generate pulse 1.5mS Servo position at centre
;-----------------------------------------------------------
Pulse:
      ldi   r16,0b00000011          ;Prescaling 64 untuk timer1
      out   TCCR1b,r16
      ldi   r16,0b00000101          ;Presaling 1024 untuk timer0
      out   TCCR0,r16
      ldi   r16,0b00000101          ;Timer0&1 overflow interrupt enable
      out   TIMSK,r16
      ldi   r16,high(timer_value20) ;Nilai timer1 = 20mS
      out   TCNT1H,r16
      ldi   r16,low(timer_value20) ;Nilai timer1
      out   TCNT1L,r16
      ldi   r18,0xf0                ;Bilangan hex, 0xf0 = timer 1.5 mS
      out   TCNT0,r18               ;Nilai timer0
P_1500uS:
      in    r17,TIFR                ;Baca Timer Interrupt Flag Register
      sbrs r17,TOV0                 ;Tunggu sampai timer0 overflow set
      rjmp P_1500uS
      ldi   r16,0b00000001          ;TOV0 dinolkan dg memberi logika 1
      out   TIFR,r16
      ret
P20mS:in    r19,TIFR                ;Baca Timer Interrupt Flag Register
      sbrs r19,TOV1                 ;Tunggu sampai timer1 overflow set
Basic AVR Tutorial by Hendawan Soebhakti                                       Page 58 of 68
Electrical Engineering – Batam Polytechnic
        rjmp      P20mS
        ldi       r16,0b00000100                 ;TOV1 dinolkan dg memberi logika 1
        out       TIFR,r16
        ret



Catatan Tambahan :

•   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       r16,0b00000011         ;enable Timer 1 with 64 prescaler
        out       TCCR1B,r16




Basic AVR Tutorial by Hendawan Soebhakti                                         Page 59 of 68
Electrical Engineering – Batam Polytechnic
•   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                     ;Presaling 256 untuk timer0
        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                                         Page 60 of 68
Electrical Engineering – Batam Polytechnic
                                                                                            BAB X
                                                                                        Keypad
1. 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          2         3      COR


                                  Baris2        4          5         6      MEN


                                  Baris3        7          8         9

                                  Baris4       CAN         0         ENT

                                      Gambar 10.1 Konfigurasi Keypad 4x4

2. Cara Mengakses Keypad
   Berikut ini adalah cara menghubungkan keypad ke mikrokontroler :


                                      PD.7

                                      PD.6

                                      PD.5
                         ATmega8535




                                      PD.4
                                                               K1    K2    K3    K4

                                                      B1
                                      PD.0                      1     2     3     COR

                                                      B2
                                      PD.1                      4     5     6     MEN

                                                      B3
                                      PD.2                      7     8     9

                                                      B4
                                      PD.3                     CAN    0    ENT




                    Gambar 10.2 Menghubungkan Keypad ke Microkontroler



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

                 0      1      1      1      a. Set kondisi Port D = 11101111
                                             b. Baca kondisi Port D :
             1    1      2      3
      PD.0                            COR        • Jika PD.0 = 0 maka Tombol 1 ditekan
             1                                   • Jika PD.1 = 0 maka Tombol 4 ditekan
      PD.1        4      5      6     MEN
                                                 • Jika PD.2 = 0 maka Tombol 7 ditekan
      PD.2
             1    7      8      9                • Jika PD.3 = 0 maka Tombol CAN ditekan

      PD.3
             1   CAN     0     ENT




    Langkah 2 :
                 PD.4   PD.5   PD.6   PD.7
                                             a. Set kondisi Port D = 11011111
                 1      0      1      1
                                             b. Baca kondisi Port D :
      PD.0
             1    1      2      3     COR        • Jika PD.0 = 0 maka Tombol 2 ditekan
                                                 • Jika PD.1 = 0 maka Tombol 5 ditekan
             1
      PD.1        4      5      6     MEN        • Jika PD.2 = 0 maka Tombol 8 ditekan
             1                                   • Jika PD.3 = 0 maka Tombol 0 ditekan
      PD.2        7      8      9

      PD.3
             1   CAN     0     ENT



    Langkah 3 :
                 PD.4   PD.5   PD.6   PD.7
                                             a. Set kondisi Port D = 10111111
                 1      1      0      1      b. Baca kondisi Port D :
      PD.0
             1    1      2      3     COR        • Jika PD.0 = 0 maka Tombol 3 ditekan
                                                 • Jika PD.1 = 0 maka Tombol 6 ditekan
             1
      PD.1        4      5      6     MEN        • Jika PD.2 = 0 maka Tombol 9 ditekan
                                                 • Jika PD.3 = 0 maka Tombol ENT ditekan
      PD.2
             1    7      8      9

      PD.3
             1   CAN     0     ENT



    Langkah 4 :
                 PD.4   PD.5   PD.6   PD.7
                                             a. Set kondisi Port D = 01111111
                 1      1      1      0      b. Baca kondisi Port D :
      PD.0
             1    1      2      3     COR        • Jika PD.0 = 0 maka Tombol COR ditekan
                                                 • Jika PD.1 = 0 maka Tombol MEN ditekan
             1
      PD.1        4      5      6     MEN        • Jika PD.2 = 0 maka Tombol UP ditekan
                                                 • Jika PD.3 = 0 maka Tombol DOWN ditekan
             1    7      8      9
      PD.2
                                                 • Jika kondisi PD.0 ..PD.3 = 1 maka tidak ada
             1                                       penekanan tombol
      PD.3       CAN     0     ENT




Basic AVR Tutorial by Hendawan Soebhakti                                                   Page 62 of 68
Electrical Engineering – Batam Polytechnic
Contoh Program :

    .include "m8535def.inc"
    .def     temp =r22
    .def     dly   =r23
    .def     dly1 =r24
    .def     Key   =r25
    .equ     col1 =0b11101111                ;Column   1
    .equ     col2 =0b11011111                ;Column   2
    .equ     col3 =0b10111111                ;Column   3
    .equ     col4 =0b01111111                ;Column   4
    .org     0x0000
    rjmp     main
    main:    ldi   r16,low(RAMEND)
             out   SPL,r16
             ldi   r16,high(RAMEND)
             out   SPH,r16
             ldi   r16,0xff
             out   ddra,r16                  ;PortA as output
             ldi   r16,0xf0                  ;PD[7:4]=output PD[3:0]=input
             out   ddrd,r16
    loopx:   rcall check_keys
             rjmp loopx
    ;-------------------------
    ; Check keypad sub routine
    ;-------------------------
    check_keys:
             ldi   temp,col1                 ;Enable column1
             out   PORTD,temp
             rcall delay
             sbic PIND,PD0                   ; Pressed key No1 ?
             rjmp key4                       ; if Not, check next key
             ldi   key,0x01                  ; if yes...
             out   PortA,key
             ret                             ; key=0x01

    key4:       sbic     PIND,PD1            ; Pressed key No4 ?
                rjmp     key7                ; if Not, check next key
                ldi      key,0x04            ; if yes...
                out      PortA,key
                ret                          ;   key=0x04
    key7:       sbic     PIND,PD2            ;   Pressed key No7 ?
                rjmp     keyCAN              ;   if Not, check next key
                ldi      key,0x07            ;   if yes...
                out      PortA,key
                ret                          ;   key=0x07
    keyCAN:     sbic     PIND,PD3            ;   Pressed key CAN ?
                rjmp     key2                ;   if Not, check next key
                ldi      key,0x0A            ;   if yes...
                out      PortA,key
                ret                          ; key=0x0A
    key2:       ldi      temp,col2           ; Disable the first column...
                out      PORTD,temp          ; and enable the second
                rcall    delay
                sbic     PIND,PD0            ; Pressed key No2 ?
Basic AVR Tutorial by Hendawan Soebhakti                                  Page 63 of 68
Electrical Engineering – Batam Polytechnic
                rjmp     key5                ; if Not...
                ldi      key,0x02            ; if yes...
                out      PortA,key
                ret                          ;   key=0x02
    key5:       sbic     PIND,PD1            ;   Pressed key No5 ?
                rjmp     key8                ;   if Not...
                ldi      key,0x05            ;   if yes...
                out      PortA,key
                ret                          ;   key=0x05
    key8:       sbic     PIND,PD2            ;   Pressed key No8 ?
                rjmp     key0                ;   if Not...
                ldi      key,0x08            ;   if yes...
                out      PortA,key
                ret                          ;   key=0x08
    key0:       sbic     PIND,PD3            ;   Pressed key No0 ?
                rjmp     key3                ;   if Not...
                ldi      key,0x00            ;   if yes...
                out      PortA,key
                ret                          ; key=0x00
    key3:       ldi      temp,col3           ; Disable 2nd column...
                out      PORTD,temp          ; and enable the 3th
                rcall    delay
                sbic     PIND,PD0            ; Pressed key No3 ?
                rjmp     key6                ; if Not...
                ldi      key,0x03            ; if yes...
                out      PortA,key
                ret                          ;   key=0x03
    key6:       sbic     PIND,PD1            ;   Pressed key No6 ?
                rjmp     key9                ;   if Not...
                ldi      key,0x06            ;   if yes...
                out      PortA,key
                ret                          ;   key=0x06
    key9:       sbic     PIND,PD2            ;   Pressed key No9 ?
                rjmp     keyENT              ;   if Not...
                ldi      key,0x09            ;   if yes...
                out      PortA,key
                ret                          ;   key=0x09
    keyENT:     sbic     PIND,PD3            ;   Pressed key ENT ?
                rjmp     keyCOR              ;   if Not...
                ldi      key,0x0B            ;   if yes...
                out      PortA,key
                ret                          ; key=0x0B
    keyCOR:     ldi      temp,col4           ;
                out      PORTD,temp
                rcall    delay
                sbic     PIND,PD0            ; Pressed key COR ?
                rjmp     keyMEN              ; if Not...
                ldi      key,0x0C            ; if yes...
                out      PortA,key
                ret                          ;   key=0x0C
    keyMEN:     sbic     PIND,PD1            ;   Pressed key MEN ?
                rjmp     keyUP               ;   if Not...
                ldi      key,0x0D            ;   if yes...
                out      PortA,key
                ret                          ; key=0x0D
Basic AVR Tutorial by Hendawan Soebhakti                               Page 64 of 68
Electrical Engineering – Batam Polytechnic
    keyUP:   sbic PIND,PD2                   ; Pressed key UP ?
             rjmp keyDW                      ; if Not...
             ldi   key,0x0E                  ; if yes...
             out   PortA,key
             ret                             ;   key=0x0E
    keyDW:   sbic PIND,PD3                   ;   Pressed key DOWN ?
             rjmp check_keys                 ;   if Not...
             ldi   key,0x0F                  ;   if yes...
             out   PortA,key
             ret                             ; key=0x0F
    ;------------------------
    ; 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




Basic AVR Tutorial by Hendawan Soebhakti                              Page 65 of 68
Electrical Engineering – Batam Polytechnic
                                                                                        BAB XI
                                                                      Serial USART
    1. 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                                          Page 66 of 68
Electrical Engineering – Batam Polytechnic
        .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<<RXEN)|(1<<TXEN)|(1<<RXCIE)
        out   UCSRB,temp
        ldi   temp,(1<<URSEL)|(3<<UCSZ0)
        out   UCSRC,temp

    2. Pengiriman Data
       Pengiriman data dilakukan per byte menunggu UDR kosong (UDR = register tempat
       menyimpan data USART, menjadi satu dengan register UBRR). Jika kosong, maka bit
       UDRE(USART Data Register Empty) pada UCSRA akan set 1 sehingga siap menerima
       data baru yang akan dikirim.

        Contoh pengiriman USART :
        usart_tx:
        sbis UCSRA,UDRE
        rjmp usart_tx
        out    UDR,txbyte

    3. Penerimaan Data
       Penerimaan data dilakukan dengan memeriksa bit RXC (USART Receive Complete)
       pada register UCSRA. RXC akan set 1 jika ada data yang siap dibaca. Data yang
       diterima akan disimpan pada register UDR.

        Contoh penerimaan USART :
        usart_rx:
        sbis    UCSRA,RXC
        rjmp    usart_rx
        in      rxbyte,UDR




Basic AVR Tutorial by Hendawan Soebhakti                                  Page 67 of 68
Electrical Engineering – Batam Polytechnic
Contoh Program :

    .include"m8535def.inc"

    .def        temp             =r16
    .def        txbyte           =r17
    .def        rxbyte           =r18
    .equ        fclock           =11059200
    .equ        baud_rate        =19200
    .equ        ubbr_value       =(fclock / (16*baud_rate)) - 1

    .org        0x0000
                rjmp main
    main:       ldi   temp,low(ramend)
                out   spl,temp
                ldi   temp,high(ramend)
                out   sph,temp
                rcall init_usart
    loop:       ldi   zl,low(2*msg)
                ldi   zh,high(2*msg)
    load:       lpm
                mov   txbyte,r0
                cpi   txbyte,0
                breq done
                rcall usart_tx
                inc   zl
                rjmp load
    done:       rjmp done

    init_usart:
             ldi         temp,high(ubbr_value)
             out         UBRRH,temp
             ldi         temp,low(ubbr_value)
             out         UBRRL,temp
             ldi         temp,(1<<RXEN)|(1<<TXEN)|(1<<RXCIE)
             out         UCSRB,temp
             ldi         temp,(1<<URSEL)|(3<<UCSZ0)
             out         UCSRC,temp
             ret
    usart_tx:
             sbis        UCSRA,UDRE
             rjmp        usart_tx
             out         UDR,txbyte
             ret
    usart_rx:
             sbis        UCSRA,RXC
             rjmp        usart_rx
             in          rxbyte,UDR
             ret
    msg:
    .db                  "******Welcome To Politeknik Batam******",13,10,0

Keterangan : angka 13,10 adalah kode ASCII untuk Enter. Jadi pesan akan ditampilkan pada
baris baru di editor Hyper Terminal. Angka 0 menunjukkan akhir karakter dari pesan yang dikirim.

Basic AVR Tutorial by Hendawan Soebhakti                                           Page 68 of 68
Electrical Engineering – Batam Polytechnic

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:1291
posted:2/22/2010
language:Indonesian
pages:68