P. 1
Tutorial Avrstudio+Avrgcc

Tutorial Avrstudio+Avrgcc

|Views: 874|Likes:
Published by Verry Cahyadi

More info:

Published by: Verry Cahyadi on May 05, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

05/05/2013

pdf

text

original

Tutorial Pemrograman Mikrokontroler AVR dengan AVR Studio dan WinAVR GCC (ATMega16/32/8535

)
Versi 2.0

http://klikdisini.com/embedded

oleh Agfianto Eko Putra (agfi68@gmail.com) dan Dhani Nugraha (dhan_t46@yahoo.com)

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

Tutorial Pemrograman Mikrokontroler AVR dengan AVR Studio dan WinAVR GCC (ATMega16/32/8535)
Disusun oleh: Agfianto Eko Putra – agfi68@gmail.com dan Dhani Nugraha - dhan_t46@yahoo.com

Daftar Isi
1. 2. Apakah Mikrokontroler itu? ...................................................................................................... 4 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 - 2

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

Kecepatan yang relatif rendah ini sudah mencukupi untuk aplikasi-aplikasi berbasis mikrokontroler. Sedangkan mikrokontroler sejak awal menjalankan program yang tersimpan dalam ROM internal-nya (bisa berupa Mask ROM atau Flash PEROM atau Flash ROM).5 GHz. melalui sensor (masukan) dan aktuator (luaran). Masukanmasukan • sensor cahaya • sensor suhu • sensor tekanan. Sama-sama memiliki beberapa luaran dan masukan (I/O) yang digunakan untuk melakukan komunikasi timbal-balik dengan dunia luar. 24 MHz. dll Gambar 1. maka tidak terlepas dari pengertian atau definisi tentang Komputer itu sendiri. Apakah Mikrokontroler itu? Jika kita bicara tentang Mikrokontroler. biasanya dari ROM (Read Only Memory)1 atau RAM (Random Access Memory)2. perhatikan bagan yang ditunjukkan pada Gambar 1. kecepatan kerja atau operasionalnya masih cukup rendah. 40 MHz dan lain sebagainya). Sama-sama memiliki RAM yang digunakan untuk menyimpan data-data sementara atau yang lebih dikenal dengan variabel-variabel.4 . Sama sekali berbeda.1. pemrosesan hingga luaran Lantas apa yang membedakan antara Mikrokontroler dengan Komputer atau Mikrokomputer? Begitu mungkin pertanyaan yang ada di benak kita. CPU tersebut sama-sama menjalankan program dari suatu lokasi atau tempat. dalam orde MHz (misalnya. artinya tetap akan tersimpan walaupun tidak diberi catu daya. antara lain:     Sama-sama memiliki unit pengolah pusat atau yang lebih dikenal dengan CPU (Central Processing Unit). Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . dll Luaran-luaran • aktuator motor • relay • speaker. Bagan masukan. sedangkan CPU pada Mikrokontroler berada didalam (internal) sebuah chip. 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. 1 2 Memori yang hanya bisa dibaca saja. Sifat memori program dalam mikrokontroler ini nonvolatile. saat kita membaca beberapa daftar kesamaan yang sudah saya tuliskan tersebut. kemudian mengambil atau menjalankan program yang tersimpan dalam hard disk. Jika CPU pada mikrokomputer menjalankan program dalam ROM atau yang lebih dikenal dengan BIOS (Basic I/O System) pada saat awal dihidupkan. Memori yang bisa dibaca juga bisa ditulisi. dll Pemroses • uC AT89 • uC AVR • uC PIC16F. mengapa? Ada kesamaan-kesamaan antara Mikrokontroler dengan Komputer (atau Mikrokomputer).

pada mikrokontroler akses keluaran dan masukan bisa per bit. Hasil penerjemahan tersebut merupakan suatu operasi yang harus dikerjakan oleh ALU (Arithmetic Logic Unit). bisa dikatakan bahwa Mikrokomputer atau Komputer merupakan komputer serbaguna atau general purpose computer. Jika diamati lebih lanjut. Sedangkan di sekeliling „Otak‟ terdapat berbagai macam periferal seperti SFR (Special Function Register) yang bertugas menyimpan data-data sementara selama proses berlangsung). Diagram Blok mikrokontroler (yang) disederhanakan ALU. sebagaimana ditunjukkan pada Gambar 2. Memori RAM atau RAM Memory bisa digunakan sebagai tempat penyimpan sementara. Luaran dan masukan (I/O) pada mikrokomputer jauh lebih kompleks dibandingkan dengan mikrokontroler. Instruction Decoder. sedangkan RAM pada mikrokontroler ada di dalam chip dan kapasitasnya rendah. selain itu. Jantungnya berasal dari detak OSC (lihat pada Gambar 2 sebelah kiri atas). Sedangkan mikrokontroler adalah special purpose computer atau komputer untuk tujuan khusus. 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 . mungkin dengan bantuan memori sementara Accumulator yang kemudian menghasilkan sinyal-sinyal kontrol ke seluruh periferal yang terkait melalui Control Logic. Gambar 2. 256 byte dan seterusnya dan ukuran yang relatif kecil inipun dirasa cukup untuk aplikasi-aplikasi mikrokontroler. misalnya 128 byte. yang jauh lebih sederhana. Accumulator dan Control Logic. bisa dimanfaatkan untuk berbagai macam aplikasi (atau perangkat lunak).5 . agar Anda mendapatkan gambaran tentang mikrokontroler lebih jelas. Perhatikan Gambar 2.   RAM pada mikrokomputer bisa mencapai ukuran sekian GByte dan bisa di-upgrade ke ukuran yang lebih besar dan berlokasi di luar CPU-nya. hanya satu macam aplikasi saja. merupakan Otak-nya mikrokontroler yang bersangkutan. Instruction Decoder bertugas menerjemahkan setiap instruksi yang ada di dalam Program Memory (hasil dari pemrograman yang kita buat sebelumnya).

untuk tujuan atau fungsifungsi khusus. Terdedikasi untuk satu macam aplikasi saja (lihat contoh-contoh yang akan saya terangkan pada bagian lain dari buku ini). 500. Timer atau Counter digunakan sebagai pewaktu atau pencacah. INFORMASI PELATIHAN MIKROKONTROLER. mikrokontroler AVR di pasaran saat ini juga relatif murah sedangkan Basic Stamp bisa mencapai Rp. Biasanya sebuah mikrokontroler bisa memiliki lebihd dari 1 timer. PLC DAN LAIN-LAIN HTTP://KLIKDISINI. 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). untuk melakukan komunikasi dengan periferal eksternal mikrokontroler seperti sensor dan aktuator. Sedangkan pencacah lebih digunakan sebagai penghitung atau pencacah event atau bisa juga digunakan untuk menghitung berapa jumlah pulsa dalam satu detik dan lain sebagainya. Mikrokontroler yang beredar saat ini dibedakan menjadi dua macam. EEPROM (sama seperti RAM hanya saja tetap akan menyimpan data walaupun tidak mendapatkan sumber listrik/daya) dan port-port I/O untuk masukan/luaran. sebagai pewaktu fungsinya seperti sebuah jam digital dan bisa diatur cara kerjanya.00. 15. berdasarkan arsitekturnya: o Tipe CISC atau Complex Instruction Set Computing yang lebih kaya instruksi tetapi fasilitas internal secukupnya saja (seri AT89 memiliki 255 instruksi).6 . digunakan untuk mengubah data-data analog menjadi digital untuk diolah atau diproses lebih lanjut.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. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Seringkali tahan-banting. Memiliki beberapa keluaran maupun masukan yang terdedikasi.ADC atau Analog to Digital Converter (tidak setiap mikrokontroler memiliki ADC internal).00).000. Kecil dan relatif lebih murah (seri AT89 di pasaran serendah-rendahnya bisa mencapai Rp. Hanya membutuhkan daya yang (cukup) rendah (low power) sekitar 50 mWatt (Anda bandingkan dengan komputer yang bisa mencapai 50 Watt lebih). terutama untuk aplikasi-aplikasi yang berhubungan dengan mesin atau otomotif atau militer.000.

MegaAVR (nah yang ini sudah mulai banyak yang nulis bukunya…) Mikrokontroler dengan unjuk-kerja tinggi. itupun masih kalah populer dengan keluarga AT89 yang belakangan juga sudah mulai banyak yang beralih ke AVR. atau lebih dikenal dengan fitur-fiturnya. dilengkapi EEPROM 4K Bytes dan SRAM 8K Bytes. mikrokontroler flash AVR32 32-bit daya rendah. yaitu:   TinyAVR (tidak ada kaitannya ama mbak Tini yang jualan gudeg…) Mikrokontroler (mungil. Mikrokontroler Atmel: Sukses melalui inovasi Cuman yang populer di Indonesia adalah tinyAVR dan megaAVR.    Gambar 3. sistem Event dan DMA yang ditingkatkan. Atmel membuat 5 (lima) macam atau jenis mikrokontroler AVR. Perhatikan Gambar 3. memiliki SRAM hingga 32 KByte. dilengkapi SRAM dan EEPROM 512 Bytes. Semua mikrokontroler AVR Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . AVR32 AP7 Unjuk-kerja tinggi. dilengkapi Pengali Perangkat keras (Hardware Multiplier). AVR32 UC3 Unjuk-kerja tinggi. AVR XMEGA Mikrokontroler AVR 8/16-bit XMEGA memiliki periferal baru dan canggih dengan unjukkerja. Memiliki flash hingga 512 KByte dan SRAM 128 KByte. prosesor aplikasi AVR32 32-bit daya rendah. Pendahuluan Keluarga Mikrokontroler AVR merupakan mikrokontroler dengan arsitektur modern (emang selama ini ada yang kuno kali??). Pengetahuan Dasar Mikrokontroler AVR 2. serta merupakan pengembangan keluarga AVR untuk pasar low power dan high performance (daya rendah dan unjuk-kerja tinggi).1. hanya 8 sampai 32 pin) serbaguna dengan Memori Flash untuk menyimpan program hingga 16K Bytes.2.7 . Perbedaan jenis-jenis tersebut terletak dari fasilitas. Jenis TinyAVR merupakan mikrokontroler dengan jumlah pin yang terbatas (sedikit maksudnya) dan sekaligus fitur-fiturnya juga terbatas dibandingkan yang megaAVR. mampu menyimpan program hingga 256 KBytes.

