92445358 Tutorial Avrstudio Avrgccsdg

  • Upload
    dk-idea

  • View
    71

  • Download
    0

Embed Size (px)

Citation preview

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 1

    Tutorial

    Pemrograman Mikrokontroler AVR dengan

    AVR Studio dan WinAVR GCC (ATMega16/32/8535)

    Versi 2.0

    http://klikdisini.com/embedded

    oleh Agfianto Eko Putra ([email protected]) dan Dhani Nugraha ([email protected])

    Unit Layanan Elektronika dan Instrumentasi Jurusan Ilmu Komputer dan Elektronika

    Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Gadjah Mada Yogyakarta

    2011

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 2

    Tutorial Pemrograman Mikrokontroler AVR dengan

    AVR Studio dan WinAVR GCC (ATMega16/32/8535)

    Disusun oleh: Agfianto Eko Putra [email protected] dan

    Dhani Nugraha - [email protected]

    Daftar Isi 1. Apakah Mikrokontroler itu? ...................................................................................................... 4

    2. Pengetahuan Dasar Mikrokontroler AVR .................................................................................. 7 2.1. Pendahuluan ....................................................................................................................... 7

    2.2. Memilih AVR yang benar ............................................................................................... 8 2.3. Ada apa dengan Mikrokontroler AVR ATMega16? ............................................................ 9

    2.3.1. Ringkasan Fitur-fitur Mikrokontroler AVR ATMega16 ............................................... 9 2.3.2. Diagram Pin dan Diagram Blok Mikrokontroler AVR ATMega16 ............................. 10

    2.3.3. Penjelasan Singkat Pin-pin pada Mikrokontroler AVR ATMega16 ............................ 11 3. Pengenalan Bahasa C untuk Mikrokontroler AVR ................................................................... 15

    3.1. Struktur Penulisan Bahasa C ............................................................................................. 15 3.2. Tipe-tipe data dalam Bahasa C .......................................................................................... 15

    3.3. Deklarasi Variabel dan Konstanta ..................................................................................... 15 3.4. Pernyataan ........................................................................................................................ 16

    3.5. Fungsi ............................................................................................................................... 16 3.6. Pernyataan berkondisi dan Pengulangan............................................................................ 16

    3.7. Operasi Logika dan Bilangan Biner .................................................................................. 17 3.8. Operasi Aritmetika............................................................................................................ 17

    3.9. Pengulangan Terus-menerus atau Infinite Looping ............................................................ 18 4. Menggunakan AVR Studio 4 dengan WinAVR GCC .............................................................. 20

    5. Masukan/Luaran (I/O) pada Mikrokontroler AVR ................................................................... 25 5.1. Register DDRx ................................................................................................................. 25

    5.2. Register PORTx ................................................................................................................ 25 5.3. Register PINx ................................................................................................................... 26

    5.4. Percobaan-1: LED berkedip-kedip .................................................................................... 27 5.5. Percobaan-2: Membunyikan buzzer! ................................................................................. 29

    5.6. Percobaan-3: Aplikasi Pushbutton untuk ON/OFF LED .................................................... 30 6. Timer/Counter dan Watchdog pada Mikrokontroler AVR ....................................................... 32

    6.1. Percobaan-4: Menggunakan Timer1 .................................................................................. 35 6.2. Percobaan-5: Menggunakan Timer2 .................................................................................. 37

    6.3. Percobaan-6: Menggunakan Timer0 .................................................................................. 39 6.4. Percobaan-7: Lima Kali pencacahan aplikasi Counter .................................................... 41 6.5. Tentang Watchdog ............................................................................................................ 42 6.6. Percobaan-8: Aplikasi Watchdog (Bagian-1) .................................................................... 43

    6.7. Percobaan-9: Aplikasi Watchdog (Bagian-2) .................................................................... 44 7. Interupsi dan Aplikasinya ........................................................................................................ 46

    7.1. Pendahuluan Interupsi Mikrokontroler AVR ..................................................................... 46 7.2. Percobaan-10: ON/OFF LED menggunakan Interupsi Timer0 .......................................... 47

    7.3. Percobaan-11: ON/OFF LED melalui Interupsi Eksternal ................................................. 48 8. Komunikasi Serial ................................................................................................................... 49

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 3

    8.1. Penghasil Detak - Clock Generator ................................................................................... 50 8.2. Mengirim Data USART Transmitter .............................................................................. 54 8.3. Menerima Data USART Receive ................................................................................... 56 8.4. Percobaan-12: Komunikasi Serial ..................................................................................... 57

    9. LCD dan ADC ........................................................................................................................ 60 9.1. Rangkaian antarmuka LCD dan ADC ............................................................................... 60

    9.2. Percobaan-13: Aplikasi LCD Bagian-1 ............................................................................. 62 9.3. Percobaan-14: Aplikasi LCD Bagian-2 ............................................................................. 62

    9.4. Percobaan-15: Aplikasi LCD Bagian-3 ............................................................................. 63 9.5. Percobaan-16: Aplikasi LCD Bagian-4 ............................................................................. 64

    9.6. Percobaan-17: Menggunakan ADC Internal Bagian-1 ....................................................... 65 9.7. Percobaan-18: Menggunakan ADC Internal Bagian-2 ....................................................... 66

    10. Komunikasi I2C untuk RTC dan EEPROM .......................................................................... 68 10.1. Pendahuluan RTC DS1307 ............................................................................................ 68

    10.2 Komunikasi I2C pada RTC DS1307 .............................................................................. 68

    10.3. Rangkaian Baku RTC DS1307 ...................................................................................... 70

    10.4. Percobaan-19: Aplikasi RTC (I2C) Bagian-1 ................................................................. 70 10.5. Percobaan-20: Aplikasi RTC (I2C) Bagian-2 ................................................................. 72

    10.6. Tentang Two-wire Serial EEPROM AT24C32/64 ......................................................... 74 10.7. Percobaan-21: Akses EEPROM Internal........................................................................ 76

    10.8. Percobaan-22: Akses EEPROM Eksternal (I2C) ............................................................ 77

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 4

    1. Apakah Mikrokontroler itu? Jika kita bicara tentang Mikrokontroler, maka tidak terlepas dari pengertian atau definisi tentang

    Komputer itu sendiri, mengapa? Ada kesamaan-kesamaan antara Mikrokontroler dengan Komputer

    (atau Mikrokomputer), antara lain:

    Sama-sama memiliki unit pengolah pusat atau yang lebih dikenal dengan CPU (Central

    Processing Unit);

    CPU tersebut sama-sama menjalankan program dari suatu lokasi atau tempat, biasanya dari

    ROM (Read Only Memory)1 atau RAM (Random Access Memory)

    2;

    Sama-sama memiliki RAM yang digunakan untuk menyimpan data-data sementara atau yang

    lebih dikenal dengan variabel-variabel;

    Sama-sama memiliki beberapa luaran dan masukan (I/O) yang digunakan untuk melakukan

    komunikasi timbal-balik dengan dunia luar, melalui sensor (masukan) dan aktuator (luaran),

    perhatikan bagan yang ditunjukkan pada Gambar 1.

    Gambar 1. Bagan masukan, pemrosesan hingga luaran

    Lantas apa yang membedakan antara Mikrokontroler dengan Komputer atau Mikrokomputer? Begitu

    mungkin pertanyaan yang ada di benak kita, saat kita membaca beberapa daftar kesamaan yang

    sudah saya tuliskan tersebut. Sama sekali berbeda, itu jawaban yang saya berikan kepada Anda:

    Mikrokontroler adalah versi mini dan untuk aplikasi khusus dari Mikrokomputer atau Komputer!

    Berikut saya berikan kembali daftar kesamaan yang pernah kemukakan sebelumnya dengan

    menekankan pada perbedaan antara Mikrokontroler dan Mikrokomputer:

    CPU pada sebuah Komputer berada eksternal dalam suatu sistem, sampai saat ini kecepatan

    operasionalnya sudah mencapai lebih dari 2,5 GHz, sedangkan CPU pada Mikrokontroler

    berada didalam (internal) sebuah chip, kecepatan kerja atau operasionalnya masih cukup

    rendah, dalam orde MHz (misalnya, 24 MHz, 40 MHz dan lain sebagainya). Kecepatan yang

    relatif rendah ini sudah mencukupi untuk aplikasi-aplikasi berbasis mikrokontroler.

    Jika CPU pada mikrokomputer menjalankan program dalam ROM atau yang lebih dikenal

    dengan BIOS (Basic I/O System) pada saat awal dihidupkan, kemudian mengambil atau

    menjalankan program yang tersimpan dalam hard disk. Sedangkan mikrokontroler sejak awal

    menjalankan program yang tersimpan dalam ROM internal-nya (bisa berupa Mask ROM

    atau Flash PEROM atau Flash ROM). Sifat memori program dalam mikrokontroler ini non-

    volatile, artinya tetap akan tersimpan walaupun tidak diberi catu daya.

    1 Memori yang hanya bisa dibaca saja. 2 Memori yang bisa dibaca juga bisa ditulisi.

    Masukan-masukan

    sensor cahaya

    sensor suhu

    sensor tekanan, dll

    Pemroses

    uC AT89

    uC AVR

    uC PIC16F, dll

    Luaran-luaran

    aktuator - motor

    relay

    speaker, dll

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 5

    RAM pada mikrokomputer bisa mencapai ukuran sekian GByte dan bisa di-upgrade ke

    ukuran yang lebih besar dan berlokasi di luar CPU-nya, sedangkan RAM pada

    mikrokontroler ada di dalam chip dan kapasitasnya rendah, misalnya 128 byte, 256 byte dan

    seterusnya dan ukuran yang relatif kecil inipun dirasa cukup untuk aplikasi-aplikasi

    mikrokontroler.

    Luaran dan masukan (I/O) pada mikrokomputer jauh lebih kompleks dibandingkan dengan

    mikrokontroler, yang jauh lebih sederhana, selain itu, pada mikrokontroler akses keluaran dan

    masukan bisa per bit.

    Jika diamati lebih lanjut, bisa dikatakan bahwa Mikrokomputer atau Komputer merupakan

    komputer serbaguna atau general purpose computer, bisa dimanfaatkan untuk berbagai

    macam aplikasi (atau perangkat lunak). Sedangkan mikrokontroler adalah special purpose

    computer atau komputer untuk tujuan khusus, hanya satu macam aplikasi saja.

    Perhatikan Gambar 2, agar Anda mendapatkan gambaran tentang mikrokontroler lebih jelas.

    Gambar 2. Diagram Blok mikrokontroler (yang) disederhanakan

    ALU, Instruction Decoder, Accumulator dan Control Logic, sebagaimana ditunjukkan pada

    Gambar 2, merupakan Otak-nya mikrokontroler yang bersangkutan. Jantungnya berasal dari detak

    OSC (lihat pada Gambar 2 sebelah kiri atas). Sedangkan di sekeliling Otak terdapat berbagai macam periferal seperti SFR (Special Function Register) yang bertugas menyimpan data-data

    sementara selama proses berlangsung). Instruction Decoder bertugas menerjemahkan setiap

    instruksi yang ada di dalam Program Memory (hasil dari pemrograman yang kita buat sebelumnya).

    Hasil penerjemahan tersebut merupakan suatu operasi yang harus dikerjakan oleh ALU (Arithmetic

    Logic Unit), mungkin dengan bantuan memori sementara Accumulator yang kemudian

    menghasilkan sinyal-sinyal kontrol ke seluruh periferal yang terkait melalui Control Logic.

    Memori RAM atau RAM Memory bisa digunakan sebagai tempat penyimpan sementara, sedangkan

    SFR (Special Function Register) sebagian ada yang langsung berhubungan dengan I/O dari

    mikrokontroler yang bersangkutan dan sebagian lain berhubungan dengan berbagai macam

    operasional mikrokontroler.

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 6

    ADC atau Analog to Digital Converter (tidak setiap mikrokontroler memiliki ADC internal),

    digunakan untuk mengubah data-data analog menjadi digital untuk diolah atau diproses lebih lanjut.

    Timer atau Counter digunakan sebagai pewaktu atau pencacah, sebagai pewaktu fungsinya seperti

    sebuah jam digital dan bisa diatur cara kerjanya. Sedangkan pencacah lebih digunakan sebagai

    penghitung atau pencacah event atau bisa juga digunakan untuk menghitung berapa jumlah pulsa

    dalam satu detik dan lain sebagainya. Biasanya sebuah mikrokontroler bisa memiliki lebihd dari 1

    timer.

    EEPROM (sama seperti RAM hanya saja tetap akan menyimpan data walaupun tidak mendapatkan

    sumber listrik/daya) dan port-port I/O untuk masukan/luaran, untuk melakukan komunikasi dengan

    periferal eksternal mikrokontroler seperti sensor dan aktuator.

    INFORMASI PELATIHAN MIKROKONTROLER, PLC DAN LAIN-LAIN

    HTTP://KLIKDISINI.COM/PELATIHANAVR

    Beberapa catatan mikrokontroler lainnya adalah:

    Tertanam (atau embedded) dalam beberapa piranti (umumnya merupakan produk konsumen) atau yang dikenal dengan istilah embedded system atau embedded controller;

    Terdedikasi untuk satu macam aplikasi saja (lihat contoh-contoh yang akan saya terangkan

    pada bagian lain dari buku ini);

    Hanya membutuhkan daya yang (cukup) rendah (low power) sekitar 50 mWatt (Anda

    bandingkan dengan komputer yang bisa mencapai 50 Watt lebih);

    Memiliki beberapa keluaran maupun masukan yang terdedikasi, untuk tujuan atau fungsi-

    fungsi khusus;

    Kecil dan relatif lebih murah (seri AT89 di pasaran serendah-rendahnya bisa mencapai Rp.

    15.000,00, mikrokontroler AVR di pasaran saat ini juga relatif murah sedangkan Basic Stamp

    bisa mencapai Rp. 500.000,00);

    Seringkali tahan-banting, terutama untuk aplikasi-aplikasi yang berhubungan dengan mesin atau otomotif atau militer.

    Mikrokontroler yang beredar saat ini dibedakan menjadi dua macam, berdasarkan arsitekturnya:

    o Tipe CISC atau Complex Instruction Set Computing yang lebih kaya instruksi tetapi fasilitas internal secukupnya saja (seri AT89 memiliki 255 instruksi);

    o Tipe RISC atau Reduced Instruction Set Computing yang justru lebih kaya fasilitas internalnya tetapi jumlah instruksi secukupnya (seri PIC16F hanya ada sekitar 30-an

    instruksi).

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 7

    2. Pengetahuan Dasar Mikrokontroler AVR

    2.1. Pendahuluan

    Keluarga Mikrokontroler AVR merupakan mikrokontroler dengan arsitektur modern (emang selama

    ini ada yang kuno kali??). Perhatikan Gambar 3, Atmel membuat 5 (lima) macam atau jenis

    mikrokontroler AVR, yaitu:

    TinyAVR (tidak ada kaitannya ama mbak Tini yang jualan gudeg) Mikrokontroler (mungil, hanya 8 sampai 32 pin) serbaguna dengan Memori Flash untuk

    menyimpan program hingga 16K Bytes, dilengkapi SRAM dan EEPROM 512 Bytes.

    MegaAVR (nah yang ini sudah mulai banyak yang nulis bukunya) Mikrokontroler dengan unjuk-kerja tinggi, dilengkapi Pengali Perangkat keras (Hardware

    Multiplier), mampu menyimpan program hingga 256 KBytes, dilengkapi EEPROM 4K Bytes

    dan SRAM 8K Bytes.

    AVR XMEGA Mikrokontroler AVR 8/16-bit XMEGA memiliki periferal baru dan canggih dengan unjuk-

    kerja, sistem Event dan DMA yang ditingkatkan, serta merupakan pengembangan keluarga

    AVR untuk pasar low power dan high performance (daya rendah dan unjuk-kerja tinggi).

    AVR32 UC3 Unjuk-kerja tinggi, mikrokontroler flash AVR32 32-bit daya rendah. Memiliki flash hingga

    512 KByte dan SRAM 128 KByte.

    AVR32 AP7 Unjuk-kerja tinggi, prosesor aplikasi AVR32 32-bit daya rendah, memiliki SRAM hingga 32

    KByte.

    Gambar 3. Mikrokontroler Atmel: Sukses melalui inovasi

    Cuman yang populer di Indonesia adalah tinyAVR dan megaAVR, itupun masih kalah populer

    dengan keluarga AT89 yang belakangan juga sudah mulai banyak yang beralih ke AVR.

    Perbedaan jenis-jenis tersebut terletak dari fasilitas, atau lebih dikenal dengan fitur-fiturnya. Jenis

    TinyAVR merupakan mikrokontroler dengan jumlah pin yang terbatas (sedikit maksudnya) dan

    sekaligus fitur-fiturnya juga terbatas dibandingkan yang megaAVR. Semua mikrokontroler AVR

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 8

    memiliki set instruksi (assembly) dan organisasi memori yang sama, dengan demikian berpindah-

    pindah (walaupun tidak disarankan) antar mikrokontroler AVR gak masalah dan mudah!

    Beberapa mikrokontroler AVR memiliki SRAM, EEPROM, antarmuka SRAM eksternal, ADC,

    pengali perangkat keras, UART, USART dan lain sebagainya. Bayangkan saja Anda punya

    TinyAVR dan MegaAVR, kemudian telanjangi (maksudnya copotin) semua periferal-nya, nah Anda

    akan memiliki AVR Core yang sama! Kayak membuang semua isi hamburger, maka Anda akan

    mendapatkan rotinya doang yang sama

    2.2. Memilih AVR yang benar Moralnya tidak peduli tinyAVR, megaAVR, XMEGA AVR (AVR32 pengecualian karena masuk ke mikrokontroler 32-bit) semuanya memiliki unjuk-kerja yang sama saja, tetapi dengan

    kompleksitas atau fasilitas yang berbeda-beda, ibaratnya begini: banyak fasilitas dan fitur = megaAVR, fitur atau fasilitas terbatas = TinyAVR. Gitu aja kok repot

    Untuk lebih jelasnya perhatikan keterangan singkat yang saya berikan berikut ini, berdasar informasi

    resmi dari Atmel (http://www.atmel.com) dan maaf masih dalam bahasa Inggris (supaya

    kelihatannya aura kecanggihannya, he he he...).

    tinyAVR o Optimized for simple applications requiring a small microcontroller. o Great performance for cost effective devices. o Fully featured with 10-bit ADCs and high speed PWMs onboard. o Self-Programming Flash memory for maximum flexibility. o debugWIRE On-Chip Debug and In-System Programming.

    megaAVR o Self-Programming Flash memory with boot block. o High accuracy 10-bit A/D converters with up to x200 analog gain stage. o USART, SPI and TWI(1) compliant serial interfaces. o IEEE 1149.1 compliant JTAG interface on megaAVRs with 44 pins or more. o On-Chip Debug through JTAG or debugWIRE interface.

    AVR XMEGA o picoPower technology for ultra low power consumption o True 1.6 volt operation and CPU speed up to 32 MHz. o Event System and DMA Controller. o High speed, high resolution 12-bit ADC and DAC. o Crypto engine, Timers/Counters and fast communication interfaces. o Accurate and flexible Clock System with dynamic clock switching.

    AVR32 UC3 o High CPU performance. o Low power consumption. o High data throughput. o Low system cost. o High reliability. o Easy to use.

    AVR32 AP7 o High CPU perfromance. o Low power consumption. o SIMD / DSP instructions. o Instruction & data caches. o Memory management unit. o Built for embedded Linux

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 9

    2.3. Ada apa dengan Mikrokontroler AVR ATMega16? O tidak apa-apa! Dalam buku saya ini memang sengaja menggunakan mikrokontroler AVR

    ATMega16 karena fitur-fitur yang dibutuhkan. Tentu saja Anda bisa menggunakan tipe AVR

    lainnya, apakah yang 40 pin atau yang kurang dari itu, bisa ATMega88, ATMega16, ATMega128,

    ATMega8535, ATMega168 dan lain sebagainya.

    2.3.1. Ringkasan Fitur-fitur Mikrokontroler AVR ATMega16

    Berikut ini saya ringkaskan berbagai macam fitur-fitur untuk Mikrokontroler AVR ATMega16 atau

    Atmega16L (Mikrokontroler AVR 8-bit dengan Flash ISP 16kByte) langsung dari datasheet-nya,

    maaf juga masih sebagian besar dalam Bahasa Inggris3...

    Mikrokontroler AVR 8-bit daya-rendah dengan unjuk-kerja tinggi. Arsitektur RISC tingkat lanjut

    131 Instruksi yang ampuh Hampir semuanya dieksekusi dalam satu detak (clock) saja 32 x 8 General Purpose Working Registers Operasi statis penuh Throughput hingga 16 MIPS pada 16 MHz Pengali On-chip 2-cycle

    High Endurance Non-volatile Memory segments 16K Bytes of In-System Self-programmable Flash program memory 512 Bytes EEPROM 1K Byte Internal SRAM Write/Erase Cycles: 10,000 Flash/100,000 EEPROM Data retention: 20 years at 85C/100 years at 25C Optional Boot Code Section with Independent Lock Bits

    In-System Programming by On-chip Boot Program

    True Read-While-Write Operation

    Programming Lock for Software Security Antarmuka JTAG (IEEE std. 1149.1 Compliant)

    Boundary-scan Capabilities According to the JTAG Standard Extensive On-chip Debug Support Programming of Flash, EEPROM, Fuses, and Lock Bits through the JTAG Interface

    Fitur-fitur periferal Dua Pewaktu/Pencacah 8-bit dengan Praskalar dan Mode Pembanding terpisah. Sebuah Pewaktu/Pencacah 16-bit Timer/Counter Dengan Praskalar, Mode Pembanding dan

    Capture yang terpisah.

    Pencacah Real Time dengan Osilator terpisah Empat kanal PWM 8-kanal, 10-bit ADC

    8 Single-ended Channels 7 Differential Channels in TQFP Package Only 2 Differential Channels with Programmable Gain at 1x, 10x, or 200x

    Byte-oriented Two-wire Serial Interface Programmable Serial USART Master/Slave SPI Serial Interface Pewaktu Watchdog yang bisa diprogram dengan Osilator On-chip yang terpisah Komparator Analog On-chip

    Fitur-fitur Mikrokontroler khusus

    3 Jika Anda bingung dengan istilah-istilah pada fitur-fitur ini silahkan merujuk ke datasheet aslinya, sehingga fokus

    pada buku ini tidak melulu pada datasheet...

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 10

    Reset saat Power-on dan Deteksi Brown-out yang bisa diprogram Internal Calibrated RC Oscillator Sumber interupsi Eksternal dan INternal Enam Mode Sleep: Idle, ADC Noise Reduction, Power-save, Power-down, Standby and

    Extended Standby

    I/O and Packages 32 Programmable I/O Lines 40-pin PDIP, 44-lead TQFP, and 44-pad QFN/MLF

    Tegangan kerja 2.7 - 5.5V untuk Atmega16L 4.5 - 5.5V untuk Atmega16

    Kecepatan (frekuensi clock) 0 - 8 MHz untuk Atmega16L 0 - 16 MHz untuk Atmega16

    Konsumsi daya pada 1 MHz, 3V, 25C for Atmega16L Aktif: 1.1 mA Idle Mode: 0.35 mA Mode Power-down: < 1 A

    INFORMASI PELATIHAN MIKROKONTROLER, PLC DAN LAIN-LAIN

    HTTP://KLIKDISINI.COM/PELATIHANAVR

    2.3.2. Diagram Pin dan Diagram Blok Mikrokontroler AVR ATMega16

    Pada Gambar 4 dan 5 ditunjukkan diagram pin, masing-masing, untuk Mikrokontroler AVR

    ATMega16 tipe PDIP dan TQFP/MLF atau dikenal sebagai SMD.

    Gambar 4. Diagram Pin Mikrokontroler AVR ATMega16 tipe PDIP

    Pada Gambar 6 dan 7 ditunjukkan diagram blok untuk Mikrokontroler AVR ATMega16, perhatikan

    begitu banyaknya fitur-fitur dalam diagram blok tersebut, sebagaimana juga sudah saya kutipkan

    pada bagian sebelumnya.

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 11

    Gambar 5. Diagram Pin Mikrokontroler AVR ATMega16 tipe SMD

    2.3.3. Penjelasan Singkat Pin-pin pada Mikrokontroler AVR ATMega16

    Berikut kita jelaskan secara singkat fungsi dari masing-masing PIN pada Mikrokontroler AVR

    ATMega16.

    Vcc Masukan tegangan catu daya

    GND Ground, emang apalagi kalau bukan ground...

    Port A (PA7..PA0) Port A berfungsi sebagai masukan analog ke ADC internal pada

    mikrokontroler ATMega16, selain itu juga berfungsi sebagai port

    I/O dwi-arah 8-bit, jika ADC-nya tidak digunakan. Masing-masing

    pin menyediakan resistor pull-up internal4 yang bisa diaktifkan

    untuk masing-masing bit.

    Port B (PB7..PB0) Port B berfungsi sebagai sebagai port I/O dwi-arah 8-bit.Masing-

    masing pin menyediakan resistor pull-up internal yang bisa

    diaktifkan untuk masing-masing bit.

    Port B juga memiliki berbagai macam fungsi alternatif,

    sebagaimana ditunjukkan pada Tabel 1

    Port C (PC7..PC0) Port C berfungsi sebagai sebagai port I/O dwi-arah 8-bit.Masing-

    masing pin menyediakan resistor pull-up internal yang bisa

    diaktifkan untuk masing-masing bit.

    Port C juga digunakan sebagai antarmuka JTAG, sebagaimana

    ditunjukkan pada Tabel 2

    Port D (PD7..PD0) Port D berfungsi sebagai sebagai port I/O dwi-arah 8-bit.Masing-

    masing pin menyediakan resistor pull-up internal yang bisa

    diaktifkan untuk masing-masing bit.

    Port D juga memiliki berbagai macam fungsi alternatif,

    4 Resistor pull up internal berkaitan dengan rangkaian internal pada mikrokontroler AVR yang bersangkutan.

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 12

    sebagaimana ditunjukkan pada Tabel 3

    /RESET Masukan Reset. Level rendah pada pin ini selama lebih dari lama

    waktu minimum yang ditentukan akan menyebabkan reset,

    walaupun clock tidak dijalankan.

    XTAL1 Masukan ke penguat osilator terbalik (inverting) dan masukan ke

    rangkaian clock internal.

    XTAL2 Luaran dari penguat osilator terbalik

    AVCC Merupakan masukan tegangan catu daya untuk Port A sebagai

    ADC, biasanya dihubungkan ke Vcc, walaupun ADC-nya tidak

    digunakan. Jika ADC digunakan sebaiknya dihubungkan ke Vcc

    melalui tapis lolos-bawah (low-pass filter).

    AREF Merupakan tegangan referensi untuk ADC

    Gambar 6. Diagram blok Mikrokontroler AVR ATMega16 Bagian I

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 13

    Gambar 7. Diagram blok Mikrokontroler AVR ATMega16 Bagian II

    Pada Tabel 1, 2 dan 3 ditunjukkan masing-masing alternatif fungsi dari Port B, Port C dan Port D.

    Dalam buku saya ini sengaja penjelasan dari masing-masing fungsi tersebut (kecuali antarmuka

    JTAG) akan dibahas pada saat digunakan, sehingga Anda bisa memahami langsung dengan

    mencoba, istilah kerennya Learning by Doing...

    Tabel 1. Alternatif fungsi PORTB

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 14

    Tabel 2. Alternatif fungsi PORTC

    Tabel 3. Alternatif fungsi PORTD

    INFORMASI PELATIHAN MIKROKONTROLER, PLC DAN LAIN-LAIN

    HTTP://KLIKDISINI.COM/PELATIHANAVR

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 15

    3. Pengenalan Bahasa C untuk Mikrokontroler AVR Bahasa C luas digunakan untuk pemrograman berbagai jenis perangkat, termasuk mikrokontroler,

    khususnya seri AVR dari Atmel. Ada yang menyebutkan bahwa bahasa ini merupakan High Level

    Language sisanya menyebut sebagai Midle Level Language. Dengan demikian seorang programmer

    dapat menuangkan (menuliskan) algoritmanya dengan mudah.

    3.1. Struktur Penulisan Bahasa C Perhatikan struktur penulisan dalam Bahasa C sebagai berikut...

    #include < [library1.h] > // Opsional

    #define [nama1] [nilai]; // Opsional

    [global variables] // Opsional

    [functions] // Opsional

    int main(void) // Program Utama

    {

    [Deklarasi local variable/constant]

    [Isi Program Utama]

    }

    Keterangan:

    Opsional artinya boleh ditulis boleh tidak, menyesuaikan kebutuhan tuliskan pustaka apa saja yang digunakan dan lain sebagainya

    Penulisan variabel dilakukan di awal agar aman bisa digunakan sepanjang program, demikian juga dengan deklarasi fungsi-fungsi yang terlibat

    Silahkan ikuti (baca) terus tutorial ini untuk melihat contoh-contoh program di bagian lain tutorial ini.

    3.2. Tipe-tipe data dalam Bahasa C

    char : 1 byte ( -128 s/d 127 )

    unsigned char : 1 byte ( 0 s/d 255 )

    int: 2 byte ( -32768 s/d 32767 )

    unsigned int: 2 byte ( 0 s/d 65535 )

    long: 4 byte ( -2147483648 s/d 2147483647 )

    unsigned long: 4 byte ( 0 s/d 4294967295 )

    float: bilangan desimal

    array: kumpulan data-data yang sama tipenya.

    3.3. Deklarasi Variabel dan Konstanta Variabel adalah memori penyimpanan data yang nilainya dapat diubah-ubah.

    Penulisan : [tipe data] [nama] = [nilai];

    Konstanta adalah memori penyimpanan data yang nilainya tidak dapat diubah. Penulisan : const [nama] = [nilai];

    Global variable atau constant dapat diakses di seluruh bagian program.

    Local variable atau constant hanya dapat diakses oleh fungsi tempat dideklarasikannya.

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 16

    3.4. Pernyataan Statement atau pernyataan adalah setiap operasi dalam pemrograman, harus diakhiri dengan [;] atau

    [}]. Pernyataan tidak akan dieksekusi bila diawali dengan tanda [//] untuk satu baris. Lebih dari 1

    baris gunakan pasangan [/*] dan [*/]. Pernyataan yang tidak dieksekusi disebut juga komentar.

    Contoh: suhu=adc/255*100; //contoh rumus perhitungan suhu

    3.5. Fungsi

    Function atau fungsi adalah bagian program yang dapat dipanggil oleh program utama.

    Penulisan : [tipe data hasil] [nama function]([tipe data input 1],[tipe data input 2])

    {

    [pernyataan_1];

    [pernyataan_2];

    ...

    }

    3.6. Pernyataan berkondisi dan Pengulangan

    if else: digunakan untuk menyeleksi satu atau beberapa kondisi

    if ( [persyaratan] ) {

    [statement1];

    [statement2];

    ...

    }

    else

    {

    [statement3];

    [statement4];

    ...

    }

    for : digunakan untuk pengulangan dengan jumlah yang sudah diketahui berapa kali diulang.

    for ( [nilai awal] ; [syarat] ; [operasi nilai] )

    {

    [statement1];

    [statement2];

    ...

    }

    while: digunakan untuk pengulangan (looping) jika dan sealama memenuhi suatu kondisi masih

    dipenuhi (pengulangan selama benar

    while ( [persyaratan] )

    {

    [statement1];

    [statement2];

    ...

    }

    do while: digunakan untuk pengulangan jika dan selama memenuhi syarat tertentu, namun min 1 kali

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 17

    do

    {

    [statement1];

    [statement2];

    ...

    }

    while ([persyaratan])

    switch case: digunakan untuk seleksi dengan banyak kondisi

    switch ( [nama variabel] )

    {

    case [nilai1]: [statement1];

    break;

    case [nilai2]: [statement2];

    break;

    ...

    }

    3.7. Operasi Logika dan Bilangan Biner Operator Logika

    AND: &&

    NOT: !

    OR : ||

    Biner

    AND: &

    OR : |

    XOR : ^

    Shift right: >>

    Shift left : =

    Lebih kecil/besar: < , >

    Lebih kecil sama dengan :

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 18

    Contoh:

    a = 5 * 6 + 2 / 2 1 hasilnya 30 a *= 5 jika nilai awal a=30, maka hasilnya 150 a += 3 jika nilai awal a=30, maka hasilnya 33 a++ jika nilai awal a=5, maka hasilnya 6 a-- jika nilai awal a=5, maka hasilnya 4, dst

    3.9. Pengulangan Terus-menerus atau Infinite Looping Apa itu Pengulangan terus-menerus atau infinite looping? Yaitu suatu pengulangan atau kalang

    (loop) yang dilakuka terus-menerus tanpa batas, hingga rangkaian tidak lagi mendapatkan sumber

    catu daya.

    Yang perlu Anda ingat, bahwa kode-kode program yang dijalankan, dalam kaidah Bahasa C, adalah

    yang ada di fungsi utama atau main, seperti contoh berikut...

    void main()

    {

    // pernyataan-pernyataan program

    }

    Program akan dijalankan berurutan dari atas ke bawah dan program tersebut hanya akan dijalankan

    sekali saja. Jika menggunakan infinite loop (ada yang mengatakan sebagai pengulangan tak-hingga

    atau kalang tak-hingga, gak masalah, artinya sama saja kok), maka program yang ada di dalam

    pengulangan tersebut akan dijalankan berulang-ulang terus-menerus, contoh...

    void main()

    {

    // pernyataan-pernyataan program

    while (1); // infinite loop

    {

    // pernyataan2

    }

    }

    Untuk keluar dari infinite looping gunakan perintah break;

    Mengapa terjadi Infinite Looping ?? Perhatikan pada contoh tersebut, pernyataan atau instruksi

    while (1) menyatakan bahwa kondisi SELALU BENAR, sehingga selalu dilakukan pengulangan

    terus-menerus! Coba bedakan dengan contoh berikut...

    void main()

    {

    // pernyataan-pernyataan program

    while (index

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 19

    Program di dalam kurung kurawa setelah instruksi while (index

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 20

    4. Menggunakan AVR Studio 4 dengan WinAVR GCC AVR Studio 4 merupakan perangkat lunak gratis (free software) yang bisa anda unduh di internet

    melalui websitenya Atmel5. Perangkat lunak ini bisa Anda gunakan untuk menulis program bahasa

    mesin (assembly) dan, jika diintegrasikan dengan winAVR GCC6, bahasa C, mensimulasi program

    yang Anda buat7 dan kemudian mendebug program sehingga menghasilkan berkas dengan ekstensi

    .hex yang bisa anda unduh kedalam IC mikrokontroller anda.

    Untuk pertama kali, Anda harus melakukan instalasi AVR Studio 4 ini ke komputer anda, jika ingin

    diintegrasikan dengan WinAVR GCC, lakukan instalasi WinAVR GCC terlebih dahulu sebelum

    AVR Stdui 4.0. Cara menginstalnya pun mudah layaknya anda menginstal perangkat lunak komputer

    yang lain. Gambar 8 adalah contoh tampilan utama dari AVR Studio 4.0 saat pertama kali Anda

    jalankan.

    Gambar 8. Tampilan awal AVR Studio 4.0 Wizard Dialog

    Tampilan yang ditunjukkan pada Gambar 8 bukan merupakan tampilan utama dari AVR Studio 4,

    melainkan kotak dialog wizard yang akan menuntun kita, khususnya, membuat program baru (lihat

    pada tanda panah, bahwa dialog ini diaktifkan setiap kali AVR Studio 4 dijalankan, hilangkan tanda

    centang jika Anda tidak ingin mengaktifkan kotak dialog ini di awal program).

    Okey, sekarang kita klik New Project, sehingga akan ditampilkan pilihan dan isian-isian yang

    ditunjukkan pada Gambar 9.

    Perhatikan tanda panah di Gambar 9, lakukan pilihan bahasa apa yang akan Anda gunakan, apakah

    Atmel AVR Assembler atau AVR GCC? Karena kita akan belajar pemrograman mikrokontroler

    AVR menggunakan Bahasa C, maka dipilih AVR GCC.

    5 http://www.atmel.com 6 Unduh WinAVR GCC di 7 Pengertian simulasi disini adalah simulasi dalam tingkat register bukan simulasi dengan piranti (device). Jika Anda

    menginginkan simulasi dengan rangkain dan piranti, gunakan free software lainnya yaitu VMLAB yang bisa diunduh di http://amctools.com/download.htm (versi terbaru saat ebook ini ditulis adalah v3.15)

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 21

    Langkah berikutnya adalah, perhatikan tanda panah di Gambar 10, mengisi Project name (atau

    nama proyek), Initial file (nama file utama proyek yang bersangkutan) dan Location (tempat

    menyimpan proyek Anda, klik pada tanda panah jika Anda menginginkan lokasi lainnya). Kemudian

    klik Next jika sudah selesai. Kemudian ditampilkan Gambar 11.

    Gambar 9. Halaman 2 kotak dialog wizard

    Gambar 10. Halaman 2 kotak dialog wizard saat dipilih AVR GCC

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 22

    Gambar 11. Halaman 3 kotak dialog wizard memilih mikrokontroler AVR

    Langkah selanjutnya adalah memilih mikrokontroler AVR yang digunakan, perhatikan tanda panah

    pada Gambar 11, dan akhiri dengan klik Finish. Sehingga ditampilkan jendela utama dari AVR

    Studio 4, sebagaimana ditunjukkan pada Gambar 12, dengan editor (perhatikan tanda panah pada

    Gambar 12) siap digunakan untuk mengetikkan program Anda.

    Gambar 12. Jendela utama AVR Studio 4

    Okey, misalnya sekarang kita ketikkan program berikut, ketik saja dulu, ntar kita terangkan atau

    berikan penjelasan tentang program ini di halaman-halaman berikutnya...

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 23

    /*

    * led_01.c

    *

    * Created: 19/07/2011 15:44:08

    * Author: agfianto68

    */

    // program LED01.C

    // menghidupkan lampu LED pada PORTB

    #define F_CPU 11059200

    #include "avr/io.h"

    #define led PORTB

    //===========================================

    void init_devices()

    {

    DDRB=255;

    }

    //==========================================program utama

    int main()

    {

    init_devices();

    led=255;

    }

    //===========================================

    Simpan berkas (program) Anda dengan Ctrl+S atau pilih menu File Save. Kemudian lakukan kompilasi (tekan F7), jika tidak ada kesalahan akan ditampilkan laporan seperti contoh berikut...

    Wow! Anda sudah berhasil membuat program mikrokontroler AVR Anda yang pertama, selamat ya!

    Luar biasa!

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 24

    Lha terus habis gini ngapain? Oya, Anda langsung bisa mensimulasikan-nya (Ctrl+Shift+Alt+F5)

    dengan AVR Studio 4 (perhatikan Gambar 13) atau men-download-kan hex-nya ke board

    mikrokontroler AVR Anda8.

    Gambar 13. Jendela Debugger AVR Studio 4

    Okey, sampai disini pendahuluan AVR Studio 4-nya, sekarang kita mulai bahas konsep

    pemrogramannya, antara lain:

    Konsep Masukan/Luaran atau I/O, dan

    Timer/Counter pada Mikrokontroler AVR

    8 Untuk urusan mendownload program (HEX) ke mikrokontroler silahkan merujuk ke artikel saya yang terkait di ??, dan

    ikuti diskusi-nya.

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 25

    5. Masukan/Luaran (I/O) pada Mikrokontroler AVR Mohon silahkan melihat kembali berbagai macam fitur ATMega16 (sebagai contoh mikrokontroler

    AVR) pada halaman-halaman sebelum ini. Salah satunya adalah memiliki 4 x 8 saluran masukan dan

    luaran digital (berlogika 0 atau 1), totalnya 32 bit atau 32 pin! Masing-masing diberi nama A, B, C

    dan D (masing-masing 8 pin atau 8 bit).

    Kali ini kita akan membahas tentang hal dasar berkaitan dengan konsep I/O atau masukan/luaran

    pada mikrokontroler AVR:

    Membaca tingkat tegangan masukan, apakah berlogika 0 (tegangan disekitar 0 volt) atau 1 (tegangan

    sekitar 5 volt maksimal);

    Mengeluarkan tingkat tegangan 0 (sekitar 0 volt) atau 1 (sekitar 5 volt);

    Untuk keperlua tersebut, AVR memiliki beberapa register yang terkait, yaitu DDRx, PORTx dan

    PINx9, berikut penjelasan masing-masing...

    5.1. Register DDRx Digunakan untuk menentukan apakah sebuah pin pada sebuat PORT (A, B, C atau D) sebagai

    masukan atau luaran atau disebut sebagai arah (direction) dari pin yang bersangkutan:

    Berikan logika 1 (satu) pada bit yang terkait agar dijadikan sebagai luaran atau output.

    Berikan logika 0 (nol) pada bit yang terkait agar dijadikan sebagai masukan atau input.

    Misal PORTA semua bit akan digunakan sebagai masukan, maka untuk mengaturnya kita gunakan

    perintah...

    DDRA= 0x00; //seluruh pin-pin pada Port A digunakan sebagai input

    Misalnya lagi, PORTA.0 akan dijadikan masukan sedangkan PORTA.2 sampai PORTA.7 akan

    digunakan sebagai luaran, maka perintahnya...

    DDRA= 0xFE;

    Perhatikan 0xFE (heksa) = 0b11111110 (biner), perhatikan baik-baik konversi biner ini, setiap bit nilai biner mewakili Pin-Pin pada PortA.

    5.2. Register PORTx Sebagaimana dijelaskan sebelumnya, jika sebuah PORT, semua atau sebagian, dikonfigurasi sebagai

    masukan, maka register ini berfungsi sebagai penentu apakah kondisi pin yang terkait di-pullup atau

    Floating. Begitu juga jika dikonfigurasi sebagai luaran, maka register ini menentukan kondisi pin

    yang terkait terbaca HIGH atau LOW. Untuk memahami hal ini, perhatikan Gambar 14.

    9 Tanda x diganti dengan A, B, C atau D menyesuaikan dengan pin masukan/luaran yang digunakan.

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 26

    Gambar 14. Kondisi pullup pada suatu PORT

    Penjelasan: Jika PIN.1 dihubungkan ke VCC (tegangan 5 Volt) melalui resistor (R), maka inilah

    yang di maksud dengan pullup. Saat tidak ada tegangan dari luar, PIN.1 akan cenderung

    berkondisi HIGH (logika 1). Sedangkan PIN.2 dibiarkan begitu saja sehingga kondisi logik dari

    PIN.2 begitu rentan terhadap pengaruh disekitarnya. PIN.2 bisa berlogika HIGH, bisa juga

    berlogika LOW, ini artinya logika PIN.2 mengambang (floating).

    Kondisi floating biasanya diperlukan saat PIN sebuah mikrokontroler dihubungkan ke suatu sensor.

    Karena jika di pullup, dikhawatirkan kondisi logik PIN tersebut mengganggu kondisi logik pin-pin

    sensor yang bersangkutan.

    Perhatikan contoh-contoh berikut...

    DDRA=0x00;

    PORTA = 0xFF;

    Ini berarti seluruh pin-pin pada PORTA dijadikan sebagai masukan dan di-pullup, artinya pada

    rangkaian yang terkait, jika menggunakan tombol atau pushbutton, jika tidak ditekan akan terbaca

    HIGH dan jika ditekan akan terbaca LOW. Gunakan contoh rangkaian pada Gambar 15 dan

    perhatikan tanda panah, pushbutton satu ujung dihubungkan ke pin yang terkait sedangkan ujung

    lainnya di-GND-kan. INGAT! Ini bukan satu-satu-nya cara membuat rangkaian masukan dengan

    pushbutton, tetapi ini cara yang mudah dan murah meriah... he he he...

    Contoh lainnya...

    DDRB= 0x00;

    PORTB=0x0F;

    Ini artinya seluruh pin-pin PORTB dijadikan masukan, dengan konfigurasi 0x0F (0b00001111) atau

    PORTB.0 sampai PORTB.3 di-pullup, sedangkan PORTB.4 sampai PORTB.7 dikonfigurasi

    floating.

    5.3. Register PINx Digunakan untuk membaca masukan pada pin yang bersangkutan, akan dijelaskan pada contoh

    program di halaman-halaman berikutnya.

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 27

    Gambar 15. Contoh rangkaian aktif rendah tombol pushbutton.

    5.4. Percobaan-1: LED berkedip-kedip Percobaan pertama ini menggunakan rangkaian yang ditunjukkan pada Gambar 16

    10, sedangkan

    contoh penempatan LED dan pushbutton (percobaan-3) pada AVR Trainer v2.0 ditunjukkan pada

    Gambar 17.

    Gambar 16. Rangkaian LED pada PORTB mikrokontroler ATMega16

    10 Gambar AVR Trainer v2.0 selengkapnya ada di cover dari ebook ini!

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 28

    Gambar 17. Penempatan LED dan Pushbutton pada AVR Trainer v2.0

    Listing program ditunjukkan sebagai berikut...

    Penjelasan:

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 29

    Baris 1 4 merupakan deklarasi untuk definisi kristal yang digunakan, yaitu 11.0592MHz11. Pustaka

    apa saja yang digunakan (baris 2 dan 3) dan alias untuk PORTB sebagai led (baris 4);

    Baris 7- 10 merupakan subrutin untuk inisialisasi PORTB sebagai luaran (baris 9). Perhatikan bahwa

    DDRB diberi logika 1 semua (=0xFF atau 255 desimal);

    Program utama ditunjukkan pada baris 13 23, diawali dengan inisialisasi port (baris 15), kemudian

    dilakukan pengulangan tak-hingga (baris 16);

    Yang dilakukan adalah menyalakan LED, dengan cara memberikan logika 1 (baris 18), kemudian

    melakukan penundaan 1 detik (baris 19), kemudian mematikan LED dengan logika 0 (baris 20) dan

    diakhiri dengan penundaan 1 detik (baris 21);

    Demikian seterusnya, LED akan berkedip-kedip dengan tundaan 1 detik.

    5.5. Percobaan-2: Membunyikan buzzer! Masih menggunakan rangkaian yang sama seperti sebelumnya, sekarang buzzer juga akan

    dibunyikan, penempatan buzzer pada AVR Trainer v2.0 dtinjukkan pada Gambar 18.

    Gambar 18. Buzzer pada AVR Trainer Board v2.0

    Perhatikan listing berikut ini...

    [lihat halaman berikut]

    Penjelasan:

    Baris 2 5 sama seperti penjelasan pada percobaan-1;

    Baris 8 dan 9 digunakan untuk mendeklarasikan suatu instruksi untuk memberikan nilai pada

    PORTA.7 dengan nilai logika 1 (baris 8) dan logika 0 (baris 9);

    Selebihnya adalah program utama (baris 19 31), silahkan Anda pelajari dengan seksama.

    11 Silahkan membaca artikel saya yang menjelaskan tentang masalah sistem clock pada mikrokontroler AVR di

    http://agfi.staff.ugm.ac.id/blog/index.php/2009/12/mengenal-system-clock-pada-mikrokontroler-avr/

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 30

    5.6. Percobaan-3: Aplikasi Pushbutton untuk ON/OFF LED Kali ini menggunakan rangkaian pushbutton yang terhubung ke PORTB (ditunjukkan pada Gambar

    15. Ada 2 tombol, satu untuk menyalakan LED dan yang .lain untuk mematikan LED, berikut listing

    programnya...

    [lihat halaman berikut]

    Penjelasan:

    Baris 1 - 4 sudah jelas khan? Belum? Ya monggo, silahkan lihat dulu atau baca lagi penjelasan dari

    percobaan-percobaan sebelumnya, jika sudah paham silahkan kembali lagi kesini...

    Baris 6 8 digunakan untuk mendeklarasikan 3 macam alias, yaitu tombol, satu dan dua. Jika

    Anda perhatikan, khusus tombol didefinisikan sebagai register PIND, sebagaimana janji saya

    sebelumnya register PINx saya jelaskan disini, yaitu digunakan untuk membaca masukan. Artinya

    untuk memberikan luaran melalui register PORTx sedangkan untuk membaca masukan gunakan

    register PINx;

    Perhatikan sekarang pada rutin init_devices() yang berbeda dengan sebelumnya (baris 11 18):

    o DDRB=255 sama seperti sebelumnya, PORTB semuanya dijadikan sebaga saluran luaran;

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 31

    o PORTD.2 dan PORTD.3 digunakan sebagai saluran masukan, sehingga harus diberi logika

    0, caranya bagaimana? Anda bisa langsung memberikan instruksi DDRD = 0b00001100

    atau DDRB = 0x0C;

    o DDRD &= ~(1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 32

    6. Timer/Counter dan Watchdog pada Mikrokontroler AVR Timer/Counter dalam mikrokontroler merupakan fasilitas yang salah satu fungsinya dapat digunakan

    sebagai pewaktu atau cacahan suatu event. Sumber clock atau pemicau dapat dibangkitkan dari sinyal

    eksternal maupun internal.

    Jika sumber sinyal pemicu atau clock berasal dari internal maka Timer/Counter berfungsi sebagai

    pewaktu atau timer dan jika sumber sinyal berasal dari luar maka disebut sebagai pencacah atau

    counter.

    Mikrokontroler ATMega16 memiliki 3 buah timer yaitu Timer0, Timer1 dan Timer2. Timer0 dan

    Timer2 memiliki kapasitas 8-bit sedangkan Timer1 memiliki kapasitas 16-bit. Apa yang dimaksud

    timer 8 bit dan 16 bit?

    Timer 8-bit adalah pewaktu yang bisa mencacah atau menghitung hingga maksimal nilai

    0xFF heksa (dalam biner = 11111111).

    Timer 16-bit sama seperti timer 8-bit, hanya saja nilai maksimalnya mencapai 0xFFFF.

    Pada ebook ini akan dibahas mengenai Timer1, 16-bit, dan untuk dapat menjalankan atau

    menggunakan Timer1 ini, maka kita harus mempelajari terlebih dulu register-register yang berkaitan

    dengan Timer1 karena di register itulah tempat pengaturan Timer/Counter1 agar bisa bekerja.

    Pada Gambar 19 ditunjukkan diagram blok dari Timer1 16-bit, terlihat adanya beberapa register yang

    terkait, antara lain (dari atas): TCNT1, OCR1A, OCR1B, ICR1, TCCR1A, TCCR1B dan juga

    beberapa bit-bit terkait seperti: TOV1, OC1A, OC1B dan ICF1.

    Gambar 19. Diagram blok TIMERn (n diganti dengan 1)

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 33

    Register Timer1 yang akan kita libatkan di awal ini adalah:

    TCCR1B

    TCNT1

    TIMSK

    TIFR

    Register TCCR1B, ditunjukkan pada Gambar 20, merupakan tempat pengaturan clock yang intinya

    agar Timer/Counter1 bisa bekerja, maka register TCCR1B ini jangan sampai diisi dengan 0x00

    (dikosongkan).

    Gambar 20. Register TCCR1B

    Kok tidak boleh berisi 0x00 atau semua bit pada TCCR1B nol semua? Coba perhatikan Tabel 4.

    Sumber clock bisa berasal dari internal mulai dari prescaler 1 hingga 1024 atau bisa juga dari sumber

    eksternal, semua bisa diatur sesuai atau mengikuti aturan pada Tabel 4.

    Apa nilai praskalar itu? Timer1 (juga timer/counter lainnya) membutuhkan sumber detak atau

    clock source. Biasanya sumber detak yang biasa kita pakai berasal dari XTAL. Besarnya maksimum

    sama dengan XTAL yang digunakan dan minimum XTAL/1024. Nah nilai pembagi atau 1024 ini-

    lah yang disebur nilai praskalar atau prescaler.

    Apa yang terjadi jika semua bit di TCCR1B nol semua? Artinya bit 0, 1 dan 2 juga nol semua,

    perhatikan Gambar 19, itu artinya CS12=0, CS11=0 dan CS10=0 dan itu menurut Tabel 4 No clock source (Timer/Counter stopped) Timer berhenti bekerja! Atau tidak bekerja!!

    Tabel 4. Konfigurasi sumber clock atau detak pada TCCR1B

    Tiga bit (CS12, CS11 dan CS10) ini dulu yang kita perhatikan...

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 34

    Okey! Register TCNT1 merupakan register pencacah, artinya nilai di dalamnya akan dinaikkan

    setiap kali ada pemicu, bisa tepi naik atau tepi turun. Jika sumbernya dari dalam (internal)

    pencacahan dilakukan pada saat tepi naik. Register ini akan mencacah naik dari 0x0000 sampai nilai

    max 0xFFFF kemudian di-reset kembali lagi ke 0x0000.

    Overflow (melimpah) terjadi saat kondisi dari 0xFFFF ke 0x0000, sehingga mengakibatkan bit

    TOV1 pada register TIFR akan di-set (diberi logika 1). Kondisi overflow juga bisa digunakan untuk

    menjalankan interrupsi.

    Register TIMSK, yang ditunjukkan pada Gambar 21, merupakan register tempat pengaturan

    interupsi overflow dari Timer/Counter1 yang ingin diaktifkan atau tidak. Dengan memberikan logika

    1 pada bit TOIE1 (bit-2 pada TIMSK), maka interupsi Timer/Counter1 aktif dengan catatan bit

    interupsi global diaktifkan (bit-7 di register Status SREG, perhatikan Gambar 22).

    Perhatikan juga bit-bit lain yang berkaitan dengan masing-masing Timer:

    Timer/Counter-0: OCIE0 dan TOIE0 masing-masing bit 1 dan 0;

    Timer/Counter-1: TICIE1, OCIE1A, OCIE1B dan TOIE1 masing-masing bit 5, 4, 3 dan

    2;

    Timer/Counter-2: OCIE2 dan TOIE2 masing-masing bit 7 dan 6;

    Gambar 21. Register TIMSK

    Gambar 22. Register SREG

    Penjelasan register SREG13

    :

    I Global Interrupt Enable: digunakan untuk mengaktifkan interupsi menyeluruh (global);

    T Bit copy storage

    H Half Carry Flag

    S Sign bit

    V Twos Complement Overflow Flag

    N Negative flag

    Z Zero flag

    C Carry flag

    13 Hanya saya tuliskan yang terkait saja, selengkapnya silahkan merujuk datasheet ATMega16.

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 35

    Sedangkan register TIFR (Timer/Counter Interrupt Flag Register), sebagaimana ditunjukkan pada

    Gambar 23, digunakan sebagai indikator atau penanda apakah sudah terjadi overflow atau belum.

    Pada Timer/Counter1, kondisi overflow ditandai dengan logika 1 pada bit TOV1 (bit-2) pada register

    TIFR.

    Gambar 23. Register TIFR

    Persamaan untuk mencari waktu jeda yang ingin digunakan adalah berdasarkan nilai awal yang harus

    dimasukkan ke dalam TCNT1, gunakan persamaan berikut:

    TCNT1 = (1+0xFFFF) - (waktu *( XTAL / praskalar) )

    Waktu waktu yang diinginkan

    XTAL frekuensi kristal yang dipakai

    praskalar nilai prescaler (lihat penjelasan berikut ini)

    6.1. Percobaan-4: Menggunakan Timer1 Menyalakan dan mematikan LED pada PORTB dengan jeda 1 detik menggunakan Timer1. Bedakan

    dengan Percobaan-1 dan 2 yang hanya menggunakan fungsi delay yang sama sekali tidak

    menggunakan fasilitas Timer/Counter.

    Okey, sekarang kita cari dulu nilai TCNT1-nya...

    Nilai XTAL-nya 11,0592MHz atau 11.059.200Hz;

    Nilai praskalarnya 1024;

    Waktu yang diinginkan 1 detik, maka

    Gunakan TCNT1 = (1+0xFFFF) - (waktu *( XTAL / prescaler) ), jadi...

    TCNT1 = (1+65535)-(1detik * (11059200/1024))

    = 65536 - (1detik*10800)

    = 65536-10800

    = 54736 (desimal)

    = D5D0 (heksadesimal)

    Alternatif lain, Anda bisa menggunakan programnya AVR Timer yang bisa diunduh melalui website

    http://www.techideas.co.nz. Langkah-langkah penggunakan program ini kita jelaskan berikut:

    1. Setelah mengunduh program AVR Timer dari http://www.techideas.co.nz, langkah selanjutnya adalah

    menjalankan AVRTimer1Clac.exe untuk perhitungan atau kalkulasi Timer1;

    2. Lakukan pengisian beberapa nilai sebagaimana ditunjukkan pada Gambar 23, menyesuaikan dengan

    kebutuhan yang telah kita tetapkan tadi:

    a. Frekuensi kristal: 11,0592MHz atau ditulis 11.059.200 Hz;

    b. Pilih nilai prescale sebesar 1024;

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 36

    c. Isikan Timer1 Interrupts per second (berapa kali interupsi/detik) sebesar 1 kali;

    d. Perhatikan hasilnya (Gambar 24).

    Gambar 24. Contoh penggunaan ATMega Timer Calculator TIMER1

    Listing programnya...

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 37

    Penjelasan:

    Program ini pada dasarnya sama seperti percobaan-1, hanya saja sekarang tundaan atau jeda

    menggunakan fasiltas Timer1 yang ada di ATMega16;

    Cukup saya jelaskan saja subrutin delay1detik(), yang lainnya sama seperti penjelasan percobaan-

    percobaan sebelumnya:

    o Baris-15 merupakan pengisian register TCCR1B agar digunakan nilai prescale sebesar 1024,

    artinya nilai kristal 11,0592MHz dibagi dengan 1024, sekaligus mengaktifkan Timer1;

    o Baris-16 memberikan nilai awal pada TCNT1 sesuai dengan perhitungan atau kalkulasi yang

    telah dilakukan sebelumnya, yaitu mengisi dengan nilai awal 54.736 (desimal) atau 0xD5D0

    (heksadesimal);

    o Baris-17 menunggu hingga terjadi overflow ini merupakan proses pooling bukan interupsi;

    o Jika sudah terjadi overflow atau melimpah, maka flag TOV1 di-reset (baris 18) dan Timer1

    dimatikan (baris 19).

    Gampang tho!?

    6.2. Percobaan-5: Menggunakan Timer2 Okey sekarang saya tunjukkan contoh lainnya menggunakan Timer2 dan penggunaan

    AVRTimer2Calc ditunjukkan pada Gambar 25. Untuk 10 milidetik diisi 100 kali interupsi per detik.

    Gambar 25. Contoh penggunaan ATMega Timer Calculator TIMER2

    // program TIMER02.C

    // ON dan OFF LED pada PORTB menggunakan Timer2

    // By Agfianto Eko Putra, 2010

    #define F_CPU 11059200UL

    #include "avr/io.h"

    #define led PORTB

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 38

    void init_devices()

    {

    DDRB=255;

    }

    //gunakan AVR Delay calculator untuk menghitung

    //tundaan 10 milidetik dengan frek kristal 11.0592MHz

    void delay10ms()

    {

    TCCR2=0B00000111; //prescaler 1024

    TCNT2=0x94; //isi ulang 0x94 agar 1 detik

    while(!(TIFR&(1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 39

    o Agar terjadi penundaan sekitar 10 milidetik, maka nilai register TCNT2 (pada baris 15) diberi

    nilai sebesar .....19

    heksadesimal atau .......20

    desimal;

    Gambar 26. Register TCCR2

    o Baris 16 digunakan untuk menunggu terjadinya ......................21 pada Timer2, kemudian bit

    overflow tersebut direset (baris-17).

    o Timer2 kemudian dihentikan dengan memberi nilai .........22 pada register TCCR2.

    Tabel 5. Konfigurasi sumber clock atau detak pada TCCR2

    6.3. Percobaan-6: Menggunakan Timer0 Bagaimana kalau menggunakan Timer0? Pengaturan pewaktuan menggunakan AVRTimer0Calc

    ditunjukkan pada Gambar 27. Untuk penundaan 10 milidetik sebanyak 100 kali, parameter-nya sama

    seperti Timer2.

    18 Jawaban: 1024 19 Jawaban = 94 20 Jawaban = 148 (seratus empat puluh delapan) 21 Jawaban: overflow 22 Jawaban: 0 (nol) atau 0x00

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 40

    Gambar 27. Contoh penggunaan ATMega Timer Calculator TIMER0

    Berikut listing programnya...

    // program TIMER03.C

    // ON dan OFF LED pada PORTB menggunakan Timer0

    // By Agfianto Eko Putra, 2010

    #define F_CPU 11059200UL

    #include "avr/io.h"

    #define led PORTB

    void init_devices()

    {

    DDRB=255;

    }

    //gunakan AVR Delay calculator untuk menghitung

    //tundaan 10 milidetik dengan frek kristal 11.0592MHz

    void delay10ms()

    {

    TCCR0=0B00000101; //prescaler 1024

    TCNT0=0x94; //isi ulang 0x94 agar 1 detik

    while(!(TIFR&(1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 41

    delay10ms();

    }

    }

    int main()

    {

    init_devices();

    for(;;)

    {

    led=255;

    delay1detik();

    led=0;

    delay1detik();

    }

    }

    6.4. Percobaan-7: Lima Kali pencacahan aplikasi Counter // program COUNTER.C

    // 5 kali pencacahan menaikkan angka pada PORTC

    // By Agfianto Eko Putra, 2010

    #define F_CPU 11059200UL

    #include "avr/io.h"

    #include "avr/interrupt.h" // saatnya menggunakan interupsi

    #define led PORTC

    #define pencacah PORTD

    volatile unsigned int cacah; // sbg volatile agar tetap global

    // di dalam ISR

    ISR(TIMER0_OVF_vect)

    {

    TCNT0=0xFB; // isi ulang 0xFB agar 5 kali saja

    ++cacah; // setara dengan -5 (negatif 5)

    }

    // -- untuk aktivasi interupsi TIMER0 --

    void enable_timer0()

    {TIMSK|=(1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 42

    // Inisialisasi Timer/Counter 0

    // Sumber detak: pin T0 Rising Edge

    // Mode: Normal top=FFh

    TCCR0=0x06;

    // Luaran OC0 output: tidak dihubungkan

    OCR0=0x00;

    // Nilai awal dari Timer/Counter 0 (-5 desimal)

    TCNT0=0xFB;

    enable_timer0();

    sei();

    cacah=1;

    while(1)

    {

    led = cacah;

    pencacah = TCNT0;

    }

    }

    6.5. Tentang Watchdog

    Pewaktu watchdog merupakan piranti pewaktuan perangkat keras yang bisa memicu reset sistem

    pada saat program utama, karena ada beberapa keasalahan, seperti hang, mengabaikan layanan rutin

    ke watchdog (biasanya seperti pemberian pulsa secara rutin), atau gampangannya kalo Anda punya

    anjing atau kucing kemudian lupa memberikan makan, apa yang terjadi? Ya jegog atau ngeong

    khan?? Dalam hal ini, saat jegog atau ngeong, pewaktu watchdog akan mereset sistem. Intinya,

    mengembalikan sistem ke awal mula (kondisi normal) karena telah terjadi kesalahan atau hang

    tadi

    Pewaktu Watchdog pada mikrokontroler AVR mendapatkan clock dari osilator internal 1 MHz yang

    tersendiri (khusus). Dengan melakukan pengontrolan Watchdog Prescaler, interval reset yang

    dilakukan Watchdog dapat diatur dan mengikuti Tabel 6. Gambar 28 menunjukkan diagram blok

    pewaktu watchdog pada mikrokontroler AVR sedangkan Gambar 29 menunjukkan register yang

    terlibat.

    Tabel 6. Pemilihan Watchdog Prescaler

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 43

    Gambar 28. Pewaktu Watchdog

    Gambar 29. Register Watchdog WDTCR

    Kesimpulan:

    Mikrokontroler AVR memiliki pewaktu Watchdog internal.

    Pewaktu watchdog adalah pewaktu yang bisa me-RESET mikrokontroler saat mencapai nilai

    tertentu.

    Selama jalannya program, pewaktu ini harus di-reset (secara manual) sebelum mencapai nilai

    maksimum-nya. Hal ini untuk memastikan bahwa program berjalan dengan baik dan benar

    (kayak bahasa Indonesia aja ya). Saat program mengalami masalah (hang, crash) atau diam saja pada suatu kalang, maka tidak

    terjadi proses reset pewaktu Watchdog sehingga RESET sistem secara otomatis akan terjadi.

    6.6. Percobaan-8: Aplikasi Watchdog (Bagian-1) Walaupun menggunakan LCD, pembahasan tentang LCD ada di bagian lain dari buku ini, sementara

    diikuti saja listingnya sebagai berikut...

    // program WD01.C

    // tampilan di LCD16x2 dan watchdog

    #define F_CPU 11059200UL

    #include "util/delay.h"

    #include "stdlib.h"

    #include "avr/io.h"

    #include "avr/pgmspace.h"

    #include "avr/wdt.h"

    #include "lcd_pc.c"

    //#define WDTO_2S 7

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 44

    #define led PORTB

    #define tombol PIND

    #define satu 2

    #define dua 3

    //==================================================

    void init_devices()

    {

    DDRB=255; //PORTB sebagai luaran

    DDRD&=~(1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 45

    #include "lcd_pc.c"

    //#define WDTO_2S 7

    #define led PORTB

    #define tombol PIND

    #define satu 2

    #define dua 3

    //==================================================

    void init_devices()

    {

    DDRB=255; //PORTB sebagai luaran

    DDRD&=~(1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 46

    7. Interupsi dan Aplikasinya

    7.1. Pendahuluan Interupsi Mikrokontroler AVR

    Anda bisa membayangkan sebuah sistem elektronik yang selalu mengirimkan atau menampilkan

    data suhu per detik dan pada saat yang bersamaan melakukan kontrol pengadukan sebuah tangki,

    artinya proses atau kontrol utama pada sistem tersebut hanya melakukan pengadukan isi tangki

    dengan kecepatan yang bergantung pada data-data suhu. Setiap detik dilakukan pembacaan data

    suhu, kemudian ditampilkan pada layar LCD, misalnya, dan dijadikan acuan untuk menetapkan

    kecepatan pengadukan.

    Skenario tersebut membutuhkan mekanisme interupsi. Saat proses dilakukan secara normal,

    kemudian terjadi interupsi, program normal ditinggalkan terlebih dulu, mengerjakan rutin interupsi,

    kemudian kembali lagi mengerjakan program secara normal. Inilah konsep interupsi...!

    Mikrokontroler AVR memiliki 21 macam sumber interupsi yang terdiri dari 3 interupsi eksternal dan

    18 interupsi internal, sebagaimana ditunjukkan pada Tabel 7.

    Tabel 7. Daftar Sumber Interupsi Mikrokontroler AVR

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 47

    7.2. Percobaan-10: ON/OFF LED menggunakan Interupsi Timer0

    Percobaan ini merupakan penggunaan TIMER0 melalui interupsi, listing selengkapnya sebagai

    berikut...

    // program INTERUPSI_TIMER01.C

    // ON dan OFF LED pada PORTB

    // selama 1 detik menggunakan interupsi TIMER0

    #define F_CPU 11059200

    #include "avr/io.h"

    #include "avr/interrupt.h"

    #define led PORTB

    ISR(TIMER1_OVF_vect)

    {

    led=!led; // toggle penyalaan LED (ON/OFF)

    TCNT1=0xd5d0; //isi ulang 0xD5D0 agar 1 detik

    TIFR=4;

    }

    void init_devices()

    {

    DDRB=255; //LED OUTPUT

    }

    //==============================================

    void enable_timer1()

    {TIMSK|=(1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 48

    7.3. Percobaan-11: ON/OFF LED melalui Interupsi Eksternal // program INTERUPSI01.C

    // ON dan OFF LED pada PORTB

    // melalui interupsi INT0 dan INT1 pada PORTD.2 dan PORTD.3

    #define F_CPU 11059200

    #include "avr/io.h"

    #include "util/delay.h"

    #include "avr/interrupt.h"

    #define led PORTB

    #define tombol PIND

    #define satu 2

    #define dua 3

    //interupsi eskternal 0 dan 1

    //===============================================================

    ISR(INT0_vect)

    {

    led=0;

    }

    ISR(INT1_vect)

    {

    led=255;

    }

    //=================================================================

    void enableint0()

    {GICR|=(1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 49

    8. Komunikasi Serial Komunikasi serial pada mikrokontroler AVR menggunakan fasilitas USART singkatan dari

    Universal Syncronous and Asyncronous Receiver Transmitter sangat handal dan berguna dalam

    berbagai aplikasi yang berhubungan antarmuka komunikasi serial dengan PC atau sesama

    mikrokontroler AVR atau bahkan mikrokontroler lain yang memiliki fasilitas komunikasi serial,

    misalnya program pemantauan suhu ruangan sekaligus pengontrolan AC atau kipas menggunakan

    antarmuka program PC Visual Basic atau Delphi, dan lain-lain.

    Jalur komunikasi serial pada mikrokontroler AVR ATMega16/32/8515 terdapat pada pin PORTD.0

    (RXD) dan PORTD.1 (TXD), perhatikan pin-pin yang terkait pada Gambar 4 dan 5. Diagram

    bloknya ditunjukkan pada Gambar 30.

    Gambar 30. Diagram blok fasilitas komunikasi serial AVR

    Berikut fitur-fitur komunikasi serial atau USART pada ATMega16:

    Full Duplex Operation (Independent Serial Receive and Transmit Registers)

    Asynchronous or Synchronous Operation

    Master or Slave Clocked Synchronous Operation

    High Resolution Baud Rate Generator

    Supports Serial Frames with 5, 6, 7, 8, or 9 Data Bits and 1 or 2 Stop Bits

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 50

    Odd or Even Parity Generation and Parity Check Supported by Hardware

    Data OverRun Detection

    Framing Error Detection

    Noise Filtering Includes False Start Bit Detection and Digital Low Pass Filter

    Three Separate Interrupts on TX Complete, TX Data Register Empty, and RX Complete

    Multi-processor Communication Mode

    Double Speed Asynchronous Communication Mode

    Pembahasan komunikasi serial USART dipisahkan menjadi 3 bagian yaitu Penghasil detak (clock

    generator), Mengirim data (Data Transmit) dan Menerima data (Data Receive).

    8.1. Penghasil Detak - Clock Generator Penghasil detak atau Clock Generator tergantung pada mode data transfer, yaitu terdapat 4 (empat)

    mode penghasil detak, yaitu:

    Normal asynchronous;

    Double Speed asynchronous;

    Master synchronous, dan

    Slave synchronous.

    Pada Gambar 31 ditunjukkan diagram blok logik penghasil detak yang terkait dengan beberapa

    register seperti UBRR (16-bit: UBRRL dan UBRRH) dan lain-lain.

    Gambar 31. Diagram blok logik penghasil detak untuk komunikasi serial

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 51

    Kebanyakan yang digunakan adalah Asynchronous Internal Clock Generator. Register penentuan

    baudrate atau kecepatan komunikasi serial atau UBRR digunakan dimana nilai yang diberikan

    adalah untuk down-counter. Setiap kali nilai down-counter mendekati nol, maka sebuah clock

    dibangkitkan.

    Anda bisa menghitung berapa nilai UBRR yang sesuai dengan baudrate yang diinginkan mengacu

    pada osilator atau kristal yang digunakan oleh mikrokontroler menggunakan persamaan

    BAUD = fclk/(16(UBRR+1))

    Persamaan ini digunakan untuk Asynchronous Normal Mode, jika menggunakan mode Double

    Speed Asynchronous, maka persamaan yang digunakan adalah

    BAUD = fclk/(8(UBRR+1))

    Informasi detil tentang clock generator ini bisa dilihat di datasheet AVR ATMega16. Anda bisa juga

    memanfaatkan website http://www.wormfood.net/avrbaudcalc.php untuk menghitung secara online.

    Misalkan digunakan frekuensi osilator untuk mikrokontroler sebesar 8 MHz (atau 8.000.000 Hz) dan

    baudrate yang diinginkan adalah 9600, setelah dihitung menggunakan persamaan diatas diperoleh

    nilai UBRR sebesar 51,083333333, kita bulatkan menjadi 51. Dengan nilai UBRR =51, maka nilai

    seseungguhnya dari baudrate adalah 9615 (bukan 9600), jika dibagi dengan 9600 diperoleh 1.0016

    dan karena itu error-nya adalah 0.16%. Dengan error tersebut USART masih dapat bekerja tetapi

    tidak sempurna.

    Anda bisa menggunakan AVR Assistant yang dibuat oleh Mike Henning (bisa Anda unduh program

    tersebut di http://www.esnips.com/web/AtmelAVR), program ini juga bisa digunakan sebagai

    alternatif dari AVR Timer Calculator yang telah dijelaskan sebelumnya. Tampilan awal ditunjukkan

    pada Gambar 32.

    Gambar 32. Contoh penggunaan AVR Assistant v1.3

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 52

    Penjelasan Gambar 30:

    Bagian kiri digunakan untuk mengatur baudrate, sedangkan bagian kanan digunakan untuk

    mengatur Timer0, 1 dan 2 (jadi satu antarmukanya);

    Contoh untuk baudrate 9600, dengan kristal 8MHz, hasil perhitungannya ditunjukkan pada

    Gambar 33 kiri, sedangkan untuk kristal 7,372MHz ditunjukkan pada Gambar 33 kanan.

    Perhatikan perbedaan error %-nya.

    Gambar 33. Contoh penggunaan AVR Assistant v1.3 untuk dua frekuensi MPU berbeda

    Untuk contoh pengaturan Timer1 agar menunda interupsi terjadi 100 kali per detik (seperti

    kasus timer yang dijelaskan sebelumnya), dengan frekuensi kristal 11,059MHz, ditunjukkan

    pada Gambar 34.

    Gambar 34. Contoh penggunaan untuk TIMER1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 53

    Untuk mengatasi ketidak-akuratan baudrate tersebut, biasanya digunakan kristal dengan frekuensi

    7,372MHz atau 11,0592MHz. Perhatikan informasi selengkapnya untuk nilai UBRR di Tabel 8.

    Tabel 8. Nilai-nilai UBRR dengan 8MHz, 7,372MHz dan 11,0592MHz23

    Berikut adalah subrutin yang digunakan untuk menghitung nilai UBRR pada winAVR GCC

    Variabel MYUBRR digunakan untuk menyimpan nilai UBRR setelah dilakukan perhitungan

    sebagaimana ditunjukkan pada listing tersebut. Pemanggilannya menggunakan instruksi

    initserial(MYUBRR);

    23 Hasil perhitungan dari http://www.wormfood.net/avrbaudcalc.php

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 54

    8.2. Mengirim Data USART Transmitter Pengirim USART atau UASRT Transmitter dapat diaktifkan dengan memberikan logika satu di bit

    TXEN yang terdapat dalam register UCSRB pada bit-3, perhatikan register UCSRB yang

    ditunjukkan pada Gambar 35.

    Gambar 35. Register UCSRB

    Saat bit TXEN diberi logika 1, artinya USART Transmitter diaktifkan, dengan demikian pin TxD

    pada PORTD.1 hanya bisa digunakan untuk pengiriman data pada komunikasi serial. Lakukan

    terlebih dahulu inisialisasi baudrate, mode kerja dan format data sebelum mengirimkan data-data

    melalui port serial. Untuk mengatur berapa stop bit, digunakan USBS pada register UCSRC,

    Gambar 36, sedangkan mengatur lebar bit data digunakan UCSZ2 (di register UCSRB), UCSZ1 dan

    UCSZ0 (di register UCSRC) mengikuti Tabel 9.

    Gambar 36. Register UCSRC

    Tabel 9. Jumlah data bit yang ditentukan UCSZ2..0

    Jika Anda menggunakna mode sinkron, maka pin XCK (PORTB.0) hanya boleh digunakan untuk

    mengirimkan detak atau clock transmisi.

    Berikut adalah subrutin yang digunakan untuk mengaktifkan UASRT Transmitter pada winAVR

    GCC.

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 55

    Penjelasan:

    Perhatikan baris 12 (selain TXEN=1, sekaligus untuk mengakifkan UASRT Receiver di RXEN=1).

    Format datanya 8-bit data (lihat Tabel 4) dengan instruksi (3

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 56

    Gambar 37. Register UDR Read dan Write

    Gambar 38. Register UCSRA

    Subrutin kedua, yaitu uart_puts() digunakan untuk mengirimkan serangkaian data (tidak

    hanya satu karakter saja), perhatikan terjadinya pengulangan subtrutin uart_putc() pada baris

    27 dan 28.

    8.3. Menerima Data USART Receive Untuk menerima data, USART Receiver dapat kita aktifkan dengan memberikan logika 1 pada bit

    RXEN yang terdapat dalam register UCSRB, perhatikan kembali Gambar 33. Saat bit RXEN diberi

    logika 1, artinya USART Reciever diaktifkan, dengan demikian pin RxD pada PORTD.0 hanya bisa

    digunakan untuk penerimaan data pada komunikasi serial.

    Berikut adalah cara yang digunakan untuk menerima data (karakter), ada di dalam program utama

    (main()):

    Untuk menerima data caranya mudah, yaitu dengan memeriksa apakah bit RXC (bit ke 7) pada

    register UCSRA bernilai 1? Perhatikan Gambar 36 dan baris 50. Jika RXC bernilai 1 artinya UDR

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 57

    berisi data yang diterima secara serial, sehingga setelah terdeteksi RXC=1, dilanjutkan dengan

    menyalin isi UDR ke suatu variabel (pada contoh digunakan tempserial), sebagaimana ditunjukkan

    pada baris 52.

    8.4. Percobaan-12: Komunikasi Serial

    Percobaan komunikasi serial ini bertujuan menampilkan dua kalimat pembuka dan mengirim

    kembali apapun yang diketikkan melalui terminal serial (hasil-nya ditunjukkan pada Gambar 39),

    misalnya, jika diketik a, maka karakter a ini dikirim kembali ke serial, perhatikan baris 52 dan 53 pada listing program berikut:

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 58

    Gambar 39. Ragkaian untuk komunikasi serial dan contoh running hasil aplikasi

    Konektor komunikasi serial pada AVR Trainer Board v2.0 ditunjukkan pada Gambar 40.

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 59

    Gambar 40. Koneksi serial RS232 pada AVR Trainer Board v2.0

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 60

    9. LCD dan ADC

    9.1. Rangkaian antarmuka LCD dan ADC

    Gambar 41. Rangkaian antarmuka LCD 4-bit data

    Gambar 42. Tampilan sebuah LCD 16x2 karakter

    Pada Gambar 41 ditunjukkan rangkaian baku antarmuka LCD, yang contohnya ditunjukkan pada

    Gambar 42, merupakan tipe 2x16 karakter dan tentunya masih ada tipe-tipe lainnya.

    Penjelasan Gambar 41:

    D4 s/d D7: jalur data 4-bit (LCD bisa mendukung antarmuka 4 bit atau 8 bit, untuk efisiensi pin, pada modul ini hanya dibahas antarmuka 4-bit);

    Pin R/W di-GND-kan, artinya data dikirim sebagai proses WRITE (menulis) ke LCD;

    Pin RS dan E masing-masing disambungkan ke pin pada mikrokontroler AVR untuk melakukan pengontrolan Register Select dan Enable. Anda tidak perlu kawatir bagaimana

    caranya mengontrol LCD, karena sudah diurus langsung oleh pustakan AVR GCC;

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 61

    Gambar 43. Rangkaian dasar LCD dan ADC serta komponen-komponen lainnya

    Gambar 44. Penampil LCD dan Masukan ADC pada AVR Basic Trainer v2.0

    Pada Gambar 43 ditunjukkan contoh rangkaian antarmuka LCD dan ADC dengan ATMega16 yang

    bisa digunakan untuk latihan-latihan antarmuka LCD dan ADC. Sedangkan pada Gambar 44

    ditunjukkan komponen-komponen LCD dan masukan ADC yang terkait pada papan AVR Basic

    Trainer v2.0.

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 62

    9.2. Percobaan-13: Aplikasi LCD Bagian-1

    Percobaan ini akan menampilkan tulisan saya manusia pada baris pertama dan tulisan keren pada baris kedua di LCD 16x2 karakter dengan antarmuka LCD 4-bit data.

    // program LCD_01.C

    // tampilan di LCD16x2

    // By Agfianto Eko Putra, 2010

    #define F_CPU 11059200UL

    #include "util/delay.h"

    #include "avr/io.h"

    #include "avr/pgmspace.h"

    #include "lcd_pc.c"

    //==================================================

    void init_devices()

    {

    DDRC=255; // PORTC sebagai luaran ke LCD

    }

    //===============program utama======================

    int main()

    {

    init_devices();

    init_lcd();

    lcd_goto(line1);

    lcd_puts(" saya manusia");

    lcd_goto(line2);

    lcd_puts(" keren");

    while(1);

    }

    9.3. Percobaan-14: Aplikasi LCD Bagian-2

    Percobaan ini akan menampilkan tulisan saya manusia pada baris pertama dan tulisan keren pada baris kedua di LCD 16x2 karakter dengan antarmuka LCD 4-bit data dengan berkedip-kedip.

    // program LCD_02.C

    // tampilan di LCD16x2

    // By Agfianto Eko Putra, 2010

    #define F_CPU 11059200UL

    #include "util/delay.h"

    #include "avr/io.h"

    #include "avr/pgmspace.h"

    #include "lcd_pc.c"

    //==================================================

    void init_devices()

    {

    DDRC=255;

    }

    //================program utama=====================

    int main()

    {

    init_devices();

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 63

    init_lcd();

    while(1) {

    lcd_goto(line1);

    lcd_puts(" saya manusia");

    lcd_goto(line2);

    lcd_puts(" keren");

    _delay_ms(250);

    lcd_clrscr();

    _delay_ms(250);

    }

    }

    9.4. Percobaan-15: Aplikasi LCD Bagian-3 // program LCD_03.C

    // tampilan di LCD16x2

    // By Agfianto Eko Putra, 2010

    #define F_CPU 11059200UL

    #include "util/delay.h"

    #include "avr/io.h"

    #include "avr/pgmspace.h"

    #include "lcd_pc.c"

    //==================================================

    void init_devices()

    {

    DDRC=255;

    }

    //==========================================program utama

    int main()

    {

    init_devices();

    init_lcd();

    lcd_goto(line1);

    lcd_puts("0123456789ABCDEF");

    lcd_goto(line2);

    lcd_puts("FEDCBA9876543210");

    _delay_ms(250);

    LCD_RS_LO;

    while(1) {

    for (int i=1; i

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 64

    9.5. Percobaan-16: Aplikasi LCD Bagian-4 // program LCD_03.C

    // tampilan di LCD16x2

    // By Agfianto Eko Putra, 2010

    #define F_CPU 11059200UL

    #include "util/delay.h"

    #include "avr/io.h"

    #include "avr/pgmspace.h"

    #include "lcd_pc.c"

    #define led PORTB

    #define tombol PIND

    #define satu 2

    #define dua 3

    //==================================================

    void init_devices()

    {

    DDRD&=~(1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 65

    9.6. Percobaan-17: Menggunakan ADC Internal Bagian-1

    Menggunakan rangkaian yang ditunjukkan pada Gambar 41 yang merupakan rangkaian antarmuka

    ADC dan LCD dengan ATMega16. Pada rangkaian tersebut, kanal atau channel ADC yang

    digunakan pada latihan ini adalah kanal-0 dan 1 atau ADC0 dan ADC1. Masukan ADC tersebut

    dihubungkan ke sebuah potensiometer (atau bisa juga diganti dengan LM35 atau sensor apa saja

    yang menghasilkan tegangan 0 Vref). // program ADC01.C

    // pembacaan ADC internal M16

    #define F_CPU 11059200UL

    #include "util/delay.h"

    #include "stdlib.h"

    #include "avr/io.h"

    #include "avr/pgmspace.h"

    #include "lcd_pc.c"

    #define led PORTB

    #define tombol PIND

    #define satu 2

    #define dua 3

    unsigned int getadc(unsigned char channeladc)

    {

    unsigned int adcVal;

    ADMUX=channeladc|0x40; //avcc

    ADCSRA|=(1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 66

    {

    tempadc1=getadc(0);

    tempadc2=getadc(1);

    lcd_goto(line1);

    lcd_puts("POT: ");

    lcdword(tempadc1);

    lcd_goto(line2);

    lcd_puts("LDR: ");

    lcdword(tempadc2);

    _delay_ms(500);

    }

    }

    //===========================================

    9.7. Percobaan-18: Menggunakan ADC Internal Bagian-2 // program ADC02.C

    // pembacaan ADC internal M16

    #define F_CPU 11059200UL

    #include "util/delay.h"

    #include "stdlib.h"

    #include "avr/io.h"

    #include "avr/pgmspace.h"

    #include "lcd_pc.c"

    #define led PORTB

    #define tombol PIND

    #define satu 2

    #define dua 3

    unsigned int getadc(unsigned char channeladc)

    {

    unsigned int adcVal;

    ADMUX=channeladc|0x40; //avcc

    ADCSRA|=(1

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 67

    unsigned int pot,ldr;

    init_devices();

    init_lcd();

    led=0;

    lcd_goto(line1);

    lcd_puts("Demo ADC-0 dan 1");

    lcd_goto(line2);

    lcd_puts(" AT Mega16!");

    _delay_ms(1000);

    lcd_clrscr();

    for(;;)

    {

    tempadc1=getadc(0);

    tempadc2=getadc(1);

    pot=(tempadc1/1024)*5;

    ldr=(tempadc2/1024)*5;

    lcd_goto(line1);

    lcd_puts("POT: ");

    lcdword(pot);

    lcd_goto(line2);

    lcd_puts("LDR: ");

    lcdword(ldr);

    _delay_ms(500);

    }

    }

    //===========================================

    Catatan Anda:

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    .......................................................................................................................................... ........................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

    ..................................................................................................................................................................

  • Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 68

    10. Komunikasi I2C untuk RTC dan EEPROM

    10.1. Pendahuluan RTC DS1307

    Emping (chip/IC) RTC (Real Time Clock) DS1307 bekerja dengan daya rendah (low power),

    memiliki kalender/jam BCD dan SRAM yang nonvolatile dengan kapasitas 56 bytes. Alamat dan

    data dikirim melalui 2 kabel dwi- arah. Jam dan kalender pada DS1307 menyediakan informasi

    detik, menit, jam, hari, tanggal, bulan dan tahun. Banyak hari dalam satu bulan diatur secara otomatis

    oleh IC ini baik untuk 31 hari maupun kurang. Jam bekerja dalam format 24 jam atau 12 jam dengan

    indikator AM/PM. DS1307 dapat mendeteksi secara otomatis catu dayanya, jika catu daya ke sistem

    mati, maka secara otomatis DS1307 akan mengambil catu daya dari baterai (jika dipasang).

    DS 1307 memiliki 8 buah pin dan tersedia dalam bentuk 8-pin DIP serta 8- pin SOIC. Konfigurasi

    ditunjukkan pada Gambar 45.

    Gambar 45. Diagram pin RTC DS1307

    Penjelasan Gambar 45:

    VCC, GND: Tegangan DC disediakan pada pin ini.