o Crypto engine. he he he. Memilih AVR “yang benar” Moralnya… tidak peduli tinyAVR.6 volt operation and CPU speed up to 32 MHz. Bayangkan saja Anda punya TinyAVR dan MegaAVR. XMEGA AVR (AVR32 pengecualian karena masuk ke mikrokontroler 32-bit) semuanya memiliki unjuk-kerja yang sama saja. berdasar informasi resmi dari Atmel (http://www. nah Anda akan memiliki AVR Core yang sama! Kayak membuang semua isi hamburger. high resolution 12-bit ADC and DAC. megaAVR o Self-Programming Flash memory with boot block. fitur atau fasilitas terbatas = TinyAVR. o Great performance for cost effective devices.com) dan maaf masih dalam bahasa Inggris (supaya kelihatannya aura kecanggihannya. maka Anda akan mendapatkan rotinya doang yang sama… 2. o Fully featured with 10-bit ADCs and high speed PWMs onboard. o High data throughput. o Memory management unit. AVR32 AP7 o High CPU perfromance. o Low power consumption.). o Accurate and flexible Clock System with dynamic clock switching. AVR XMEGA o picoPower technology for ultra low power consumption o True 1.2. o Low power consumption. SPI and TWI(1) compliant serial interfaces. o debugWIRE On-Chip Debug and In-System Programming.  tinyAVR o Optimized for simple applications requiring a small microcontroller.. o SIMD / DSP instructions. o Instruction & data caches.1 compliant JTAG interface on megaAVRs with 44 pins or more.memiliki set instruksi (assembly) dan organisasi memori yang sama. Timers/Counters and fast communication interfaces. o High speed. o On-Chip Debug through JTAG or debugWIRE interface. USART dan lain sebagainya.atmel. megaAVR. o USART. o High accuracy 10-bit A/D converters with up to x200 analog gain stage. ADC. o Event System and DMA Controller.. UART. o High reliability. EEPROM. o Low system cost. dengan demikian berpindahpindah (walaupun tidak disarankan) antar mikrokontroler AVR gak masalah dan mudah! Beberapa mikrokontroler AVR memiliki SRAM. AVR32 UC3 o High CPU performance. o Self-Programming Flash memory for maximum flexibility. o Easy to use. pengali perangkat keras. o IEEE 1149.8 . Gitu aja kok repot… Untuk lebih jelasnya perhatikan keterangan singkat yang saya berikan berikut ini. tetapi dengan “kompleksitas” atau fasilitas yang berbeda-beda. antarmuka SRAM eksternal. kemudian telanjangi (maksudnya copotin) semua periferal-nya. o Built for embedded Linux     Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . ibaratnya begini: banyak fasilitas dan fitur = megaAVR.

ATMega8535. apakah yang 40 pin atau yang kurang dari itu..3. 10-bit ADC  8 Single-ended Channels  7 Differential Channels in TQFP Package Only  2 Differential Channels with Programmable Gain at 1x. 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. Mode Pembanding dan Capture yang terpisah. EEPROM. ATMega168 dan lain sebagainya.1 Compliant) – Boundary-scan Capabilities According to the JTAG Standard – Extensive On-chip Debug Support – Programming of Flash. and Lock Bits through the JTAG Interface Fitur-fitur periferal – Dua Pewaktu/Pencacah 8-bit dengan Praskalar dan Mode Pembanding terpisah..000 Flash/100. Tentu saja Anda bisa menggunakan tipe AVR lainnya. maaf juga masih sebagian besar dalam Bahasa Inggris 3.3. – Pencacah Real Time dengan Osilator terpisah – Empat kanal PWM – 8-kanal. – Sebuah Pewaktu/Pencacah 16-bit Timer/Counter Dengan Praskalar.1. 2. ATMega16.000 EEPROM – Data retention: 20 years at 85°C/100 years at 25°C – 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. 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. Fuses. sehingga fokus pada buku ini tidak melulu pada datasheet. 10x. 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.9 . Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .2.. 1149. • • Mikrokontroler AVR 8-bit daya-rendah dengan unjuk-kerja tinggi. 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. ATMega128.. bisa ATMega88.

perhatikan begitu banyaknya fitur-fitur dalam diagram blok tersebut. 3V.5 . Diagram Pin dan Diagram Blok Mikrokontroler AVR ATMega16 Pada Gambar 4 dan 5 ditunjukkan diagram pin. ADC Noise Reduction. sebagaimana juga sudah saya kutipkan pada bagian sebelumnya. and 44-pad QFN/MLF Tegangan kerja – 2.• • • • Reset saat Power-on dan Deteksi Brown-out yang bisa diprogram Internal Calibrated RC Oscillator Sumber interupsi Eksternal dan INternal Enam Mode Sleep: Idle.16 MHz untuk Atmega16 Konsumsi daya pada 1 MHz.5.8 MHz untuk Atmega16L – 0 . Standby and Extended Standby I/O and Packages – 32 Programmable I/O Lines – 40-pin PDIP. 25°C for Atmega16L – Aktif: 1. Power-down. untuk Mikrokontroler AVR ATMega16 tipe PDIP dan TQFP/MLF atau dikenal sebagai SMD. Power-save. Gambar 4.3.7 .5.1 mA – Idle Mode: 0.35 mA – Mode Power-down: < 1 μA – – – – INFORMASI PELATIHAN MIKROKONTROLER.5V untuk Atmega16L – 4. 44-lead TQFP.2. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .COM/PELATIHANAVR 2. masing-masing. PLC DAN LAIN-LAIN HTTP://KLIKDISINI.5V untuk Atmega16 Kecepatan (frekuensi clock) – 0 .10 . Diagram Pin Mikrokontroler AVR ATMega16 tipe PDIP Pada Gambar 6 dan 7 ditunjukkan diagram blok untuk Mikrokontroler AVR ATMega16.

Vcc GND Port A (PA7. Port B berfungsi sebagai sebagai port I/O dwi-arah 8-bit. Port A berfungsi sebagai masukan analog ke ADC internal pada mikrokontroler ATMega16. Port D juga memiliki berbagai macam fungsi alternatif. Diagram Pin Mikrokontroler AVR ATMega16 tipe SMD 2. sebagaimana ditunjukkan pada Tabel 1 Port C berfungsi sebagai sebagai port I/O dwi-arah 8-bit. Port C juga digunakan sebagai antarmuka JTAG.Masingmasing pin menyediakan resistor pull-up internal yang bisa diaktifkan untuk masing-masing bit. sebagaimana ditunjukkan pada Tabel 2 Port D berfungsi sebagai sebagai port I/O dwi-arah 8-bit..3..Gambar 5.PD0) 4 Resistor pull up internal berkaitan dengan rangkaian internal pada mikrokontroler AVR yang bersangkutan.11 ... selain itu juga berfungsi sebagai port I/O dwi-arah 8-bit..3.PB0) Port C (PC7.. Masing-masing pin menyediakan resistor pull-up internal4 yang bisa diaktifkan untuk masing-masing bit. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . jika ADC-nya tidak digunakan. Port B juga memiliki berbagai macam fungsi alternatif.PA0) Masukan tegangan catu daya Ground.Masingmasing pin menyediakan resistor pull-up internal yang bisa diaktifkan untuk masing-masing bit. Penjelasan Singkat Pin-pin pada Mikrokontroler AVR ATMega16 Berikut kita jelaskan secara singkat fungsi dari masing-masing PIN pada Mikrokontroler AVR ATMega16.Masingmasing pin menyediakan resistor pull-up internal yang bisa diaktifkan untuk masing-masing bit. Port B (PB7. emang apalagi kalau bukan ground.PC0) Port D (PD7.

Jika ADC digunakan sebaiknya dihubungkan ke Vcc melalui tapis lolos-bawah (low-pass filter).12 . Level rendah pada pin ini selama lebih dari lama waktu minimum yang ditentukan akan menyebabkan reset. biasanya dihubungkan ke Vcc./RESET XTAL1 XTAL2 AVCC AREF sebagaimana ditunjukkan pada Tabel 3 Masukan Reset. Luaran dari penguat osilator terbalik Merupakan masukan tegangan catu daya untuk Port A sebagai ADC. Diagram blok Mikrokontroler AVR ATMega16 – Bagian I Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Merupakan tegangan referensi untuk ADC Gambar 6. walaupun clock tidak dijalankan. Masukan ke penguat osilator terbalik (inverting) dan masukan ke rangkaian clock internal. walaupun ADC-nya tidak digunakan.

Diagram blok Mikrokontroler AVR ATMega16 – Bagian II Pada Tabel 1. Dalam buku saya ini sengaja penjelasan dari masing-masing fungsi tersebut (kecuali antarmuka JTAG) akan dibahas pada saat digunakan. 2 dan 3 ditunjukkan masing-masing alternatif fungsi dari Port B.Gambar 7. Alternatif fungsi PORTB Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . istilah kerennya “Learning by Doing”.13 .. Tabel 1. sehingga Anda bisa memahami langsung dengan mencoba. Port C dan Port D..

Alternatif fungsi PORTC Tabel 3.Tabel 2.14 . Alternatif fungsi PORTD INFORMASI PELATIHAN MIKROKONTROLER. PLC DAN LAIN-LAIN HTTP://KLIKDISINI.COM/PELATIHANAVR Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .

Local variable atau constant hanya dapat diakses oleh fungsi tempat dideklarasikannya. [global variables] [functions] int main(void) // Program Utama { [Deklarasi local variable/constant] [Isi Program Utama] } Keterangan:  Opsional artinya boleh ditulis boleh tidak.2. Struktur Penulisan Bahasa C // Opsional // Opsional // Opsional // Opsional Perhatikan struktur penulisan dalam Bahasa C sebagai berikut.3. termasuk mikrokontroler. 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. Dengan demikian seorang programmer dapat menuangkan (menuliskan) algoritmanya dengan mudah. 3. const [nama] = [nilai]. Pengenalan Bahasa C untuk Mikrokontroler AVR Bahasa C luas digunakan untuk pemrograman berbagai jenis perangkat.15   . Konstanta adalah memori penyimpanan data yang nilainya tidak dapat diubah..   Deklarasi Variabel dan Konstanta Variabel adalah memori penyimpanan data yang nilainya dapat diubah-ubah. Penulisan : Global variable atau constant dapat diakses di seluruh bagian program.h] > #define [nama1] [nilai].. khususnya seri AVR dari Atmel. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Penulisan : [tipe data] [nama] = [nilai]. #include < [library1. menyesuaikan kebutuhan – tuliskan pustaka apa saja yang digunakan dan lain sebagainya  Penulisan variabel dilakukan di awal agar aman bisa digunakan sepanjang program. 3. 3. Ada yang menyebutkan bahwa bahasa ini merupakan High Level Language sisanya menyebut sebagai Midle Level Language.1.         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. .16 . Fungsi Function atau fungsi adalah bagian program yang dapat dipanggil oleh program utama..[tipe data input 2]) { [pernyataan_1]. } do while: digunakan untuk pengulangan jika dan selama memenuhi syarat tertentu.] atau [}].. for ( [nilai awal] . [statement4]. [statement2]. Pernyataan yang tidak dieksekusi disebut juga komentar. namun min 1 kali Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . . Lebih dari 1 baris gunakan pasangan [/*] dan [*/]. //contoh rumus perhitungan suhu 3.5.4... [syarat] .. Penulisan : [tipe data hasil] [nama function]([tipe data input 1]. .6... } for : digunakan untuk pengulangan dengan jumlah yang sudah diketahui – berapa kali diulang. Pernyataan Statement atau pernyataan adalah setiap operasi dalam pemrograman.. } else { [statement3]... harus diakhiri dengan [. [operasi nilai] ) { [statement1]. [pernyataan_2]. Pernyataan tidak akan dieksekusi bila diawali dengan tanda [//] untuk satu baris. } 3. [statement2]. [statement2]. Contoh: suhu=adc/255*100. Pernyataan berkondisi dan Pengulangan if else: digunakan untuk menyeleksi satu atau beberapa kondisi if ( [persyaratan] ) { [statement1]. . . } while: digunakan untuk pengulangan (looping) jika dan sealama memenuhi suatu kondisi masih dipenuhi (pengulangan selama benar while ( [persyaratan] ) { [statement1].

.7. Sisa pembagian Ditambah 1 (increment) atau dikurangi satu (decrement) Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . . -...8. dikali atau dibagi dengan nilai di sebelah kanan operator. > <= Lebih besar sama dengan: Lebih kecil/besar: Lebih kecil sama dengan : 3. kurang.. Operasi Logika dan Bilangan Biner AND: NOT: OR : && ! || Operator Logika Biner AND: OR : XOR : Shift right: Shift left : & | ^ >> << >= < . } 3. Operasi Aritmetika Operator +.do { [statement1]. /= % ++. } while ([persyaratan]) switch case: digunakan untuk seleksi dengan banyak kondisi switch ( [nama variabel] ) { case [nilai1]: [statement1]. *=. case [nilai2]: [statement2]. / +=. break. . [statement2]. break. -Keterangan Tambah. *. kali dan bagi Nilai di sebelah kiri operator ditambah. dikurangi. -=.17 .

Mengapa terjadi Infinite Looping ?? Perhatikan pada contoh tersebut. artinya sama saja kok). // infinite loop { // pernyataan2 } } Untuk keluar dari infinite looping gunakan perintah break.Contoh: a = 5 * 6 + 2 / 2 – 1  hasilnya 30 a *= 5  jika nilai awal a=30. 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. pernyataan atau instruksi while (1) menyatakan bahwa kondisi SELALU BENAR.. bahwa kode-kode program yang dijalankan. maka hasilnya 4. sehingga selalu dilakukan pengulangan terus-menerus! Coba bedakan dengan contoh berikut. // infinite loop { // pernyataan2 Index += 1. maka hasilnya 150 a += 3  jika nilai awal a=30. } } Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .18 .9. void main() { // pernyataan-pernyataan program while (index<5).. Yang perlu Anda ingat. Jika menggunakan infinite loop (ada yang mengatakan sebagai pengulangan tak-hingga atau kalang tak-hingga.. dst 3. adalah yang ada di fungsi utama atau main. contoh. hingga rangkaian tidak lagi mendapatkan sumber catu daya. maka hasilnya 33 a++  jika nilai awal a=5. gak masalah. maka hasilnya 6 a-. seperti contoh berikut.. void main() { // pernyataan-pernyataan program } Program akan dijalankan berurutan dari atas ke bawah dan program tersebut hanya akan dijalankan sekali saja. maka program yang ada di dalam pengulangan tersebut akan dijalankan berulang-ulang terus-menerus. jika nilai awal a=5. void main() { // pernyataan-pernyataan program while (1).. dalam kaidah Bahasa C..

Program di dalam kurung kurawa setelah instruksi while (index<5) akan dijalankan selama nilai dari index kurang dari 5.COM/PELATIHANAVR Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . index merupakan variabel sehingga nilainya bisa berubah.19 . PLC DAN LAIN-LAIN HTTP://KLIKDISINI. maka pengulangan dihentikan. jika index lebih dari atau sama dengan 5. INFORMASI PELATIHAN MIKROKONTROLER. Nah.

com Unduh WinAVR GCC di 7 Pengertian simulasi disini adalah simulasi dalam tingkat register bukan simulasi dengan piranti (device).4. Okey. lakukan pilihan bahasa apa yang akan Anda gunakan. Gambar 8 adalah contoh tampilan utama dari AVR Studio 4.0 saat pertama kali Anda jalankan. sehingga akan ditampilkan pilihan dan isian-isian yang ditunjukkan pada Gambar 9. 5 6 http://www. jika ingin diintegrasikan dengan WinAVR GCC. lakukan instalasi WinAVR GCC terlebih dahulu sebelum AVR Stdui 4. melainkan kotak dialog wizard yang akan menuntun kita. mensimulasi program yang Anda buat7 dan kemudian mendebug program sehingga menghasilkan berkas dengan ekstensi . hilangkan tanda centang jika Anda tidak ingin mengaktifkan kotak dialog ini di awal program). Anda harus melakukan instalasi AVR Studio 4 ini ke komputer anda. 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.20 .htm (versi terbaru saat ebook ini ditulis adalah v3. Untuk pertama kali.atmel. gunakan free software lainnya yaitu VMLAB yang bisa diunduh di http://amctools. bahasa C. Jika Anda menginginkan simulasi dengan rangkain dan piranti. bahwa dialog ini diaktifkan setiap kali AVR Studio 4 dijalankan. Gambar 8. Perangkat lunak ini bisa Anda gunakan untuk menulis program bahasa mesin (assembly) dan.0.hex yang bisa anda unduh kedalam IC mikrokontroller anda. membuat program baru (lihat pada tanda panah. sekarang kita klik New Project. apakah Atmel AVR Assembler atau AVR GCC? Karena kita akan belajar pemrograman mikrokontroler AVR menggunakan Bahasa C.0 – Wizard Dialog Tampilan yang ditunjukkan pada Gambar 8 bukan merupakan tampilan utama dari AVR Studio 4.15) Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Perhatikan tanda panah di Gambar 9. jika diintegrasikan dengan winAVR GCC 6.com/download. Tampilan awal AVR Studio 4. maka dipilih AVR GCC. khususnya. Cara menginstalnya pun mudah layaknya anda menginstal perangkat lunak komputer yang lain.

klik pada tanda panah jika Anda menginginkan lokasi lainnya). Gambar 9. Halaman 2 kotak dialog wizard saat dipilih AVR GCC Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . mengisi Project name (atau nama proyek). Kemudian ditampilkan Gambar 11. Initial file (nama file utama proyek yang bersangkutan) dan Location (tempat menyimpan proyek Anda. Halaman 2 kotak dialog wizard Gambar 10.Langkah berikutnya adalah. Kemudian klik Next jika sudah selesai.21 . perhatikan tanda panah di Gambar 10.

. dan akhiri dengan klik Finish. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . dengan editor (perhatikan tanda panah pada Gambar 12) siap digunakan untuk mengetikkan program Anda. misalnya sekarang kita ketikkan program berikut.. Halaman 3 kotak dialog wizard – memilih mikrokontroler AVR Langkah selanjutnya adalah memilih mikrokontroler AVR yang digunakan. sebagaimana ditunjukkan pada Gambar 12. perhatikan tanda panah pada Gambar 11. ntar kita terangkan atau berikan penjelasan tentang program ini di halaman-halaman berikutnya. ketik saja dulu.Gambar 11. Jendela utama AVR Studio 4 Okey. Gambar 12. Sehingga ditampilkan jendela utama dari AVR Studio 4.22 .

C // menghidupkan lampu LED pada PORTB #define F_CPU 11059200 #include "avr/io..23 . selamat ya! Luar biasa! Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . jika tidak ada kesalahan akan ditampilkan laporan seperti contoh berikut. led=255. Wow! Anda sudah berhasil membuat program mikrokontroler AVR Anda yang pertama./* * led_01.. Kemudian lakukan kompilasi (tekan F7). } //=========================================== Simpan berkas (program) Anda dengan Ctrl+S atau pilih menu File  Save. } //==========================================program utama int main() { init_devices().h" #define led PORTB //=========================================== void init_devices() { DDRB=255.c * * Created: 19/07/2011 15:44:08 * Author: agfianto68 */ // program LED01.

Lha terus habis gini ngapain? Oya. Jendela Debugger AVR Studio 4 Okey. sampai disini pendahuluan AVR Studio 4-nya. 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 . sekarang kita mulai bahas konsep pemrogramannya. Gambar 13.24 . 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.

B. totalnya 32 bit atau 32 pin! Masing-masing diberi nama A.7 akan digunakan sebagai luaran. perhatikan baik-baik konversi biner ini. yaitu DDRx. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . C dan D (masing-masing 8 pin atau 8 bit). Salah satunya adalah memiliki 4 x 8 saluran masukan dan luaran digital (berlogika 0 atau 1). B.. Begitu juga jika dikonfigurasi sebagai luaran. //seluruh pin-pin pada Port A digunakan sebagai input Misalnya lagi. apakah berlogika 0 (tegangan disekitar 0 volt) atau 1 (tegangan sekitar 5 volt maksimal). maka untuk mengaturnya kita gunakan perintah.... maka register ini berfungsi sebagai penentu apakah kondisi pin yang terkait di-pullup atau Floating. Perhatikan  0xFE (heksa) = 0b11111110 (biner).0 akan dijadikan masukan sedangkan PORTA.2 sampai PORTA. maka perintahnya. AVR memiliki beberapa register yang terkait. C atau D menyesuaikan dengan pin masukan/luaran yang digunakan.2. jika sebuah PORT. PORTA. berikut penjelasan masing-masing. setiap bit nilai biner mewakili Pin-Pin pada PortA. DDRA= 0x00. Misal PORTA semua bit akan digunakan sebagai masukan. maka register ini menentukan kondisi pin yang terkait terbaca HIGH atau LOW. 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. semua atau sebagian.. Untuk memahami hal ini.25 . 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..1. Register PORTx Sebagaimana dijelaskan sebelumnya. DDRA= 0xFE. Kali ini kita akan membahas tentang hal dasar berkaitan dengan konsep I/O atau masukan/luaran pada mikrokontroler AVR:   Membaca tingkat tegangan masukan. 9 Tanda „x‟ diganti dengan A. dikonfigurasi sebagai masukan. Register DDRx Digunakan untuk menentukan apakah sebuah pin pada sebuat PORT (A. Untuk keperlua tersebut. Mengeluarkan tingkat tegangan 0 (sekitar 0 volt) atau 1 (sekitar 5 volt).5. B. perhatikan Gambar 14. PORTx dan PINx9. 5. Berikan logika 0 (nol) pada bit yang terkait agar dijadikan sebagai masukan atau input.

Kondisi pullup pada suatu PORT Penjelasan: Jika PIN. Karena jika di pullup.2 dibiarkan begitu saja sehingga kondisi logik dari PIN.3 di-pullup. maka inilah yang di maksud dengan pullup. ini artinya logika PIN. Contoh lainnya. dikhawatirkan kondisi logik PIN tersebut mengganggu kondisi logik pin-pin sensor yang bersangkutan. PORTA = 0xFF.1 dihubungkan ke VCC (tegangan 5 Volt) melalui resistor (R).. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Perhatikan contoh-contoh berikut.0 sampai PORTB. Kondisi floating biasanya diperlukan saat PIN sebuah mikrokontroler dihubungkan ke suatu sensor. pushbutton satu ujung dihubungkan ke pin yang terkait sedangkan ujung lainnya di-GND-kan. jika menggunakan tombol atau pushbutton. PORTB=0x0F. Sedangkan PIN. DDRA=0x00.. Saat tidak ada tegangan dari luar.. Gunakan contoh rangkaian pada Gambar 15 dan perhatikan tanda panah.26 .4 sampai PORTB. Register PINx Digunakan untuk membaca masukan pada pin yang bersangkutan.. he he he.7 dikonfigurasi floating. DDRB= 0x00. artinya pada rangkaian yang terkait. akan dijelaskan pada contoh program di halaman-halaman berikutnya. tetapi ini cara yang mudah dan murah meriah. PIN. Ini artinya seluruh pin-pin PORTB dijadikan masukan.Gambar 14. sedangkan PORTB. Ini berarti seluruh pin-pin pada PORTA dijadikan sebagai masukan dan di-pullup.2 begitu rentan terhadap pengaruh disekitarnya. jika tidak ditekan akan terbaca HIGH dan jika ditekan akan terbaca LOW. INGAT! Ini bukan satu-satu-nya cara membuat rangkaian masukan dengan pushbutton.3. dengan konfigurasi 0x0F (0b00001111) atau PORTB..2 mengambang (floating).. bisa juga berlogika LOW. PIN.2 bisa berlogika HIGH. 5.1 akan cenderung berkondisi HIGH (logika 1)...

27 . Percobaan-1: LED berkedip-kedip Percobaan pertama ini menggunakan rangkaian yang ditunjukkan pada Gambar 16 10.4. 5. Contoh rangkaian aktif rendah tombol pushbutton.0 ditunjukkan pada Gambar 17.Gambar 15. Gambar 16. sedangkan contoh penempatan LED dan pushbutton (percobaan-3) pada AVR Trainer v2.0 selengkapnya ada di cover dari ebook ini! Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Rangkaian LED pada PORTB mikrokontroler ATMega16 10 Gambar AVR Trainer v2.

28 ..0 Listing program ditunjukkan sebagai berikut.Gambar 17. Penjelasan: Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Penempatan LED dan Pushbutton pada AVR Trainer v2..

11 Silahkan membaca artikel saya yang menjelaskan tentang masalah sistem clock pada mikrokontroler AVR di http://agfi. Baris 7. sekarang buzzer juga akan dibunyikan. Percobaan-2: Membunyikan buzzer! Masih menggunakan rangkaian yang sama seperti sebelumnya..5. Yang dilakukan adalah menyalakan LED. diawali dengan inisialisasi port (baris 15).staff. LED akan berkedip-kedip dengan tundaan 1 detik..id/blog/index.10 merupakan subrutin untuk inisialisasi PORTB sebagai luaran (baris 9). Demikian seterusnya. Buzzer pada AVR Trainer Board v2.ac. silahkan Anda pelajari dengan seksama. Selebihnya adalah program utama (baris 19 – 31). Baris 8 dan 9 digunakan untuk mendeklarasikan suatu instruksi untuk memberikan nilai pada PORTA. Perhatikan bahwa DDRB diberi logika 1 semua (=0xFF atau 255 desimal). [lihat halaman berikut] Penjelasan:    Baris 2 – 5 sama seperti penjelasan pada percobaan-1.29 . dengan cara memberikan logika 1 (baris 18).ugm. penempatan buzzer pada AVR Trainer v2. yaitu 11. kemudian dilakukan pengulangan tak-hingga (baris 16).0 dtinjukkan pada Gambar 18.0592MHz11. kemudian mematikan LED dengan logika 0 (baris 20) dan diakhiri dengan penundaan 1 detik (baris 21). Pustaka apa saja yang digunakan (baris 2 dan 3) dan alias untuk PORTB sebagai led (baris 4).7 dengan nilai logika 1 (baris 8) dan logika 0 (baris 9). 5. Gambar 18.     Baris 1 – 4 merupakan deklarasi untuk definisi kristal yang digunakan.0 Perhatikan listing berikut ini. Program utama ditunjukkan pada baris 13 – 23.php/2009/12/mengenal-system-clock-pada-mikrokontroler-avr/ Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . kemudian melakukan penundaan 1 detik (baris 19).

Jika Anda perhatikan. Baris 6 – 8 digunakan untuk mendeklarasikan 3 macam alias..4 sudah jelas khan? Belum? Ya monggo..6. khusus tombol didefinisikan sebagai register PIND. [lihat halaman berikut] Penjelasan:   Baris 1 . Perhatikan sekarang pada rutin init_devices() yang berbeda dengan sebelumnya (baris 11 – 18): o DDRB=255 sama seperti sebelumnya. satu untuk menyalakan LED dan yang . sebagaimana janji saya sebelumnya register PINx saya jelaskan disini.  Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . 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‟ dan „dua‟. yaitu digunakan untuk membaca masukan. PORTB semuanya dijadikan sebaga saluran luaran. Artinya untuk memberikan luaran melalui register PORTx sedangkan untuk membaca masukan gunakan register PINx. yaitu „tombol‟.lain untuk mematikan LED.5.30 . jika sudah paham silahkan kembali lagi kesini. berikut listing programnya. silahkan lihat dulu atau baca lagi penjelasan dari percobaan-percobaan sebelumnya.

31 .2 ditekan? Atau justru tombol di PIND.2 dan PORTD |= (1<<3) untuk PORTD.3 yang ditekan:  Jika tombol yang ada di PIND. menggunakan instruksi masing-masing PORTD |= (1<<2) untuk PORTD. sehingga harus diberi logika „0‟. sebagaimana dituliskan pada baris 24 hingga 28..  Program utama dimulai dari baris 20 hingga 29: o Diawali dengan inisialisasi device pada 22.}. baris 23. dan DDRD &= ~(1<<3) untuk PORTD.3. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .3 digunakan sebagai saluran masukan.3 ditekan maka led dimatikan semua (baris 27)! Mudah bukan? 12 Jika ditekan bernilai logika „0‟.o o o PORTD. maka kedua pin tersebut diaktifkan pullup-nya. adalah proses memeriksa apakah tombol yang dihubungkan ke PIND.2 dan PORTD.) {. o Yang diulang-ulang terus menerus menggunakan instruksi for (.2 (tanda „~” artinya NOT).3. perhatikan masing-masing baris 14 dan 15. Karena rangkaian pushbutton menggunakan konfgurasi active low12. sebaliknya  Jika tombol yang ada di PIND. perhatikan baris 16 dan 17.2 ditekan maka led dinyalakan semua (baris 26). caranya bagaimana? Anda bisa langsung memberikan instruksi DDRD = 0b00001100 atau DDRB = 0x0C. o Dilanjutkan dengan mematikan semuan led. DDRD &= ~(1<<2) untuk PORTD..

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. Timer0 dan Timer2 memiliki kapasitas 8-bit sedangkan Timer1 memiliki kapasitas 16-bit. terlihat adanya beberapa register yang terkait. Mikrokontroler ATMega16 memiliki 3 buah timer yaitu Timer0. Timer1 dan Timer2. OCR1B. 16-bit. ICR1. Gambar 19.32 .6. Timer 16-bit sama seperti timer 8-bit. dan untuk dapat menjalankan atau menggunakan Timer1 ini. TCCR1A. OC1A. OCR1A. OC1B dan ICF1. 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. Diagram blok TIMERn (n diganti dengan 1) Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . hanya saja nilai maksimalnya mencapai 0xFFFF. Pada Gambar 19 ditunjukkan diagram blok dari Timer1 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). Pada ebook ini akan dibahas mengenai Timer1. Sumber clock atau pemicau dapat dibangkitkan dari sinyal eksternal maupun internal. antara lain (dari atas): TCNT1. maka kita harus mempelajari terlebih dulu register-register yang berkaitan dengan Timer1 karena di register itulah tempat pengaturan Timer/Counter1 agar bisa bekerja. TCCR1B dan juga beberapa bit-bit terkait seperti: TOV1.

Gambar 20. Apa nilai praskalar itu? Timer1 (juga timer/counter lainnya) membutuhkan sumber detak atau clock source. 1 dan 2 juga nol semua. Biasanya sumber detak yang biasa kita pakai berasal dari XTAL.33 . maka register TCCR1B ini jangan sampai diisi dengan 0x00 (dikosongkan). Konfigurasi sumber clock atau detak pada TCCR1B Tiga bit (CS12.Register Timer1 yang akan kita libatkan di awal ini adalah:     TCCR1B TCNT1 TIMSK TIFR Register TCCR1B. Besarnya maksimum sama dengan XTAL yang digunakan dan minimum XTAL/1024. perhatikan Gambar 19. ditunjukkan pada Gambar 20. itu artinya CS12=0. semua bisa diatur sesuai atau mengikuti aturan pada Tabel 4. Apa yang terjadi jika semua bit di TCCR1B nol semua? Artinya bit 0. merupakan tempat pengaturan clock yang intinya agar Timer/Counter1 bisa bekerja. Register TCCR1B Kok tidak boleh berisi 0x00 atau semua bit pada TCCR1B nol semua? Coba perhatikan Tabel 4.. Nah nilai pembagi atau 1024 inilah yang disebur nilai praskalar atau prescaler. Sumber clock bisa berasal dari internal mulai dari prescaler 1 hingga 1024 atau bisa juga dari sumber eksternal. CS11 dan CS10) ini dulu yang kita perhatikan. CS11=0 dan CS10=0 dan itu menurut Tabel 4 “No clock source (Timer/Counter stopped)”  Timer berhenti bekerja! Atau tidak bekerja!! Tabel 4.. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .

yang ditunjukkan pada Gambar 21. sehingga mengakibatkan bit TOV1 pada register TIFR akan di-set (diberi logika 1). maka interupsi Timer/Counter1 aktif dengan catatan bit interupsi global diaktifkan (bit-7 di register Status SREG. Timer/Counter-2: OCIE2 dan TOIE2 – masing-masing bit 7 dan 6. perhatikan Gambar 22). Dengan memberikan logika 1 pada bit TOIE1 (bit-2 pada TIMSK). T – Bit copy storage H – Half Carry Flag S – Sign bit V – Two‟s Complement Overflow Flag N – Negative flag Z – Zero flag C – Carry flag Hanya saya tuliskan yang terkait saja. Jika sumbernya dari dalam (internal) pencacahan dilakukan pada saat tepi naik. Kondisi overflow juga bisa digunakan untuk menjalankan interrupsi. bisa tepi naik atau tepi turun. Gambar 21. OCIE1A.34 . 3 dan 2. 4. Timer/Counter-1: TICIE1. Register ini akan mencacah naik dari 0x0000 sampai nilai max 0xFFFF kemudian di-reset kembali lagi ke 0x0000. Register TIMSK Gambar 22. OCIE1B dan TOIE1 – masing-masing bit 5. merupakan register tempat pengaturan interupsi overflow dari Timer/Counter1 yang ingin diaktifkan atau tidak. Register TIMSK. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Perhatikan juga bit-bit lain yang berkaitan dengan masing-masing Timer:    Timer/Counter-0: OCIE0 dan TOIE0 – masing-masing bit 1 dan 0. selengkapnya silahkan merujuk datasheet ATMega16.Okey! Register TCNT1 merupakan register pencacah. artinya nilai di dalamnya akan dinaikkan setiap kali ada pemicu. Register SREG Penjelasan register SREG13:         13 I – Global Interrupt Enable: digunakan untuk mengaktifkan interupsi menyeluruh (global). Overflow (melimpah) terjadi saat kondisi dari 0xFFFF ke 0x0000.

techideas.0592MHz atau 11.. maka Gunakan TCNT1 = (1+0xFFFF) . jadi. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .(waktu *( XTAL / praskalar) )    Waktu  waktu yang diinginkan XTAL  frekuensi kristal yang dipakai praskalar  nilai prescaler (lihat penjelasan berikut ini) 6. Anda bisa menggunakan programnya AVR Timer yang bisa diunduh melalui website http://www. Pada Timer/Counter1. Bedakan dengan Percobaan-1 dan 2 yang hanya menggunakan fungsi delay yang sama sekali tidak menggunakan fasilitas Timer/Counter.. 2. menyesuaikan dengan kebutuhan yang telah kita tetapkan tadi: a.techideas.200Hz.co. Register TIFR Persamaan untuk mencari waktu jeda yang ingin digunakan adalah berdasarkan nilai awal yang harus dimasukkan ke dalam TCNT1. Waktu yang diinginkan 1 detik. Gambar 23.(waktu *( XTAL / prescaler) )..nz.Sedangkan register TIFR (Timer/Counter Interrupt Flag Register).1. sekarang kita cari dulu nilai TCNT1-nya. b. Okey.    Nilai XTAL-nya 11. Pilih nilai prescale sebesar 1024.35 .exe untuk perhitungan atau kalkulasi Timer1. kondisi overflow ditandai dengan logika 1 pada bit TOV1 (bit-2) pada register TIFR. Langkah-langkah penggunakan program ini kita jelaskan berikut: 1. digunakan sebagai indikator atau penanda apakah sudah terjadi overflow atau belum. Percobaan-4: Menggunakan Timer1 Menyalakan dan mematikan LED pada PORTB dengan jeda 1 detik menggunakan Timer1. Frekuensi kristal: 11.(1detik*10800) 65536-10800 54736 (desimal) D5D0 (heksadesimal) Alternatif lain.059. Lakukan pengisian beberapa nilai sebagaimana ditunjukkan pada Gambar 23.co.0592MHz atau ditulis 11. langkah selanjutnya adalah menjalankan AVRTimer1Clac. Nilai praskalarnya 1024.nz.200 Hz. gunakan persamaan berikut: TCNT1 = (1+0xFFFF) .059.. sebagaimana ditunjukkan pada Gambar 23. Setelah mengunduh program AVR Timer dari http://www. TCNT1 = = = = = (1+65535)-(1detik * (11059200/1024)) 65536 .

Perhatikan hasilnya (Gambar 24)..36 .. Contoh penggunaan ATMega Timer Calculator – TIMER1 Listing programnya. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .c. Gambar 24. Isikan Timer1 Interrupts per second (berapa kali interupsi/detik) sebesar 1 kali. d.

Untuk 10 milidetik diisi 100 kali interupsi per detik. Contoh penggunaan ATMega Timer Calculator – TIMER2 // program TIMER02.h" #define led PORTB Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Gampang tho!? 6.C // ON dan OFF LED pada PORTB menggunakan Timer2 // By Agfianto Eko Putra. Cukup saya jelaskan saja subrutin delay1detik().37 . artinya nilai kristal 11. yang lainnya sama seperti penjelasan percobaanpercobaan sebelumnya: o Baris-15 merupakan pengisian register TCCR1B agar digunakan nilai prescale sebesar 1024. 2010 #define F_CPU 11059200UL #include "avr/io. sekaligus mengaktifkan Timer1. o Jika sudah terjadi overflow atau melimpah. Percobaan-5: Menggunakan Timer2 Okey sekarang saya tunjukkan contoh lainnya menggunakan Timer2 dan penggunaan AVRTimer2Calc ditunjukkan pada Gambar 25. o Baris-17 menunggu hingga terjadi overflow – ini merupakan proses pooling bukan interupsi.0592MHz dibagi dengan 1024. yaitu mengisi dengan nilai awal 54. hanya saja sekarang tundaan atau jeda menggunakan fasiltas Timer1 yang ada di ATMega16.736 (desimal) atau 0xD5D0 (heksadesimal). Gambar 25. maka flag TOV1 di-reset (baris 18) dan Timer1 dimatikan (baris 19). o Baris-16 memberikan nilai awal pada TCNT1 sesuai dengan perhitungan atau kalkulasi yang telah dilakukan sebelumnya.2.Penjelasan:   Program ini pada dasarnya sama seperti percobaan-1.

} void delay1detik() { unsigned char ulang..15.. ulang++) { delay10ms()... Kemudian perhatikan juga Tabel 5 untuk semua kemungkinan nilai CS22.. o Mengapa kok tidak langsung dilakukan tundaan 1 detik? Mengapa harus melakukan pengulangan . CS21 dan CS20.. TIFR=64.. perhatikan pada baris 14.000 milidetik adalah mengulang 100 kali tundaan 10 milidetik.. adalah sebesar .18 atau nilai clock dibagi dengan nilai prescale tersebut. led=0.16 kali subrutin delay10ms()? Perhatikan baris 24 – 27. //prescaler 1024 TCNT2=0x94.) { led=255. for(... Timer2 merupakan timer ..... mengikuti Tabel 5.. 1 dan 2 pada Gambar 23. } //gunakan AVR Delay calculator untuk menghitung //tundaan 10 milidetik dengan frek kristal 11. artinya dengan kemampuan seperti itu tidak bisa dilakukan langsung tundaan 1 detik..0592MHz void delay10ms() { TCCR2=0B00000111.... 14 15 Jawaban: 2 (dua) Jawaban: delay1detik() 16 Jawaban: 100 (seratus) 17 Jawaban: 8 (delapan) Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha ... } } Penjelasan (waktu ngisi titik-titik jangan lihat kuncinya dulu ya):   Percobaan-5 ini sebenarnya juga mirip/sama dengan percobaan-4 (sebelumnya).. delay1detik(). o Ingat.. ulang<100..... Anda perhatikan pada 12 hingga 28: o Terdapat . o Perhatikan register TCCR2 bit 0..17 bit. for(ulang=0.. //isi ulang 0x94 agar 1 detik while(!(TIFR&(1<<TOV2))). } } int main() { init_devices()...14 subrutin yaitu delay10ms() dan ... hanya saja digunakan fasilitas Timer2 untuk melakukan penundaan 1 detik.38 . //TOV2 di-nolkan dengan menuliskan "1" pada bit ybs TCCR2=0B00000000..void init_devices() { DDRB=255.. o Nilai prescale yang digunakan.. delay1detik(). cara paling gampang untuk mendapatkan tundaan 1 detik atau 1.

.39 ..21 pada Timer2...... parameter-nya sama seperti Timer2.. Percobaan-6: Menggunakan Timer0 Bagaimana kalau menggunakan Timer0? Pengaturan pewaktuan menggunakan AVRTimer0Calc ditunjukkan pada Gambar 27..... maka nilai register TCNT2 (pada baris 15) diberi nilai sebesar . kemudian bit overflow tersebut direset (baris-17)..... Gambar 26....o Agar terjadi penundaan sekitar 10 milidetik........ Konfigurasi sumber clock atau detak pada TCCR2 6.. Untuk penundaan 10 milidetik sebanyak 100 kali... Register TCCR2 o o Baris 16 digunakan untuk menunggu terjadinya ...3..22 pada register TCCR2..19 heksadesimal atau .. 18 19 Jawaban: 1024 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 .. Timer2 kemudian dihentikan dengan memberi nilai . Tabel 5...20 desimal...

h" #define led PORTB void init_devices() { DDRB=255.. } void delay1detik() { unsigned char ulang. 2010 #define F_CPU 11059200UL #include "avr/io. //prescaler 1024 TCNT0=0x94. TIFR=1. ulang<100.0592MHz void delay10ms() { TCCR0=0B00000101. Contoh penggunaan ATMega Timer Calculator – TIMER0 Berikut listing programnya. for(ulang=0. //isi ulang 0x94 agar 1 detik while(!(TIFR&(1<<TOV0))). //TOV0 di-nolkan dengan menuliskan "1" pada bit ybs TCCR0=0B00000000. } //gunakan AVR Delay calculator untuk menghitung //tundaan 10 milidetik dengan frek kristal 11.C // ON dan OFF LED pada PORTB menggunakan Timer0 // By Agfianto Eko Putra.Gambar 27. ulang++) { Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha ..40 . // program TIMER03.

4.untuk aktivasi interupsi TIMER0 -void enable_timer0() {TIMSK|=(1<<TOIE0).C // 5 kali pencacahan menaikkan angka pada PORTC // By Agfianto Eko Putra. Percobaan-7: Lima Kali pencacahan – aplikasi Counter // program COUNTER.) { led=255. for(. } int main() { init_devices(). delay1detik(). delay1detik().untuk deaktivasi interupsi TIMER0 -void disable_timer0() {TIMSK&=~(1<<TOIE0)..delay10ms().h" #include "avr/interrupt.} void init_devices() { DDRC=255. DDRD=255. } } int main() { init_devices(). led=0. } // isi ulang 0xFB agar 5 kali saja // setara dengan -5 (negatif 5) // -. } } 6. ++cacah. // sbg volatile agar tetap global // di dalam ISR ISR(TIMER0_OVF_vect) { TCNT0=0xFB. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .41 .h" // saatnya menggunakan interupsi #define led PORTC #define pencacah PORTD volatile unsigned int cacah. 2010 #define F_CPU 11059200UL #include "avr/io.} // -.

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). sei(). atau gampangannya kalo Anda punya anjing atau kucing kemudian lupa memberikan makan. saat jegog atau ngeong. enable_timer0(). mengabaikan layanan rutin ke watchdog (biasanya seperti pemberian pulsa secara rutin). Tabel 6. // Luaran OC0 output: tidak dihubungkan OCR0=0x00. seperti hang.// Inisialisasi Timer/Counter 0 // Sumber detak: pin T0 Rising Edge // Mode: Normal top=FFh TCCR0=0x06. karena ada beberapa keasalahan. apa yang terjadi? Ya jegog atau ngeong khan?? Dalam hal ini.42 . Gambar 28 menunjukkan diagram blok pewaktu watchdog pada mikrokontroler AVR sedangkan Gambar 29 menunjukkan register yang terlibat. // Nilai awal dari Timer/Counter 0 (-5 desimal) TCNT0=0xFB. Intinya. pewaktu watchdog akan mereset sistem.5. pencacah = TCNT0. Tentang Watchdog Pewaktu watchdog merupakan piranti pewaktuan perangkat keras yang bisa memicu reset sistem pada saat program utama. while(1) { led = cacah. } } 6. Dengan melakukan pengontrolan Watchdog Prescaler. interval reset yang dilakukan Watchdog dapat diatur dan mengikuti Tabel 6. Pemilihan Watchdog Prescaler Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . cacah=1.

c" //#define WDTO_2S 7 Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .h" #include "stdlib.43 .h" #include "lcd_pc. Hal ini untuk memastikan bahwa program berjalan dengan baik dan benar (kayak bahasa Indonesia aja ya…). // program WD01. crash) atau diam saja pada suatu kalang.h" #include "avr/wdt.h" #include "avr/pgmspace.. Saat program mengalami masalah (hang. pembahasan tentang LCD ada di bagian lain dari buku ini. sementara diikuti saja listingnya sebagai berikut. Register Watchdog WDTCR Kesimpulan:     Mikrokontroler AVR memiliki pewaktu Watchdog internal. Pewaktu Watchdog Gambar 29.. pewaktu ini harus di-reset (secara manual) sebelum mencapai nilai maksimum-nya.Gambar 28. Selama jalannya program. 6.h" #include "avr/io. Pewaktu watchdog adalah pewaktu yang bisa me-RESET mikrokontroler saat mencapai nilai tertentu.C // tampilan di LCD16x2 dan watchdog #define F_CPU 11059200UL #include "util/delay. Percobaan-8: Aplikasi Watchdog (Bagian-1) Walaupun menggunakan LCD. maka tidak terjadi proses reset pewaktu Watchdog sehingga RESET sistem secara otomatis akan terjadi.6.

//harus direset WDT-nya lcd_goto(line1). _delay_ms(1000). wdt_reset().2 dan PORTD.. lcd_puts("telah direset.7. // timeout WDT-nya 2 detik // tersedia 15MS.h" #include "stdlib. while(1) { _delay_ms(1000).. _delay_ms(100).#define #define #define #define led PORTB tombol PIND satu 2 dua 3 //================================================== void init_devices() { DDRB=255. lcd_puts("watchdog mega16"). //PORTD.h" #include "avr/wdt. lcd_goto(line2). led=0. lcd_goto(line1).3 aktif DDRC=255. Percobaan-9: Aplikasi Watchdog (Bagian-2) // program WD02. } } //=========================================== 6.h" #include "avr/pgmspace. lcd_clrscr(). init_lcd().. //PULL UP internal pada PORTD|=(1<<3).2 sebagai masukan DDRD&=~(1<<3). dst } //==========================================program utama int main() { init_devices(). //PORTD. wdt_enable(WDTO_2S). 30MS.")."). lcd_puts("mulai awal.h" Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .C // tampilan di LCD16x2 dan watchdog serta pushbutton #define F_CPU 11059200UL #include "util/delay. 60MS.h" #include "avr/io. _delay_ms(1000).3 sebagai masukan PORTD|=(1<<2). //PORTD. //PORTB sebagai luaran DDRD&=~(1<<2).44 .

lcd_puts("mulai awal. //PORTD. _delay_ms(100). while(1) { _delay_ms(1000)."). //harus direset WDT-nya lcd_goto(line1).. //timeout WDT-nya 2 detik //tersedia 15MS.3 aktif DDRC=255. //PORTD.. 60MS.2 dan PORTD. //PULL UP internal pada PORTD|=(1<<3). lcd_puts("watchdog mega16"). 30MS. //menunggu tombol ditekan //jika tidak ditekan //WDT akan mereset uC } } //=========================================== Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .c" //#define WDTO_2S 7 #define led PORTB #define tombol PIND #define satu 2 #define dua 3 //================================================== void init_devices() { DDRB=255.45 ."). lcd_goto(line1). led=0. wdt_reset().satu)). //PORTD.#include "lcd_pc. lcd_puts("telah direset. lcd_goto(line2). while (!bit_is_clear(tombol.. //PORTB sebagai luaran DDRD&=~(1<<2).2 sebagai masukan DDRD&=~(1<<3). lcd_clrscr(). wdt_enable(WDTO_2S).3 sebagai masukan PORTD|=(1<<2). init_lcd(). dst } //==========================================program utama int main() { init_devices().

Interupsi dan Aplikasinya 7. mengerjakan rutin interupsi. artinya proses atau kontrol utama pada sistem tersebut hanya melakukan pengadukan isi tangki dengan kecepatan yang bergantung pada data-data suhu.. Saat proses dilakukan secara normal. kemudian kembali lagi mengerjakan program secara normal. 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. Setiap detik dilakukan pembacaan data suhu.46 .7..! Mikrokontroler AVR memiliki 21 macam sumber interupsi yang terdiri dari 3 interupsi eksternal dan 18 interupsi internal. Skenario tersebut membutuhkan mekanisme interupsi. Daftar Sumber Interupsi Mikrokontroler AVR Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .1. Inilah konsep interupsi. kemudian terjadi interupsi. Tabel 7. kemudian ditampilkan pada layar LCD. dan dijadikan acuan untuk menetapkan kecepatan pengadukan. sebagaimana ditunjukkan pada Tabel 7. program normal ditinggalkan terlebih dulu. misalnya.

enable_timer1(). // toggle penyalaan LED (ON/OFF) TCNT1=0xd5d0.} void stop_timer1() {TCCR1B=0B00000000. while(1)..47 .h" #include "avr/interrupt. } //prescaler 1024 //isi ulang 0xD5D0 agar 1 detik //aktivasi interupsi Timer1 //aktivasi interupsi global //jalankan Timer1 Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . led=1.2. listing selengkapnya sebagai berikut.} void start_timer1() {TCCR1B=0B00000101.. start_timer1().h" #define led PORTB ISR(TIMER1_OVF_vect) { led=!led. } //LED OUTPUT //============================================== void enable_timer1() {TIMSK|=(1<<TOIE1).} //=============================================== int main() { init_devices().C // ON dan OFF LED pada PORTB // selama 1 detik menggunakan interupsi TIMER0 #define F_CPU 11059200 #include "avr/io.7. TCCR1B=0B00000101. } void init_devices() { DDRB=255. //isi ulang 0xD5D0 agar 1 detik TIFR=4. TCNT1=0xd5d0. Percobaan-10: ON/OFF LED menggunakan Interupsi Timer0 Percobaan ini merupakan penggunaan TIMER0 melalui interupsi. // program INTERUPSI_TIMER01.} void disable_timer1() {TIMSK&=~(1<<TOIE1). sei().

} void enableint1() {GICR|=(1<<INT1).C // ON dan OFF LED pada PORTB // melalui interupsi INT0 dan INT1 pada PORTD. sei(). } int main() { init_devices().} void disableint1() {GICR&=~(1<<INT1).h" #include "avr/interrupt. PORTD|=(1<<3). DDRD&=~(1<<3). DDRD&=~(1<<2). Percobaan-11: ON/OFF LED melalui Interupsi Eksternal // program INTERUPSI01.3 #define F_CPU 11059200 #include "avr/io. while(1).} void disableint0() {GICR&=~(1<<INT0).48 . enableint0().h" #define #define #define #define led PORTB tombol PIND satu 2 dua 3 //interupsi eskternal 0 dan 1 //=============================================================== ISR(INT0_vect) { led=0. enableint1().7. } //================================================================= void enableint0() {GICR|=(1<<INT0). PORTD|=(1<<2). } //PORTB sebagai luaran //PORTD.2 dan PORTD.} void init_devices() { DDRB=255.3.h" #include "util/delay.3 sebagai masukann INT1 //PULL UP internal //semuanya diaktifkan //aktifkan semua interupsi Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .2 sebagai masukan INT0 //PORTD. } ISR(INT1_vect) { led=255.

Jalur komunikasi serial pada mikrokontroler AVR ATMega16/32/8515 terdapat pada pin PORTD. 7.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. 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. dan lain-lain. 8. or 9 Data Bits and 1 or 2 Stop Bits Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Gambar 30.49 .0 (RXD) dan PORTD.1 (TXD). misalnya program pemantauan suhu ruangan sekaligus pengontrolan AC atau kipas menggunakan antarmuka program PC Visual Basic atau Delphi. perhatikan pin-pin yang terkait pada Gambar 4 dan 5. Diagram bloknya ditunjukkan pada Gambar 30.

yaitu: • • • • Normal asynchronous. yaitu terdapat 4 (empat) mode penghasil detak. Pada Gambar 31 ditunjukkan diagram blok logik penghasil detak yang terkait dengan beberapa register seperti UBRR (16-bit: UBRRL dan UBRRH) dan lain-lain. TX Data Register Empty.1. 8. Penghasil Detak . dan Slave synchronous. 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).Clock Generator Penghasil detak atau Clock Generator tergantung pada mode data transfer. Diagram blok logik penghasil detak untuk komunikasi serial Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .50 . Gambar 31. Mengirim data (Data Transmit) dan Menerima data (Data Receive). Master synchronous. Double Speed asynchronous.• • • • • • • 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.

16%.0016 dan karena itu error-nya adalah 0.083333333. Anda bisa menggunakan AVR Assistant yang dibuat oleh Mike Henning (bisa Anda unduh program tersebut di http://www.wormfood. 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.net/avrbaudcalc. jika menggunakan mode Double Speed Asynchronous. maka sebuah clock dibangkitkan. Anda bisa juga memanfaatkan website http://www.com/web/AtmelAVR). maka persamaan yang digunakan adalah BAUD = fclk/(8(UBRR+1)) Informasi detil tentang clock generator ini bisa dilihat di datasheet AVR ATMega16. Misalkan digunakan frekuensi osilator untuk mikrokontroler sebesar 8 MHz (atau 8. Contoh penggunaan AVR Assistant v1. Setiap kali nilai down-counter mendekati nol. Tampilan awal ditunjukkan pada Gambar 32.php untuk menghitung secara online.000.esnips. Dengan nilai UBRR =51. program ini juga bisa digunakan sebagai alternatif dari AVR Timer Calculator yang telah dijelaskan sebelumnya. Gambar 32. Register penentuan baudrate atau kecepatan komunikasi serial atau UBRR digunakan dimana nilai yang diberikan adalah untuk down-counter.51 .Kebanyakan yang digunakan adalah Asynchronous Internal Clock Generator.000 Hz) dan baudrate yang diinginkan adalah 9600.3 Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . kita bulatkan menjadi 51. Dengan error tersebut USART masih dapat bekerja tetapi tidak sempurna. maka nilai seseungguhnya dari baudrate adalah 9615 (bukan 9600). jika dibagi dengan 9600 diperoleh 1. setelah dihitung menggunakan persamaan diatas diperoleh nilai UBRR sebesar 51.

sedangkan bagian kanan digunakan untuk mengatur Timer0.372MHz ditunjukkan pada Gambar 33 kanan. Contoh penggunaan AVR Assistant v1. Gambar 34.3 untuk dua frekuensi MPU berbeda • Untuk contoh pengaturan Timer1 agar menunda interupsi terjadi 100 kali per detik (seperti kasus timer yang dijelaskan sebelumnya).059MHz. dengan kristal 8MHz. ditunjukkan pada Gambar 34.Penjelasan Gambar 30: • • Bagian kiri digunakan untuk mengatur baudrate. Contoh penggunaan untuk TIMER1 Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .52 . sedangkan untuk kristal 7. dengan frekuensi kristal 11. Perhatikan perbedaan error %-nya. Gambar 33. Contoh untuk baudrate 9600. 1 dan 2 (jadi satu antarmukanya). hasil perhitungannya ditunjukkan pada Gambar 33 kiri.

Pemanggilannya menggunakan instruksi initserial(MYUBRR).53 .wormfood. biasanya digunakan kristal dengan frekuensi 7.php Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .372MHz atau 11. Nilai-nilai UBRR dengan 8MHz. 23 Hasil perhitungan dari http://www. Tabel 8. 7.Untuk mengatasi ketidak-akuratan baudrate tersebut.372MHz dan 11.0592MHz.net/avrbaudcalc.0592MHz 23 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. Perhatikan informasi selengkapnya untuk nilai UBRR di Tabel 8.

perhatikan register UCSRB yang ditunjukkan pada Gambar 35. Untuk mengatur berapa stop bit.0) hanya boleh digunakan untuk mengirimkan detak atau clock transmisi. UCSZ1 dan UCSZ0 (di register UCSRC) mengikuti Tabel 9. maka pin XCK (PORTB. digunakan USBS pada register UCSRC.8. Gambar 36. 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. mode kerja dan format data sebelum mengirimkan data-data melalui port serial.0 Jika Anda menggunakna mode sinkron. Lakukan terlebih dahulu inisialisasi baudrate. Berikut adalah subrutin yang digunakan untuk mengaktifkan UASRT Transmitter pada winAVR GCC. Gambar 36. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .1 hanya bisa digunakan untuk pengiriman data pada komunikasi serial. Jumlah data bit yang ditentukan UCSZ2. Gambar 35. sedangkan mengatur lebar bit data digunakan UCSZ2 (di register UCSRB). Register UCSRB Saat bit TXEN diberi logika 1.2. Register UCSRC Tabel 9. dengan demikian pin TxD pada PORTD.54 . artinya USART Transmitter diaktifkan..

uart_putc().55 .Penjelasan:    Perhatikan baris 12 (selain TXEN=1. sekaligus untuk mengakifkan UASRT Receiver di RXEN=1). Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . perhatikan baris 18. Format datanya 8-bit data (lihat Tabel 4) dengan instruksi (3<<UCSZ0). Berikut adalah subrutin (b dan uart_putc()) yang digunakan untuk mengirimkan sebuah data (karakter) Penjelasan:   Pada subrutin pertama. perhatikan baris 19. perhatikan Gambar 37. data dikirimkan dengan cara menuliskan sebuah kode karakter ke register UDR. maksudnya jika UDRE=1 berarti UDR-nya kosong dan siap mengirim data berikutnya. Namun sebelum menuliskan atau mengisi register UDR. 1-bit stop dengan instruksi (1<<USBS). maka URSEL harus diberi logika 1 untuk mengakses UCSRC dengan instruksi (1<<URSEL). ditunggu dulu nilai bit UDRE (bit5) pada register UCSRA (Gambar 38) agar bernilai 1 (satu). Karena UCSRC menggunakan lokasi yang sama dengan UBBRH.

artinya USART Reciever diaktifkan.56 . USART Receiver dapat kita aktifkan dengan memberikan logika 1 pada bit RXEN yang terdapat dalam register UCSRB. Menerima Data – USART Receive Untuk menerima data. yaitu uart_puts() digunakan untuk mengirimkan serangkaian data (tidak hanya satu karakter saja).0 hanya bisa digunakan untuk penerimaan data pada komunikasi serial. perhatikan terjadinya pengulangan subtrutin uart_putc() pada baris 27 dan 28. dengan demikian pin RxD pada PORTD. Register UDR Read dan Write Gambar 38. yaitu dengan memeriksa apakah bit RXC (bit ke 7) pada register UCSRA bernilai 1? Perhatikan Gambar 36 dan baris 50. ada di dalam program utama (main()): Untuk menerima data caranya mudah. Saat bit RXEN diberi logika 1. Register UCSRA  Subrutin kedua.3. Jika RXC bernilai 1 artinya UDR Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . perhatikan kembali Gambar 33. Berikut adalah cara yang digunakan untuk menerima data (karakter).Gambar 37. 8.

jika diketik “a”.4. misalnya. dilanjutkan dengan menyalin isi UDR ke suatu variabel (pada contoh digunakan tempserial). sebagaimana ditunjukkan pada baris 52. 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). maka karakter “a” ini dikirim kembali ke serial.57 . sehingga setelah terdeteksi RXC=1. perhatikan baris 52 dan 53 pada listing program berikut: Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .berisi data yang diterima secara serial. 8.

Ragkaian untuk komunikasi serial dan contoh running hasil aplikasi Konektor komunikasi serial pada AVR Trainer Board v2.Gambar 39.58 .0 ditunjukkan pada Gambar 40. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .

Koneksi serial RS232 pada AVR Trainer Board v2.59 .Gambar 40.0 Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .

karena sudah diurus langsung oleh pustakan AVR GCC.  Pin RS dan E masing-masing disambungkan ke pin pada mikrokontroler AVR untuk melakukan pengontrolan Register Select dan Enable. artinya data dikirim sebagai proses WRITE (menulis) ke LCD. yang contohnya ditunjukkan pada Gambar 42. Penjelasan Gambar 41:  D4 s/d D7: jalur data 4-bit (LCD bisa mendukung antarmuka 4 bit atau 8 bit. untuk efisiensi pin. Tampilan sebuah LCD 16x2 karakter Pada Gambar 41 ditunjukkan rangkaian baku antarmuka LCD. LCD dan ADC 9. Rangkaian antarmuka LCD 4-bit data Gambar 42.1.  Pin R/W di-GND-kan. merupakan tipe 2x16 karakter dan tentunya masih ada tipe-tipe lainnya.60 . Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Anda tidak perlu kawatir bagaimana caranya mengontrol LCD.9. pada modul ini hanya dibahas antarmuka 4-bit). Rangkaian antarmuka LCD dan ADC Gambar 41.

Penampil LCD dan Masukan ADC pada AVR Basic Trainer v2.61 .0. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .Gambar 43.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. Rangkaian dasar LCD dan ADC serta komponen-komponen lainnya Gambar 44.

} 9. init_lcd(). 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.h" #include "lcd_pc. } //================program utama===================== int main() { init_devices(). lcd_puts(" saya manusia"). // PORTC sebagai luaran ke LCD } //===============program utama====================== int main() { init_devices().9.h" #include "avr/io. 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.C // tampilan di LCD16x2 // By Agfianto Eko Putra. lcd_puts(" keren").62 .2.h" #include "avr/pgmspace.c" //================================================== void init_devices() { DDRC=255.3. // program LCD_02.C // tampilan di LCD16x2 // By Agfianto Eko Putra. lcd_goto(line2). Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . 2010 #define F_CPU 11059200UL #include "util/delay.c" //================================================== void init_devices() { DDRC=255.h" #include "avr/pgmspace.h" #include "avr/io.h" #include "lcd_pc. // program LCD_01. while(1). lcd_goto(line1). 2010 #define F_CPU 11059200UL #include "util/delay.

} for (int i=1. // tampilan geser kanan. lcd_goto(line1).4.c" //================================================== void init_devices() { DDRC=255. lcd_clrscr(). init_lcd(). lcd_puts(" keren").h" "lcd_pc. lcd_puts("0123456789ABCDEF"). LCD_RS_LO. _delay_ms(250). _delay_ms(250). while(1) { for (int i=1. while(1) { lcd_goto(line1).h" "avr/io. } //==========================================program utama int main() { init_devices(). i<=16. ke kiri _delay_ms(200).init_lcd(). lcd_puts(" saya manusia"). ke kanan _delay_ms(200). 2010 #define F_CPU 11059200UL #include #include #include #include "util/delay. lcd_puts("FEDCBA9876543210"). i++) { lcd_write(0x18). // tampilan geser kanan. i<=16. } _delay_ms(250). _delay_ms(250).63 . } } //=========================================== Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . lcd_goto(line2). lcd_goto(line2).h" "avr/pgmspace. Percobaan-15: Aplikasi LCD Bagian-3 // program LCD_03. } } 9.C // tampilan di LCD16x2 // By Agfianto Eko Putra. i++) { lcd_write(0x1C).

//PORTD. } //==========================================program utama int main() { init_devices(). lcd_goto(line2).h" #include "avr/pgmspace. init_lcd().2 sebagai masukan DDRD&=~(1<<3).. lcd_goto(line2).. lcd_puts("Anda menekan").c" #define #define #define #define led PORTB tombol PIND satu 2 dua 3 //================================================== void init_devices() { DDRD&=~(1<<2).5. Percobaan-16: Aplikasi LCD Bagian-4 // program LCD_03. lcd_puts("Tombol PD3/INT1"). lcd_goto(line1). lcd_goto(line1). lcd_puts("Anda menekan"). } if(bit_is_clear(tombol. 2010 #define F_CPU 11059200UL #include "util/delay. lcd_goto(line1).h" #include "lcd_pc.3 aktif DDRC=255.2 dan PORTD. lcd_puts("yang ditekan. //PULL UP internal pada PORTD|=(1<<3). //PORTD.!"). lcd_goto(line2). lcd_puts("Belum ada tombol").C // tampilan di LCD16x2 // By Agfianto Eko Putra.dua)) { lcd_clrscr(). //PORTD. } } } //=========================================== Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .9. lcd_puts("Tombol PD2/INT0").satu)) { lcd_clrscr().64 .h" #include "avr/io.3 sebagai masukan PORTD|=(1<<2). while(1) { if(bit_is_clear(tombol.

h" #include "lcd_pc. Percobaan-17: Menggunakan ADC Internal Bagian-1 Menggunakan rangkaian yang ditunjukkan pada Gambar 41 yang merupakan rangkaian antarmuka ADC dan LCD dengan ATMega16.c" #define #define #define #define led PORTB tombol PIND satu 2 dua 3 unsigned int getadc(unsigned char channeladc) { unsigned int adcVal. //INPUT DDRD&=~(1<<3).9. //LED OUTPUT DDRD&=~(1<<2). } //========================================================= void init_devices() { DDRB=255.h" #include "avr/io.tempadc2. lcd_puts("Demo ADC-0 dan 1"). ADCSRA|=(1<<ADSC). //INPUT PORTD|=(1<<2).6. //avcc ADCSRA|=(1<<ADEN). init_lcd(). loop_until_bit_is_clear(ADCSRA.) Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . lcd_goto(line2). Pada rangkaian tersebut. DDRC=255.. adcVal = ADCW.ADSC). ADCSRA&=~(1<<ADEN). } //==========================================program utama int main() { unsigned int tempadc1. lcd_puts(" AT Mega16!").C // pembacaan ADC internal M16 #define F_CPU 11059200UL #include "util/delay. //PULL UP INTERNAL AKTIF PORTD|=(1<<3). led=0. init_devices(). ADMUX=channeladc|0x40.h" #include "stdlib.h" #include "avr/pgmspace. kanal atau channel ADC yang digunakan pada latihan ini adalah kanal-0 dan 1 atau ADC0 dan ADC1. // program ADC01. lcd_clrscr(). _delay_ms(1000). return adcVal. for(. lcd_goto(line1).65 . Masukan ADC tersebut dihubungkan ke sebuah potensiometer (atau bisa juga diganti dengan LM35 atau sensor apa saja yang menghasilkan tegangan 0 – Vref).

adcVal = ADCW.c" #define #define #define #define led PORTB tombol PIND satu 2 dua 3 unsigned int getadc(unsigned char channeladc) { unsigned int adcVal. //avcc ADCSRA|=(1<<ADEN).tempadc2. lcd_puts("LDR: "). //INPUT DDRD&=~(1<<3). ADMUX=channeladc|0x40. //LED OUTPUT DDRD&=~(1<<2). lcd_goto(line2). DDRC=255.7.h" #include "lcd_pc. } } //=========================================== 9. ADCSRA|=(1<<ADSC). } //==========================================program utama int main() { unsigned int tempadc1.C // pembacaan ADC internal M16 #define F_CPU 11059200UL #include "util/delay. lcdword(tempadc1). loop_until_bit_is_clear(ADCSRA.ADSC). //INPUT PORTD|=(1<<2). lcdword(tempadc2). lcd_goto(line1). return adcVal. _delay_ms(500).66 . } //========================================================= void init_devices() { DDRB=255.h" #include "stdlib. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . lcd_puts("POT: ").h" #include "avr/pgmspace. tempadc2=getadc(1). ADCSRA&=~(1<<ADEN). Percobaan-18: Menggunakan ADC Internal Bagian-2 // program ADC02. //PULL UP INTERNAL AKTIF PORTD|=(1<<3).{ tempadc1=getadc(0).h" #include "avr/io.

......................................................... ...................................................................................................................... lcd_goto(line1).................................................................................................................................... _delay_ms(1000)............................................................................... init_devices()................................................................................................................ lcd_puts("Demo ADC-0 dan 1")............................................................................................................................................... lcd_goto(line1)................................................................ ............................................................................ ......................................................................................................................................... lcd_clrscr()............................................................. ....................................................... ....................... lcdword(ldr)..........................................................................................................................................................ldr...................................................................................................................................... .....................................................................................................67 ................................ led=0............... ........................... init_lcd()........................................................................................................ lcd_puts(" AT Mega16!")................................................. .......... .....unsigned int pot.......................... ........... ..................... pot=(tempadc1/1024)*5...................................................................................................................) { tempadc1=getadc(0).................................................................................................................................................................................................................................................................................. _delay_ms(500)......................... ............................................................................................................................................................................................................................................................. } } //=========================================== Catatan Anda: ......................................................................................... lcd_goto(line2)........................................................ Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .. lcdword(pot).............. ................................................................................................................................................................................. tempadc2=getadc(1).............................................. .................. ..................................................................... lcd_goto(line2)......................................................................................................................................................................................................................... .................................................... ldr=(tempadc2/1024)*5........................................................................................................................................... for(. lcd_puts("POT: ")........................ ...................... .................................. ..................................... lcd_puts("LDR: ")...... ............

 SCL (Serial Clock Input): SCL digunakan untuk sinkronisasi perpindahan data pada antarmuka serial. Pin SQW/OUT membutuhkan resistor pull-up eksternal. maka secara otomatis DS1307 akan mengambil catu daya dari baterai (jika dipasang). namun proses pencacahan waktu tetap berjalan dan tidak terpengaruh oleh penurunan Vcc. Proses penulisan dan pembacaan data tidak dapat dilakukan. jam.pin SOIC. 4kHz. Jam bekerja dalam format 24 jam atau 12 jam dengan indikator AM/PM.  X1. jika catu daya ke sistem mati. memiliki kalender/jam BCD dan SRAM yang nonvolatile dengan kapasitas 56 bytes. Vcc bernilai 5 volt. 32kHz). Alamat dan data dikirim melalui 2 kabel dwi. IC dapat diakses secara penuh baik untuk menulis maupun membaca data. DS1307 dapat mendeteksi secara otomatis catu dayanya. hari. bulan dan tahun. karena IC akan mengambil sumber tegangan dari VBAT. Jam dan kalender pada DS1307 menyediakan informasi detik.  SDA (Serial Data Input/Output): SDA berfungsi sebagai pin masukan dan keluaran pada antarmuka serial 2-kabel. Banyak hari dalam satu bulan diatur secara otomatis oleh IC ini baik untuk 31 hari maupun kurang. Setelah menerima satu Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . data-data jam dan yang lain dikirim dalam format BCD. Pin SDA dan SCL membutuhkan resistor pull-up sekitar 4K7 ohm. tanggal. SQWE akan mengeluarkan gelombang kotak dengan pilihan frekuensi (1Hz. Konfigurasi ditunjukkan pada Gambar 45. Jika diberikan tegangan 5 volt. 10.2 Komunikasi I2C pada RTC DS1307 Pada komunikasi I2C antara DS1307 dan mikrokontroler. Komunikasi I2C untuk RTC dan EEPROM 10. Tegangan baterai harus berkisar antara 2 volt sampai 3.arah.5 volt.68 . Baterai lithium 48 mA atau lebih besar dapat digunakan lebih dari 10 tahun pada suhu 25°C.  SQW/OUT (Square Wave/Output Driver): jika diaktifkan. Gambar 45.25VBAT.10. Ketika baterai disambungkan pada IC dan nilai Vcc dibawah 1. menit. SQW/OUT dapat bekerja baik dengan sumber tegangan Vcc maupun tegangan baterai. Data dikirim per-byte dari mikrokontroler ke DS1307 secara serial. GND: Tegangan DC disediakan pada pin ini. X2 – dihubungkan dengan kristal 32. Pendahuluan RTC DS1307 Emping (chip/IC) RTC (Real Time Clock) DS1307 bekerja dengan daya rendah (low power). DS 1307 memiliki 8 buah pin dan tersedia dalam bentuk 8-pin DIP serta 8. Diagram pin RTC DS1307 Penjelasan Gambar 45:  VCC. SQWE bit harus diset ke 1.768kHz. 8kHz.  VBAT: digunakan sebagai masukan baterai lithium 3 volt atau sumber energi yang lain.1.

Kemudian mikrokontroler akan mengirimkan alamat grup dari DS1307 yaitu 1101 dan kode untuk menulis ke DS1307 yaitu 0 pada LSB-nya. Sinyal acknowledge adalah tanda bahwa satu byte data telah diterima oleh DS1307. Format pembacaan data dari DS1307 Setelah itu. DS1307 sebagai slave akan mengirimkan sinyal acknowledge ke mikrokontroler.69 . proses pembacaan I2C dimulai.byte data. Gambar 46. Gambar 48. mikrokontroler akan membangkitkan sinyal start I2C. Format pengiriman data waktu ke DS1307 ditunjukkan pada Gambar 46. Proses pembacaan dilakukan per-byte dimulai dari register detik sampai register tahun. Di awal komunikasi. alamat masing-masing register tersebut ditunjukkan pada Gambar 49. Gambar 47. Mikrokontroler mengirimkan alamat DS1307 beserta kode instruksi baca. Pada akhir pembacaan register tahun. Setelah menerima data 1-byte utuh mikrokontroler akan mengirimkan sinyal acknowledge ke DS1307. Format pengiriman data jam ke DS1307 Untuk format pengiriman data tanggal ditunjukkan pada Gambar 47. Format pengiriman data tanggal ke DS1307 Gambar 48 menunjukkan format pembacaan data dari DS1307. Untuk pengaturan hari tidak dilakukan. Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . Data tanggal ditulis mulai alamat 04H. Kode tulis ini diberikan ke DS1307 karena mikrokontroler akan menuliskan terlebih dahulu alamat awal pembacaan register DS1307 yaitu 00H. karena DS1307 otomatis akan menyesuaikan hari berdasarkan tanggal yang telah diatur. akan dikirim sinyal notacknowledge dan diakhiri dengan sinyal stop.

3. dipastikan tidak akan terbaca data-datanya.h" #include "avr/pgmspace.70 . Rangkaian baku antarmuka DS1307 10.1 untuk SDA-nya dan ke PINC. Rangkaian Baku RTC DS1307 Rangkaian baku antara mikrokontroler (misalnya ATMega) dengan RTC DS1307 ditunjukkan pada Gambar 50. Jangan lupa juga memasang tahanan atau resistor pullup sekitar 4K7 pada kedua pin SDA dan SCL.4. Gambar 50.h" #include "stdlib.C // penulisan dan pembacaan RTC DS1307 // dengan komunikasi I2C #define F_CPU 11059200UL #include "util/delay.h" #include "avr/io. Percobaan-19: Aplikasi RTC (I2C) Bagian-1 // program RTC_01.c" Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . misalnya ke PINC.Gambar 49. Register penyimpan informasi kalender di dalam DS1307 10.h" #include "lcd_pc.0 untuk SCL-nya.c" #include "i2cman. jika lupa atau belum terpasang. terlihat bahwa pin SDA dan SCL masing-masing dihubungkan ke dua buah pin yang berbeda pada mikrokontroler.

second=dec2bcd(second). lcd_putc((hour / 10) + 48). month=i2c_receive_byte(ACK). second=bcd2dec(second). } void dectobcdrtc() { hour=dec2bcd(hour). date=bcd2dec(date). } char bcd2dec(char num) { return ((num/16 * 10) + (num % 16)). year=i2c_receive_byte(NO_ACK).date. _delay_ms(10).hour.minute. month=bcd2dec(month). minute=i2c_receive_byte(ACK). i2c_stop(). //karakter ":" Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .day.#define led PORTB volatile unsigned char second. minute=bcd2dec(minute). second=i2c_receive_byte(ACK). } void gettimertc() { i2c_start(). } void bcdtodecrtc() { hour=bcd2dec(hour).month.year. year=dec2bcd(year).71 . bcdtodecrtc(). date=dec2bcd(date). i2c_transmit_byte(0xd1). year=bcd2dec(year). day=i2c_receive_byte(ACK). i2c_start(). lcd_putc((hour % 10) + 48). } void rtc_lcd() { lcd_goto(line1). lcd_putc(58). lcd_putc((minute / 10) + 48). i2c_transmit_byte(0). hour=i2c_receive_byte(ACK). minute=dec2bcd(minute). char dec2bcd(char num) { return ((num/10 * 16) + (num % 10)). date=i2c_receive_byte(ACK). month=dec2bcd(month). i2c_transmit_byte(0xd0).

lcd_putc((minute % 10) lcd_putc(58).72 . + 48). + 48). + 48). //========================================================= void init_devices() { DDRB=255.c" #define led PORTB Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .h" #include "avr/pgmspace. led=second. lcd_puts(" DS1307"). + 48). lcd_clrscr().c" #include "i2cman. while(1) { gettimertc(). _delay_ms(1000). lcd_putc((month / 10) lcd_putc((month % 10) lcd_putc(47).h" #include "stdlib. } } //=========================================== 10. lcd_putc((year / 10) lcd_putc((year % 10) } + 48). Percobaan-20: Aplikasi RTC (I2C) Bagian-2 // program RTC_02.h" #include "lcd_pc.5. init_lcd(). lcd_goto(line1). lcd_puts(" Demo RTC "). lcd_putc((second / 10) lcd_putc((second % 10) lcd_goto(line2). + 48). _delay_ms(1000). lcd_goto(line2). + 48).C // penulisan dan pembacaan RTC DS1307 // dengan komunikasi I2C + beep setiap 30 detik #define F_CPU 11059200UL #include "util/delay. lcd_putc((date / 10) lcd_putc((date % 10) lcd_putc(47). } //==========================================program utama int main() { init_devices(). + 48). //LED OUTPUT DDRC=255. //karakter "/" + 48).h" #include "avr/io. rtc_lcd().

volatile unsigned char second,minute,hour,day,date,month,year; char dec2bcd(char num) { return ((num/10 * 16) + (num % 10)); } char bcd2dec(char num) { return ((num/16 * 10) + (num % 16)); } void dectobcdrtc() { hour=dec2bcd(hour); minute=dec2bcd(minute); second=dec2bcd(second); date=dec2bcd(date); month=dec2bcd(month); year=dec2bcd(year); } void bcdtodecrtc() { hour=bcd2dec(hour); minute=bcd2dec(minute); second=bcd2dec(second); date=bcd2dec(date); month=bcd2dec(month); year=bcd2dec(year); } void beep() { PORTA |= (1<<7); _delay_ms(10); PORTA &= ~(1<<7); //_delay_ms(100); } void gettimertc() { i2c_start(); i2c_transmit_byte(0xd0); i2c_transmit_byte(0); i2c_start(); i2c_transmit_byte(0xd1); second=i2c_receive_byte(ACK); minute=i2c_receive_byte(ACK); hour=i2c_receive_byte(ACK); day=i2c_receive_byte(ACK); date=i2c_receive_byte(ACK); month=i2c_receive_byte(ACK); year=i2c_receive_byte(NO_ACK); i2c_stop(); _delay_ms(10); bcdtodecrtc(); }

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

void rtc_lcd() { lcd_goto(line1); lcd_putc((hour / 10) lcd_putc((hour % 10) lcd_putc(58); lcd_putc((minute / 10) lcd_putc((minute % 10) lcd_putc(58); lcd_putc((second / 10) lcd_putc((second % 10) lcd_goto(line2); lcd_putc((date / 10) lcd_putc((date % 10) lcd_putc(47); lcd_putc((month / 10) lcd_putc((month % 10) lcd_putc(47); lcd_putc((year / 10) lcd_putc((year % 10) }

+ 48); + 48); //karakter ":" + 48); + 48); + 48); + 48); + 48); + 48); //karakter "/" + 48); + 48); + 48); + 48);

//========================================================= void init_devices() { DDRB=255; //LED OUTPUT DDRA |= (1<<7); DDRC=255; } //==========================================program utama int main() { init_devices(); init_lcd(); lcd_goto(line1); lcd_puts(" Demo RTC "); lcd_goto(line2); lcd_puts(" DS1307"); _delay_ms(1000); lcd_clrscr(); while(1) { gettimertc(); rtc_lcd(); led=second; if ((second==0)||(second==30)) beep(); _delay_ms(1000); } } //===========================================

10.6. Tentang Two-wire Serial EEPROM AT24C32/64
Fitur dari 2-wire (komunikasi TWI atau I2C) Serial EEPROM AT24C32/64 sebagai berikut...
 Low-Voltage and Standard-Voltage Operation o 2.7 (VCC = 2.7V to 5.5V) Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha - 74

          

o 1.8 (VCC = 1.8V to 5.5V) Low-Power Devices (ISB = 2 μA at 5.5V) Available Internally Organized 4096 x 8 (32KB), 8192 x 8 (64 KB) 2-Wire Serial Interface Schmitt Trigger, Filtered Inputs for Noise Suppression Bidirectional Data Transfer Protocol 100 kHz (1.8V, 2.5V, 2.7V) and 400 kHz (5V) Clock Rate Write Protect Pin for Hardware Data Protection 32-Byte Page Write Mode (Partial Page Writes Allowed) Self-Timed Write Cycle (10 ms max) High Reliability o Endurance: 1 Million Write Cycles o Data Retention: 100 Years Automotive Grade and Extended Temperature Devices Available

Diagram pin beserta keterangan pin-nya ditunjukkan pada Gambar 51. Sedangkan diagram blok-nya ditunjukkan pada Gambar 52. Pin A0 – A2 digunakan untuk menentukan alamat dari divais AT24C32/64 yang bersangkutan, bisa 8 macam alamat, dari 0 hingga 7. Untuk rangkaian, kaki atau pin SDA dan SCL dihubungkan ke 2 pin berbeda dari mikrokontroler yang bersangkutan, komunikasi-nya sama seperti DS1307, yaitu menggunakan TWI atau I2C.

Gambar 51. Diagram Pin AT24C32/64 Jika pin atau kaki write protect dihubungkan ke GND, maka bekerja secara normal, bisa baca dan tulis. Sedangkan jika dihubungkan ke Vcc, maka penulisan ke kuadran teratas (8/16K bit) dilarang atau tidak bisa. Untuk pengalamat divais ini melalui program, gunakan rujukan yang ditunjukkan pada Gambar 53. dengan format 4 bit awal selalu „1010‟ kemudian diikuti dengan 3 bit alamat divais dan 1 bit untuk operasi pembacaan (R) atau penulisan (W). Jika pin R/W = 0, maka terjadi penulisan data.

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

7.76 . Diagram blok AT24C32/64 Gambar 53.h" #include "lcd_pc.C // penulisan dan pembacaan EEPROM internal M16 #define F_CPU 11059200UL #include "util/delay.h" #include "stdlib.h" #include "avr/pgmspace.c" #define #define #define #define led PORTB tombol PIND satu 2 dua 3 Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha .c" #include "eeprom.h" #include "avr/io. Percobaan-21: Akses EEPROM Internal // program EEPROM_INT. 10. dan yang kedua mengakses EEPROM eksternal yang membutuhkan protokol I2C. dalam hal ini tidak diperlukan akses I2C. Pengalamatan divais AT24C32/64 Berikut ini diberikan dua contoh program mengakses EEPROM.Gambar 52. Percobaan pertama mengakses EEPROM internal.

. lcd_goto(line1). lcd_goto(line1). lcd_puts("baca EEPROM. lcd_goto(line2).c" #define #define #define #define led PORTB tombol PIND satu 2 dua 3 Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . init_lcd().8. led=tempeeprom..").c" #include "i2cman. } //=========================================== 10. _delay_ms(1000). //LED OUTPUT DDRC=255.77 . _delay_ms(1000).").101). writeeeprom(0.h" #include "lcd_pc. lcd_puts("tulis EEPROM"). lcd_goto(line1). lcdbyte(tempeeprom).h" #include "avr/io. lcd_puts("Internal Mega16").//========================================================= void init_devices() { DDRB=255. _delay_ms(1000). init_devices().c" #include "i2c_at24c64. //introduksi melalui LCD lcd_puts("Demo EEPROM"). lcd_clrscr(). lcd_goto(line1). } //==========================================program utama int main() { unsigned char tempeeprom. led=0..C // penulisan dan pembacaan EEPROM eksternal // komunikasi I2C AT24C64 #define F_CPU 11059200UL #include "util/delay. lcd_puts("hasilnya. //tulis ke alamat 0x00 //baca dari alamat 0x00 //tampilkan hasil baca ke LCD while(1). lcd_goto(line2). Percobaan-22: Akses EEPROM Eksternal (I2C) // program EEPROM_EXT01. tempeeprom=readeeprom(0). lcd_clrscr().h" #include "avr/pgmspace..h" #include "stdlib.

. lcd_goto(line1). lcd_goto(line2). lcd_puts(" AT24C2").id.selesai --- Copyright (c) 2011 by Agfianto Eko Putra and Dhani Nugraha . tempeeprom=i2c_eeprom_read(0). terima kasih! --. _delay_ms(1000). led=tempeeprom."). } //=========================================== Catatan: Saran dan masukan untuk buku ini silahkan kirim email ke agfi68@ugm. } //==========================================program utama int main() { unsigned char tempeeprom. i2c_eeprom_write(0. lcd_puts("hasilnya.ac. init_lcd(). lcd_goto(line1). lcdbyte(tempeeprom). //LED OUTPUT DDRC=255. lcd_puts("baca EEPROM."). lcd_clrscr(). lcd_goto(line1). lcd_puts("tulis EEPROM"). _delay_ms(1000). lcd_puts(" Demo EEPROM "). lcd_goto(line1).. lcd_goto(line2)..78 .202). lcd_clrscr(). init_devices(). //tulis ke alamat 0x00 //baca dari alamat 0x00 //tampilkan hasil baca ke LCD while(1).//========================================================= void init_devices() { DDRB=255.. _delay_ms(1000).

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->