• Tidak ada hasil yang ditemukan

Mudah Pemrograman Mikrokontroller ATMEL AVR Dengan BASCOM AVR

N/A
N/A
Protected

Academic year: 2021

Membagikan "Mudah Pemrograman Mikrokontroller ATMEL AVR Dengan BASCOM AVR"

Copied!
104
0
0

Teks penuh

(1)Hak Cipta dilindungi Undang-Undang, 2010 (c) Agfianto Eko Putra. Mudah Menguasai Pemrograman Mikrokontroler Atmel AVR menggunakan BASCOM-AVR Agfianto Eko Putra (http://klikdisini.com/embedded). Versi 1.5 - 2010 Kelompok Riset DSP dan Embedded Intelligent System – ELINS Universitas Gadjah Mada - Yogyakarta 55281.

(2) Hak Cipta dilindungi Undang-Undang, 2010 (c) Agfianto Eko Putra. Daftar Isi Modul-1: ATMega16 DAN BASCOM AVR .......................................................................................... 1 1.1. Apakah Mikrokontroler itu? ............................................................................................... 1 1.2. Pengetahuan Dasar Mikrokontroler AVR ............................................................................ 3 1.2.1. Pendahuluan .............................................................................................................. 3 1.2.2. Memilih AVR “yang benar” ......................................................................................... 4 1.3. Ada Apa dengan Mikrokontroler AVR ATMega16?.............................................................. 5 1.4. Ringkasan Fitur-fitur Mikrokontroler AVR ATMega16 ......................................................... 5 1.5. Diagram Pin dan Diagram Blok Mikrokontroler AVR ATMega16 .......................................... 7 1.6. Penjelasan Singkat Pin-pin pada Mikrokontroler AVR ATMega16........................................ 9 1.7. Mengawali Membuat Aplikasi berbasis Mikrokontroler AVR............................................. 10 1.8. Bahasa Pemrograman BASIC AVR (BASCOM AVR)............................................................. 14 1.8.1. Tipe Data .................................................................................................................. 14 1.8.2. Variabel .................................................................................................................... 14 1.8.3. Konstanta ................................................................................................................. 15 1.8.4. Penulisan Bilangan ................................................................................................... 16 1.8.5. Alias ......................................................................................................................... 16 1.8.6. Array atau Larik ........................................................................................................ 16 1.8.7. Operator .................................................................................................................. 16 1.8.8. Operasi Bersyarat ..................................................................................................... 17 1.8.9. Pengulangan Operasi ................................................................................................ 18 1.8.10. Lompatan Proses ...................................................................................................... 19 Modul-2: Konsep I/O ATMega16 (LED dan Pushbutton) ................................................................. 20 2.1. Rangkaian LED CC – Common Cathode ............................................................................. 20 2.2. Latihan-1: Menghidupkan semua LED ............................................................................... 20 2.3. Latihan-2: Menghidupkan dan Mematikan LED ................................................................ 21 2.4. Latihan-3: Animasi LED ..................................................................................................... 22 2.5. Latihan-4: Animasi LED – Alternatif Program .................................................................... 23 2.6. Latihan-5: Animasi LED Lainnya ........................................................................................ 24 2.7. Latihan-6: Penerjemahan Penekanan PushButton pada Tampilan LED .............................. 24 2.8. Latihan-7: Pushbutton dan Animasi LED ........................................................................... 26 Modul-3: Timer, Counter dan PWM................................................................................................ 27 3.1. Pendahuluan Timer dan Counter ...................................................................................... 27 3.2. Tentang Timer0 dan Timer2 ............................................................................................. 27 3.3. Timer0, Timer2 dan BASCOM AVR .................................................................................... 28 3.4. Tentang Timer1 ................................................................................................................ 29 3.5. Latihan-1: Menggunakan Timer1 ...................................................................................... 30 3.6. Latihan-2: Menggunakan Timer0 ...................................................................................... 36 3.7. Latihan-3: Menggunakan Counter0 .................................................................................. 39 3.8. Latihan-4: Menggunakan Fasilitas Capture pada Timer1 ................................................... 41 3.9. Latihan-5: Tentang PWM (Pulse Width Modulation) ......................................................... 42 Modul-4: Konsep Interupsi ............................................................................................................. 47 4.1. Pendahuluan Interupsi ..................................................................................................... 47 4.2. Latihan-1: Interupsi Eksternal 0 dan 1............................................................................... 48 4.3. Latihan-2: Program Apakah ini?! ...................................................................................... 50 4.4. Latihan-3: Membuat STOPWATCH .................................................................................... 51 Modul-5: Komunikasi Serial ............................................................................................................ 55 5.1. Komunikasi Serial ............................................................................................................. 55 5.2. Penjelasan Instruksi dan Directive Komunikasi Serial ........................................................ 55.

(3) Hak Cipta dilindungi Undang-Undang, 2010 (c) Agfianto Eko Putra 5.3. Latihan-1: Komunikasi Serial dan LCD – Bagian 1 .............................................................. 56 5.4. Latihan-2: Komunikasi Serial dan LCD – Bagian 2 .............................................................. 60 5.5. Latihan-3: Protokol Komunikasi Serial .............................................................................. 61 Modul-6: LCD dan ADC.................................................................................................................... 63 6.1. Rangkaian Antarmuka LCD 2x16 Karakter ......................................................................... 63 6.2. Rangkaian Antarmuka LCD dan ADC ................................................................................. 64 6.3. Latihan-1: Tampilan “Saya Manusia Keren” di LCD............................................................ 64 6.4. Latihan-2: Tampilan “Saya Manusia Keren” Berkedip-kedip di LCD ................................... 66 6.5. Latihan-3: Menggeser Tampilan pada LCD ........................................................................ 67 6.6. Latihan-4: Animasi Karakter pada LCD .............................................................................. 67 6.7. Latihan-5: Antarmuka LCD dan Pushbutton ...................................................................... 72 6.8. Latihan-6: Pemanfaatan ADC pada Mikrokontroler AVR ................................................... 74 6.9. Latihan-7: Pemanfaatan ADC untuk Sensor Suhu LM35 .................................................... 77 6.10. Latihan-8: Pembacaan 2 Kanal ADC pada Mikrokontroler AVR ...................................... 79 6.11. Latihan-9: Pembacaan 4 Kanal ADC pada Mikrokontroler AVR ...................................... 80 Modul-7: Aplikasi RTC dan EEPROM ............................................................................................... 82 7.1. Pendahuluan RTC DS1307 ................................................................................................ 82 7.2. Komunikasi I2C pada RTC DS1307 ..................................................................................... 83 7.3. Rangkaian Baku RTC DS1307 ............................................................................................ 84 7.4. Latihan-1: Jam Digital (LCD) dengan RTC DS1307 .............................................................. 84 7.5. Latihan-2: Jam Digital (LCD) dengan RTC DS1307, Alternatif ............................................. 90 7.6. Latihan-3: Akses EEPROM Internal Mikrokontroler ATMega16 ......................................... 92 7.7. Tentang Two-wire Serial EEPROM AT24C32/64 ................................................................ 95 7.8. Latihan-4: Akses EEPROM Eksternal AT24C64 ................................................................... 97 7.9. Latihan-5: Akses EEPROM Eksternal AT24C64 – alternatif SUBRUTIN ................................ 99. Yogyakarta, 01 Juni 2010 Agfianto Eko Putra [ http://agfi.staff.ugm.ac.id – agfi@ugm.ac.id ] DIPERLUKAN OTAK KANAN DAN KIRI UNTUK KESUKSESAN ANDA DALAM DUNIA MIKROKONTROLER!.

(4) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra. Modul-1: ATMega16 DAN BASCOM AVR 1.1.. Apakah Mikrokontroler itu?. Jika kita bicara tentang Mikrokontroler, maka tidak terlepas dari pengertian atau definisi tentang Komputer itu sendiri, mengapa? Ada kesamaan-kesamaan antara Mikrokontroler dengan Komputer (atau Mikrokomputer), antara lain: Sama-sama memiliki unit pengolah pusat atau yang lebih dikenal dengan CPU (Central Processing Unit); CPU tersebut sama-sama menjalankan program dari suatu lokasi atau tempat, biasanya dari ROM (Read Only Memory)1 atau RAM (Random Access Memory)2; Sama-sama memiliki RAM yang digunakan untuk menyimpan data-data sementara atau yang lebih dikenal dengan variabel-variabel; Sama-sama memiliki beberapa luaran dan masukan (I/O) yang digunakan untuk melakukan komunikasi timbal-balik dengan dunia luar, melalui sensor (masukan) dan aktuator (luaran), perhatikan bagan yang ditunjukkan pada Gambar 1.1.. Masukanmasukan. Pemroses. • sensor cahaya • sensor suhu • sensor tekanan, dll. Luaran-luaran. • uC AT89 • uC AVR • uC PIC16F, dll. • aktuator motor • relay • speaker, dll. Gambar 1.1. Bagan masukan, pemrosesan hingga luaran Lantas apa yang membedakan antara Mikrokontroler dengan Komputer atau Mikrokomputer? Begitu mungkin pertanyaan yang ada di benak kita, saat kita membaca beberapa daftar kesamaan yang sudah saya tuliskan tersebut. Sama sekali berbeda, itu jawaban yang saya berikan kepada Anda: Mikrokontroler adalah versi mini dan untuk aplikasi khusus dari Mikrokomputer atau Komputer! Berikut saya berikan kembali daftar kesamaan yang pernah kemukakan sebelumnya dengan menekankan pada perbedaan antara Mikrokontroler dan Mikrokomputer: CPU pada sebuah Komputer berada eksternal dalam suatu sistem, sampai saat ini kecepatan operasionalnya sudah mencapai lebih dari 2,5 GHz, sedangkan CPU pada Mikrokontroler berada didalam (internal) sebuah chip, kecepatan kerja atau operasionalnya masih cukup rendah, dalam orde MHz (misalnya, 24 MHz, 40 MHz dan lain sebagainya). Kecepatan yang relatif rendah ini sudah mencukupi untuk aplikasi-aplikasi berbasis mikrokontroler. Jika CPU pada mikrokomputer menjalankan program dalam ROM atau yang lebih dikenal dengan BIOS (Basic I/O System) pada saat awal dihidupkan, kemudian mengambil atau 1 2. Memori yang hanya bisa dibaca saja. Memori yang bisa dibaca juga bisa ditulisi.. Hal. 1.

(5) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra menjalankan program yang tersimpan dalam hard disk. Sedangkan mikrokontroler sejak awal menjalankan program yang tersimpan dalam ROM internal-nya (bisa berupa Mask ROM atau Flash PEROM atau Flash ROM). Sifat memori program dalam mikrokontroler ini non-volatile, artinya tetap akan tersimpan walaupun tidak diberi catu daya. RAM pada mikrokomputer bisa mencapai ukuran sekian GByte dan bisa di-upgrade ke ukuran yang lebih besar dan berlokasi di luar CPU-nya, sedangkan RAM pada mikrokontroler ada di dalam chip dan kapasitasnya rendah, misalnya 128 byte, 256 byte dan seterusnya dan ukuran yang relatif kecil inipun dirasa cukup untuk aplikasi-aplikasi mikrokontroler. Luaran dan masukan (I/O) pada mikrokomputer jauh lebih kompleks dibandingkan dengan mikrokontroler, yang jauh lebih sederhana, selain itu, pada mikrokontroler akses keluaran dan masukan bisa per bit. Jika diamati lebih lanjut, bisa dikatakan bahwa Mikrokomputer atau Komputer merupakan komputer serbaguna atau general purpose computer, bisa dimanfaatkan untuk berbagai macam aplikasi (atau perangkat lunak). Sedangkan mikrokontroler adalah special purpose computer atau komputer untuk tujuan khusus, hanya satu macam aplikasi saja. Perhatikan Gambar 1.2, agar Anda mendapatkan gambaran tentang mikrokontroler lebih jelas.. Gambar 1.2. Diagram Blok mikrokontroler (yang) disederhanakan ALU, Instruction Decoder, Accumulator dan Control Logic, sebagaimana ditunjukkan pada Gambar 1.2, merupakan Otak-nya mikrokontroler yang bersangkutan. Jantungnya berasal dari detak OSC (lihat pada Gambar 1.2 sebelah kiri atas). Sedangkan di sekeliling ‘Otak’ terdapat berbagai macam periferal seperti SFR (Special Function Register) yang bertugas menyimpan data-data sementara selama proses berlangsung). Instruction Decoder bertugas menerjemahkan setiap instruksi yang ada di dalam Program Memory (hasil dari pemrograman yang kita buat sebelumnya). Hasil penerjemahan tersebut merupakan suatu operasi yang harus dikerjakan oleh ALU (Arithmetic Logic Unit), mungkin dengan bantuan memori sementara Accumulator yang kemudian menghasilkan sinyal-sinyal kontrol ke seluruh periferal yang terkait melalui Control Logic. Memori RAM atau RAM Memory bisa digunakan sebagai tempat penyimpan sementara, sedangkan SFR (Special Function Register) sebagian ada yang langsung berhubungan dengan I/O dari. Hal. 2.

(6) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra mikrokontroler yang bersangkutan dan sebagian lain berhubungan dengan berbagai macam operasional mikrokontroler. ADC atau Analog to Digital Converter (tidak setiap mikrokontroler memiliki ADC internal), digunakan untuk mengubah data-data analog menjadi digital untuk diolah atau diproses lebih lanjut. Timer atau Counter digunakan sebagai pewaktu atau pencacah, sebagai pewaktu fungsinya seperti sebuah jam digital dan bisa diatur cara kerjanya. Sedangkan pencacah lebih digunakan sebagai penghitung atau pencacah event atau bisa juga digunakan untuk menghitung berapa jumlah pulsa dalam satu detik dan lain sebagainya. Biasanya sebuah mikrokontroler bisa memiliki lebihd dari 1 timer. EEPROM (sama seperti RAM hanya saja tetap akan menyimpan data walaupun tidak mendapatkan sumber listrik/daya) dan port-port I/O untuk masukan/luaran, untuk melakukan komunikasi dengan periferal eksternal mikrokontroler seperti sensor dan aktuator. Beberapa catatan mikrokontroler lainnya adalah: ‘Tertanam’ (atau embedded) dalam beberapa piranti (umumnya merupakan produk konsumen) atau yang dikenal dengan istilah embedded system atau embedded controller; Terdedikasi untuk satu macam aplikasi saja (lihat contoh-contoh yang akan saya terangkan pada bagian lain dari buku ini); Hanya membutuhkan daya yang (cukup) rendah (low power) sekitar 50 mWatt (Anda bandingkan dengan komputer yang bisa mencapai 50 Watt lebih); Memiliki beberapa keluaran maupun masukan yang terdedikasi, untuk tujuan atau fungsifungsi khusus; Kecil dan relatif lebih murah (seri AT89 di pasaran serendah-rendahnya bisa mencapai Rp. 15.000,00, mikrokontroler AVR di pasaran saat ini juga relatif murah sedangkan Basic Stamp bisa mencapai Rp. 500.000,00); Seringkali tahan-banting, terutama untuk aplikasi-aplikasi yang berhubungan dengan mesin atau otomotif atau militer. Mikrokontroler yang beredar saat ini dibedakan menjadi dua macam, berdasarkan arsitekturnya: o Tipe CISC atau Complex Instruction Set Computing yang lebih kaya instruksi tetapi fasilitas internal secukupnya saja (seri AT89 memiliki 255 instruksi); o Tipe RISC atau Reduced Instruction Set Computing yang justru lebih kaya fasilitas internalnya tetapi jumlah instruksi secukupnya (seri PIC16F hanya ada sekitar 30-an instruksi).. 1.2.. Pengetahuan Dasar Mikrokontroler AVR. 1.2.1. Pendahuluan Keluarga Mikrokontroler AVR merupakan mikrokontroler dengan arsitektur modern (emang selama ini ada yang kuno kali??). Perhatikan Gambar 1.3, Atmel membuat 5 (lima) macam atau jenis mikrokontroler AVR, yaitu: TinyAVR (tidak ada kaitannya ama mbak Tini yang jualan gudeg…) Mikrokontroler (mungil, hanya 8 sampai 32 pin) serbaguna dengan Memori Flash untuk menyimpan program hingga 16K Bytes, dilengkapi SRAM dan EEPROM 512 Bytes. MegaAVR (nah yang ini sudah mulai banyak yang nulis bukunya…) Mikrokontroler dengan unjuk-kerja tinggi, dilengkapi Pengali Perangkat keras (Hardware. Hal. 3.

(7) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Multiplier), mampu menyimpan program hingga 256 KBytes, dilengkapi EEPROM 4K Bytes dan SRAM 8K Bytes. AVR XMEGA Mikrokontroler AVR 8/16-bit XMEGA memiliki periferal baru dan canggih dengan unjukkerja, sistem Event dan DMA yang ditingkatkan, serta merupakan pengembangan keluarga AVR untuk pasar low power dan high performance (daya rendah dan unjuk-kerja tinggi). AVR32 UC3 Unjuk-kerja tinggi, mikrokontroler flash AVR32 32-bit daya rendah. Memiliki flash hingga 512 KByte dan SRAM 128 KByte. AVR32 AP7 Unjuk-kerja tinggi, prosesor aplikasi AVR32 32-bit daya rendah, memiliki SRAM hingga 32 KByte.. Gambar 1.3. Mikrokontroler Atmel: Sukses melalui inovasi Cuman yang populer di Indonesia adalah tinyAVR dan megaAVR, itupun masih kalah populer dengan keluarga AT89 yang belakangan juga sudah mulai banyak yang beralih ke AVR. Perbedaan jenis-jenis tersebut terletak dari fasilitas, atau lebih dikenal dengan fitur-fiturnya. Jenis TinyAVR merupakan mikrokontroler dengan jumlah pin yang terbatas (sedikit maksudnya) dan sekaligus fitur-fiturnya juga terbatas dibandingkan yang megaAVR. Semua mikrokontroler AVR memiliki set instruksi (assembly) dan organisasi memori yang sama, dengan demikian berpindahpindah (walaupun tidak disarankan) antar mikrokontroler AVR gak masalah dan mudah! Beberapa mikrokontroler AVR memiliki SRAM, EEPROM, antarmuka SRAM eksternal, ADC, pengali perangkat keras, UART, USART dan lain sebagainya. Bayangkan saja Anda punya TinyAVR dan MegaAVR, kemudian telanjangi (maksudnya copotin) semua periferal-nya, nah Anda akan memiliki AVR Core yang sama! Kayak membuang semua isi hamburger, maka Anda akan mendapatkan rotinya doang yang sama… 1.2.2. Memilih AVR “yang benar” Moralnya… tidak peduli tinyAVR, megaAVR, XMEGA AVR (AVR32 pengecualian karena masuk ke mikrokontroler 32-bit) semuanya memiliki unjuk-kerja yang sama saja, tetapi dengan “kompleksitas” atau fasilitas yang berbeda-beda, ibaratnya begini: banyak fasilitas dan fitur = megaAVR, fitur atau fasilitas terbatas = TinyAVR. Gitu aja kok repot…. Hal. 4.

(8) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Untuk lebih jelasnya perhatikan keterangan singkat yang saya berikan berikut ini, berdasar informasi resmi dari Atmel (http://www.atmel.com) dan maaf masih dalam bahasa Inggris (supaya kelihatannya aura kecanggihannya, he he he...). tinyAVR o Optimized for simple applications requiring a small microcontroller. o Great performance for cost effective devices. o Fully featured with 10-bit ADCs and high speed PWMs onboard. o Self-Programming Flash memory for maximum flexibility. o debugWIRE On-Chip Debug and In-System Programming. megaAVR o Self-Programming Flash memory with boot block. o High accuracy 10-bit A/D converters with up to x200 analog gain stage. o USART, SPI and TWI(1) compliant serial interfaces. o IEEE 1149.1 compliant JTAG interface on megaAVRs with 44 pins or more. o On-Chip Debug through JTAG or debugWIRE interface. AVR XMEGA o picoPower technology for ultra low power consumption o True 1.6 volt operation and CPU speed up to 32 MHz. o Event System and DMA Controller. o High speed, high resolution 12-bit ADC and DAC. o Crypto engine, Timers/Counters and fast communication interfaces. o Accurate and flexible Clock System with dynamic clock switching. AVR32 UC3 o High CPU performance. o Low power consumption. o High data throughput. o Low system cost. o High reliability. o Easy to use. AVR32 AP7 o High CPU perfromance. o Low power consumption. o SIMD / DSP instructions. o Instruction & data caches. o Memory management unit. o Built for embedded Linux. 1.3.. Ada Apa dengan Mikrokontroler AVR ATMega16?. O tidak apa-apa! Dalam buku saya ini memang sengaja menggunakan mikrokontroler AVR ATMega16 (kompatibel dengan ATMega16 dan ATMega8535) karena fitur-fitur yang dibutuhkan. Tentu saja Anda bisa menggunakan tipe AVR lainnya, apakah yang 40 pin atau yang kurang dari itu, bisa ATMega88, ATMega16, ATMega128, ATMega8535, ATMega168, dan lain sebagainya.. 1.4.. Ringkasan Fitur-fitur Mikrokontroler AVR ATMega16. Berikut ini saya ringkaskan berbagai macam fitur-fitur untuk Mikrokontroler AVR ATMega16 atau Atmega16L (Mikrokontroler AVR 8-bit dengan Flash ISP 16kByte) langsung dari datasheet-nya, maaf juga masih sebagian besar dalam Bahasa Inggris3... 3. Jika Anda bingung dengan istilah-istilah pada fitur-fitur ini silahkan merujuk ke datasheet aslinya, sehingga fokus pada buku ini tidak melulu pada datasheet.... Hal. 5.

(9) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra High-performance, Low-power AVR® 8-bit Microcontroller Advanced RISC Architecture o 131 Powerful Instructions – Most Single-clock Cycle Execution o 32 x 8 General Purpose Working Registers o Fully Static Operation o Up to 16 MIPS Throughput at 16 MHz o On-chip 2-cycle Multiplier Nonvolatile Program and Data Memories o 16K Bytes of In-System Self-Programmable Flash • Endurance: 10,000 Write/Erase Cycles o Optional Boot Code Section with Independent Lock Bits • In-System Programming by On-chip Boot Program • True Read-While-Write Operation o 512 Bytes EEPROM • Endurance: 100,000 Write/Erase Cycles o 1K Byte Internal SRAM o Programming Lock for Software Security JTAG (IEEE std. 1149.1 Compliant) Interface o Boundary-scan Capabilities According to the JTAG Standard o Extensive On-chip Debug Support o Programming of Flash, EEPROM, Fuses, and Lock Bits through the JTAG Interface Peripheral Features o Two 8-bit Timer/Counters with Separate Prescalers and Compare Modes o One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode o Real Time Counter with Separate Oscillator o Four PWM Channels o 8-channel, 10-bit ADC • 8 Single-ended Channels • 7 Differential Channels in TQFP Package Only • 2 Differential Channels with Programmable Gain at 1x, 10x, or 200x o Byte-oriented Two-wire Serial Interface o Programmable Serial USART o Master/Slave SPI Serial Interface o Programmable Watchdog Timer with Separate On-chip Oscillator o On-chip Analog Comparator Special Microcontroller Features o Power-on Reset and Programmable Brown-out Detection o Internal Calibrated RC Oscillator o External and Internal Interrupt Sources o Six Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, Standbyand Extended Standby I/O and Packages o 32 Programmable I/O Lines o 40-pin PDIP, 44-lead TQFP, and 44-pad MLF Operating Voltages o 2.7 - 5.5V for ATmega16L o 4.5 - 5.5V for ATmega16 Speed Grades o 0 - 8 MHz for ATmega16L o 0 - 16 MHz for ATmega16. Hal. 6.

(10) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Power Consumption @ 1 MHz, 3V, and 25°C for ATmega16L – Active: 1.1 mA – Idle Mode: 0.35 mA Power-down Mode: < 1 A. 1.5.. Diagram Pin dan Diagram Blok Mikrokontroler AVR ATMega16. Pada Gambar 1.4 dan 0.5 ditunjukkan diagram pin, masing-masing, untuk Mikrokontroler AVR ATMega16 tipe PDIP dan TQFP/MLF atau dikenal sebagai SMD.. Gambar 1.4. Diagram Pin Mikrokontroler AVR ATMega16 tipe PDIP. Gambar 1.5. Diagram Pin Mikrokontroler AVR ATMega16 tipe SMD. Hal. 7.

(11) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Pada Gambar 1.6 ditunjukkan diagram blok untuk Mikrokontroler AVR ATMega16, perhatikan begitu banyaknya fitur-fitur dalam diagram blok tersebut, sebagaimana juga sudah saya kutipkan pada bagian sebelumnya.. Gambar 1.6. Diagram blok Mikrokontroler AVR ATMega16. Hal. 8.

(12) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra. 1.6.. Penjelasan Singkat Pin-pin pada Mikrokontroler AVR ATMega16. Berikut saya jelaskan secara singkat fungsi dari masing-masing PIN pada Mikrokontroler AVR ATMega16. Vcc GND Port A (PA7..PA0). Port B (PB7..PB0). Port C (PC7..PC0). Port D (PD7..PD0). /RESET XTAL1 XTAL2 AVCC. AREF. Masukan tegangan catu daya Ground, emang apalagi kalau bukan ground... Port A berfungsi sebagai masukan analog ke ADC internal pada mikrokontroler ATMega16, selain itu juga berfungsi sebagai port I/O dwi-arah 8-bit, jika ADC-nya tidak digunakan. Masing-masing pin menyediakan resistor pull-up internal4 yang bisa diaktifkan untuk masing-masing bit. Port B berfungsi sebagai sebagai port I/O dwi-arah 8-bit.Masing-masing pin menyediakan resistor pull-up internal yang bisa diaktifkan untuk masing-masing bit. Port B juga memiliki berbagai macam fungsi alternatif, sebagaimana ditunjukkan pada Tabel 1.1 Port C berfungsi sebagai sebagai port I/O dwi-arah 8-bit.Masing-masing pin menyediakan resistor pull-up internal yang bisa diaktifkan untuk masing-masing bit. Port C juga digunakan sebagai antarmuka JTAG, sebagaimana ditunjukkan pada Tabel 1.2 Port D berfungsi sebagai sebagai port I/O dwi-arah 8-bit.Masing-masing pin menyediakan resistor pull-up internal yang bisa diaktifkan untuk masing-masing bit. Port D juga memiliki berbagai macam fungsi alternatif, sebagaimana ditunjukkan pada Tabel 1.3 Masukan Reset. Level rendah pada pin ini selama lebih dari lama waktu minimum yang ditentukan akan menyebabkan reset, walaupun clock tidak dijalankan. Masukan ke penguat osilator terbalik (inverting) dan masukan ke rangkaian clock internal. Luaran dari penguat osilator terbalik Merupakan masukan tegangan catu daya untuk Port A sebagai ADC, biasanya dihubungkan ke Vcc, walaupun ADC-nya tidak digunakan. Jika ADC digunakan sebaiknya dihubungkan ke Vcc melalui tapis lolos-bawah (low-pass filter). Merupakan tegangan referensi untuk ADC. Pada Tabel 1.1, 1.2 dan 1.3 ditunjukkan masing-masing alternatif fungsi dari Port B, Port C dan Port D. Dalam buku saya ini sengaja penjelasan dari masing-masing fungsi tersebut (kecuali antarmuka JTAG) akan dibahas pada saat digunakan, sehingga Anda bisa memahami langsung dengan mencoba, istilah kerennya “Learning by Doing”.... 4. Resistor pull up internal berkaitan dengan rangkaian internal pada mikrokontroler AVR yang bersangkutan.. Hal. 9.

(13) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Tabel 1.1. Alternatif fungsi Port B. Tabel 1.2. Alternatif fungsi Port C. Tabel 1.3. Alternatif fungsi Port D. 1.7.. Mengawali Membuat Aplikasi berbasis Mikrokontroler AVR. Untuk menjawab pertanyaan ini, kita awali saja dengan menjelaskan perancangan aplikasi berbasis Mikrokontroler AVR ATMega16. Lantas bagaimana atau langkah-langkah apa saja yang perlu dilakukan, perhatikan Gambar 1.7.. Hal. 10.

(14) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra. Gambar 1.7. Diagram alir perancangan aplikasi berbasis mikrokontroler (apa saja) Nach, berdasar diagram alir tersebut, semuanya berawal dari MASALAH, atau bisa juga Anda sebut PROYEK, KASUS atau apa saja yang Anda suka selama artinya adalah sesuatu yang ingin dicari atau dibuat solusinya. Lebih tepatnya, pada tahap awal yang perlu dilakukan adalah IDENTIFIKASI MASALAH, persis atau detilnya bagaimana, misalnya… “Bagaimana membuat aplikasi menghidupkan LED berdasar tombol yang ditekan?” Ini tentunya belum cukup, informasinya masih kurang, beberapa pertanyaan yang bisa diajukan antara lain: LED-nya berapa? Tombol apa saja yang ditekan? Bagaimana hubungan antara sebuah tombol dengan LED yang bersangkutan? Apakah dimungkinkan menekan dua tombol atau lebih secara bersamaan? Apakah menyala-nya LED menggunakan tundaan? Atau hanya sekedar sesuai dengan tombol yang bersangkutan? Dan lain sebagainya. Hal ini sangat penting, dikarenakan dengan informasi yang detil, maka kita bisa membuat rangkaian dan program yang benar-benar sesuai dengan apa yang diinginkan. Dan yang lebih penting lagi, jika ini merupakan proyek atau pesanan, bisa dijadikan bahan dalam kontrak kerja atau berita acara. Tidak peduli akan Anda selesaikan dengan mikrokontroler AVR maupun AT89 atau bahkan. Hal. 11.

(15) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra mikrokontroler apapun. Hal ini juga menjadi penting untuk menentukan berapa lama pekerjaan harus diselesaikan, bukankah dengan informasi yang lengkap akan jauh lebih mudah memperkirakan segalanya? Selain itu, dengan detil informasi yang diperoleh, Anda bisa menentukan mikrokontroler apa yang akan digunakan, sesuai dengan kebutuhan. Ingatlah bahwa setiap mikrokontroler (baik keluarga AVR maupun AT89) masing-masing bisa memiliki fasilitas yang sama dan juga bisa berbeda. Apakah aplikasi atau solusi yang Anda tawarkan memerlukan Timer? Counter? Timer dan Counter? Sinyal PWM? Menggunakan motor servo? Motor DC? Motor Langkah? Apakah memerlukan Watchdog? Berapa frekuensi Clock yang dibutuhkan? Dan lain sebagainya… Biasanya, persoalan yang dihadapi adalah mencari solusi itu sendiri. Katakan saja jika persoalan masukan/luaran sudah teridentifikasi secara 100% semuanya, langkah berikutnya adalah MERANCANG atau MENEMUKAN SOLUSI, termasuk memilih mikrokontroler mana yang akan digunakan. Untuk keperluan mendapatkan informasi mikrokontroler AVR secara lengkap silahkan merujuk datasheet masing-masing. Ini adalah sumber utama yang bisa dipercaya, karena langsung diterbitkan oleh pabrik mikrokontroler yang bersangkutan (ATMEL, http://www.atmel.com). Setelah Anda melakukan IDENTIFIKASI MASALAH, langkah berikutnya (lihat diagram alir) adalah MELAKUKAN PERANCANGAN atau MENEMUKAN SOLUSI (termasuk menentukan masukan dan luaran apa saja yang terlibat dalam solusi tersebut). Langkah ini memang tidak semudah mengatakan-nya, namun ANDA PASTI BISA, karena semakin tinggi jam terbang Anda dalam menangani berbagai macam kasus-kasus yang melibatkan penggunaan mikrokontroler, Anda akan semakin terampil dan ‘jenius’. Misalnya saja, ada pertanyaan yang masuk ke saya bagaimana menampilkan hasil perhitungan atau hasil akuisisi data di LCD, Dot Matrix atau bahkan di 8×7segmen? Ini semua memerlukan kreativitas untuk mendapatkan solusinya. Saya sarankan sebaiknya Anda rajin membaca artikel-artikel saya atau diskusi dengan saya, atau bahkan cari sendiri di internet, tanya ke yang lebih pakar, bergabung dalam forum khusus mikrokontroler dan lain sebagainya… Termasuk dalam langkah MELAKUKAN PERANCANGAN adalah membuat DIAGRAM ALIR program mikrokontroler Anda. Oya, dalam membuat diagram alir usahakan dibuat secara umum, artinya tidak mewakili bahasa pemrograman apapun, termasuk assembly. Mengapa? Karena memang begitu aturan dalam membuat diagram alir yang baik dan benar, selain itu akan memudahkan kita atau mungkin orang lain, jika Anda berkenan, melakukan pengembangan lebih lanjut dengan bahasa yang berbeda-beda (misalnya Basic, C dan lain sebagainya). Langkah berikutnya adalah MEMBUAT RANGKAIAN YANG SESUAI (RANGKAIAN BAKU/MINIMUM PLUS APLIKASINYA), namun sebelumnya, ada baiknya Anda juga sudah menentukan bahasa pemrograman apa yang akan digunakan, sebaiknya yang GRATIS aja (seperti bahasa assembly atau C, dengan kompailer yang bisa Anda unduh dari website pabrik mikrokontroler yang bersangkutan), namun itu terserah Anda. Setelah Anda merancang rangkaian solusinya, yang kemudian kita sebut sebagai PROTOTIPE atau PURWARUPA, tentu langkah selanjutnya adalah MEMBUAT PROGRAM APLIKASI yang terkait dengan solusi yang telah Anda rancang sebelumnya, berdasarkan diagram alir yang telah Anda buat sebelumnya.. Hal. 12.

(16) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Pembuatan program aplikasi bisa Anda lakukan dengan bahasa pemrograman apapun yang Anda inginkan, jika Anda seorang pemula, saya sarankan untuk menggunakan BASCOM 8051 atau BASCOM AVR dari MCSELEC.COM, karena sangat mudah penggunaanya5. Oya program Anda, yang menggunakan bahasa apapun yang Anda suka, harus dikompilasi (menggunakan perangkat lunak yang sudah saya sebutkan sebelumnya) menjadi berkas BIN atau HEX (format heksadesimal), sebagaimana prosesnya ditunjukkan pada Gambar 1.8, untuk kemudian di-download-kan ke mikrokontroler yang bersangkutan. Sehingga mikrokontroler Anda bisa menjalankan program Anda. Selain itu, Anda juga bisa mencoba-nya terlebih dahulu melalui simulator mikrokontroler menggunakan perangkat lunak Proteus VSM dari LabCenter (silahkan mengunduh demonya di http://www.labcenter.co.uk/).. Gambar 1.8. Alur pemrograman aplikasi mikrokontroler Langkah selanjutnya tentu saja MELAKUKAN UJI-COBA DAN EVALUASI apakah rangkaian dan program sudah berjalan dengan benar atau belum, lakukan TROUBLESHOTING jika memang masih ada kesalahan mayor maupun minor, sehingga hasil yang diperoleh menjadi baik dan benar. Jika perlu gunakan prinsip worst case scenario atau skenario kondisi terburuk (misalnya, bagaimana kalo kepanasan, kebanjiran, gempa, interferensi frekuensi dan lain sebagainya), sehingga produk aplikasi Anda bisa bertahan dalam segala macam kondisi di lapangan. Apakah ada masalah dengan program? Cek pada program Anda. Atau ada masalah pada rangkaian? Silahkan cek, apakah rangkaian sudah benar. Atau justru permasalahan terjadi karena Anda memberikan solusi yang salah atau kurang tepat, silahkan cek semuanya. Sekali lagi perhatikan diagram alir proses pada Gambar 1.7. Ingatlah bahwa kesalahan bisa terjadi pada RANGKAIAN dan/atau PROGRAM, bahkan seringkali kesalahan-kesalahan sepele tetapi berdampak besar pada jalannya aplikasi kita, dengan demikian lakukan pengecekan secara menyeluruh. Saya pernah menanyakan kepada salah satu bimbingan TA saya untuk melakukan pengecekan, “Apakah PCB sudah kamu cek semua?”, jawaban dia, “Ooo. 5. Sampai paragraf ini, apakah pertanyaan “BASCOM AVR apaan tuch?” sudah terjawab? Mmmm, seharusnya sudah!. Hal. 13.

(17) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra sudah pak, sudah nyambung semua...”. Wah kaget saya, “Lho kalo nyambung semua ya konslet donk...! Ha ha ha...”, dia juga ikut tertawa, Anda saya harapkan jangan ikut ketawa ya... Pada bagian ini saya tidak perlu menjelaskan tentang apa dan bagaimana melakukan pemrograman BASCOM AVR, karena langsung akan saya jelaskan melalui masing-masing modul sesuai dengan kebutuhan. Jika Anda masih penasaran dengan konsep-konsep dasar BASCOM AVR silahkan ikut saja penjelasan saya ini, atau bisa Anda beli buku-buku Mikrokontroler AVR yang menggunakan BASCOM AVR seperti punya saya ini. Bingung? Ya sama...! ha ha ha... Udah kita lanjutkan saja ke modul pertama yang berbicara tentang Konsep I/O pada Mikrokontroler AVR dan pemrograman BASCOM AVR-nya... yuuuk.... 1.8.. Bahasa Pemrograman BASIC AVR (BASCOM AVR). Sebagaimana telah saya jelaskan sebelumnya, banyak cara dalam menuliskan program ke mikrokontroler, salah satunya bahasa BASIC. Penggunaan bahasa ini mempunyai kemudahan dalam memprogram dan adanya fasilitas simulator pada kompailer BASCOM AVR. 1.8.1. Tipe Data Tipe data berkaitan dengan peubah atau variabel atau konstanta yang akan menunjukkan daya tampung/jangkauan dari variabel/konstanta tersebut. Tipe data dalam BASCOM ditunjukkan pada Tabel 1.4. Tabel 1.4. Tipe Data dan Ukurannya Tipe Data Bit Byte Integer Word Long Single Double String. Ukuran (Byte) 1/8 1 2 2 4 4 8 s/d 254. Jangkauan Data 0 atau 1 0 s/d 255 -32768 s/d 3.767 0 s/d 65535 -2147483648 s/d 2147483647 1,5 x 10-45 s/d 3,4 x 1038 5 x 10-324 s/d 1,7 x 10308. 1.8.2. Variabel Variabel atau peubah digunakan untuk menyimpan data sementara. Variabel diberi nama dan dideklarasikan terlebih dahulu sebelum digunakan. Aturan pemberian nama variabel sebagai berikut: Harus dimulai dengan huruf (bukan angka). Tidak ada nama variabel yang sama dalam sebuah program. Maksimum 32 karakter Tanpa menggunakan spasi, pemisahan bisa dilakukan dengan garis bawah. Tidak menggunakan karakter-karakter khusus yang digunakan sebagai operator BASCOM Variabel dapat dideklarasikan dengan beberapa cara :. Hal. 14.

(18) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra 1. Dengan pernyataan DIM Deklarasi ini dibuat dengan perintah DIM (singkatan dori dimension) dengan aturan sebagai berikut: Dim <NamaVariabel> As <TipeData> Contoh : Dim angka As Integer Dim bilangan As byte Jika beberapa variabel dideklarasikan dalam satu baris, maka harus dipisah dengan tanda koma. Contoh: Dim angka As Integer, bilangan As byte 2. Dengan pernyataan DEFINT, DEFBIT, DEFBYTE, DEFWORD Deklarasi dengan pernyataan tersebut secara prinsip tidak berbeda dengan "DIM", perhatikan keterangan dari masing-masing pendeklarasian tersebut: DEFINT DEFBIT DEFBYTE DEFWORD DEFLNG DEFSNG DEFDBL. = untuk tipe data integer, = untuk tipe data bit, = untuk tipe data byte, = untuk tipe data word, = untuk tipe data long, = untuk tipe data singel, = untuk tipe data doubel.. Cara pendeklarasianya sebagai berikut: DEFINT/DEFBIT/DEFBYTE/DEFWORD <variabel> Contoh : DEFINT angka DEFBYTE bilangan Untuk variabel dengan tipe data yang sama dapat dideklarasikan dengan dipisah titik koma, misal DEFINT bil_1 ; bil 2 ; bil 3 1.8.3. Konstanta Berbeda dengan variabel, sebuah konstanta akan bernilai tetap. Sebelum digunakan, konstanta dideklarasikan terlebih dulu dengan cara (ada dua cara): Dim nama_konstanta As const nilai_konstanta Const nama_konstanta = nilai_konstanta Contoh : Dim pembagi as const 23. Hal. 15.

(19) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Const pembagi = 23 1.8.4. Penulisan Bilangan Pada BASCOM-AVR, bilangan dapat ditulis dalam 3 bentuk : 1. 2. 3.. Desimal ditulis biasa, contoh : 16 Biner diawali dengan &B, contoh : &B10001111 Heksadesimal diawali dengan &H, contoh : &H8F. 1.8.5. Alias Untuk mempermudah pemrograman, biasanya nama register dalam mikrokontroler dibuatkan nama yang identik dengan hardware yang dibuat, contoh : LED_1 alias PORTC.O ‘ nama lain dari PORTC.O adalah LED_1 SW_1 alias PINC.1 ‘ nama lain dari PINC.1 adalah SW_1 1.8.6. Array atau Larik Array atau larik merupakan sekumpulan variabel dengan nama dan tipe yang sama, yang berbeda indeks keanggotaannya. Cara mendeklarasikan array sebagai berikut: Dim nama array(jumlah anggota) as tipe_data Contoh: Dim daku(8) as byte. ‘ variabel daku dengan tipe data byte ‘ dengan 8 anggota. Untuk mengakses array dengan cara : daku(1) = 25 ‘ anggota pertama variabel daku isinya 25 PORTC=daku(1) ‘ PORTC = nilai anggota pertama variabel daku 1.8.7. Operator Operator digunakan dalam pengolahan data pemrograman dan biasanya membutuhkan dua variabel atau dua parameter, sedangkan operator dituliskan di antara kedua parameter tersebut. Operatoroperator BASCOM AVR ditunjjukkan pada Tabel 1.5, Tabel 1.6 dan Tabel 1.7. Tabel 1.5. Operator Aritmetik Operator + * / %. Keterangan Operasi penjumlahan Operasi pengurangan Operasi perkalian Operasi pembagian Operasi sisa pembagian. Hal. 16. Contoh A + B A – B A * B A / B A % B.

(20) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Tabel 1.6. Operator Relasional Operator = <> > < >= <=. Keterangan Sama dengan Tidak sama dengan Lebih besar dari Lebih kecil dari Lebih besar atau sama dengan Lebih kecil atau sama dengan. Contoh A = B A <> B A > B A < B A >= B A <= B. Tabel 1.7. Operator Logika Operator AND OR NOT XOR. Keterangan Operasi AND Operasi OR Operasi NOT Operasi XOR. Contoh &B110 And &B101 = &B100 &B11001 Or &B10111 = &B11111 NOT &HFF = &HO &B1001 Xor &B0111 = &B1110. 1.8.8. Operasi Bersyarat A. IF – THEN Sebuah atau serangkaian instruksi akan dikerjakan jika memenuhi syarat-syarat atau kondisi tertentu. Cara penulisannya sebagai berikut : If <kondisi> Then <perintah> ‘ 1 baris perintah If <kondisi> Then <perintah 1> <perintah 2> ... End If. ‘ lebih dari 1 perintah. B. IF - THEN – ELSE Versi lengkap dari sebuah atau serangkaian instruksi akan dikerjakan jika memenuhi syaratsyarat atau kondisi tertentu, jika tidak dipenuhi maka instruksi atau serangkaian instruksi lainnya-lah yang akan dikerjakan. Cara penulisannya sebagai berikut: If <kondisi> Then <perintah 1> ... Else <perintah 2> ... End If C. IF - THEN - ELSEIF Sama seperti IF-THEN-ELSE, hanya jika kondisi tidak dipenuhi masih dilakukan pengujian apakah suatu kondisi memenuhi syarat lainnya. Cara atau sintaks (syntax) penulisannya sebagai berikut: If <kondisi 1> Then <perintah 1> ... Elseif <kondisi 2> Then. Hal. 17.

(21) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra <perintah 2> ... End If D. SELECT - CASE Cocok digunakan untuk menangani pengujian kondisi yang jumlahnya cukup banyak. Cara penulisannya : Select case <variabel> Case 1: <perintah 1> Case 2: <perintah 2> ... End Select 1.8.9. Pengulangan Operasi A. FOR - NEXT Perintah ini digunakan untuk melaksanakan perintah secara berulang sesuai dengan jumlah yang ditentukan. Sintaks penulisannya : For <var> = <nil_awal> To <nil_akhir> <step angka> <perintah> Next [<var>] B. DO - LOOP Pernyataan ini untuk melakukan perulangan terus menerus tanpa henti (pengulangan tak berhingga) selama mikrokontroler-nya masih mendapatkan detak dan/atau catu daya. Cara penulisannya : Do <pernyataan> ... Loop Jika pengulangan dibatasi oleh suatu kondisi maka caranya ditunjukkan berikut ini, artinya pengulangan terus dilakukan sehingga suatu kondisi terpenuhi atau melakukan pengulangan selama kondisinya salah: Do <pernyataan> ... Loop Until <kondisi> C. WHILE - WEND Berbeda dengan DO-LOOP, instruksi ini digunakan untuk melakukan pengulangan selama kondisinya benar, cara penulisannya: While <kondisi> <perintah> ... Wend. Hal. 18.

(22) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra 1.8.10. Lompatan Proses A. GOSUB <nama_subrutin> Perintah ini akan melakukan lompatan sebuah subrutin, kemudian kembali lagi setelah subrutin perintah tersebut selesai dikerjakan. Rutin yang dibuat harus diakhiri dengan instruksi RETURN. Contoh: Print "We will start execution here" Gosub Routine Print "Back from Routine" End Routine: Print "This will be executed" Return B. GOTO <label> Perintah ini untuk melakukan lompatan ke label kemudian melakukan serangkaian instruksi tanpa harus kembali lagi, sehingga tidak perlu RETURN. Contoh: Dim A As Byte Start: A = A + 1 If A < 10 Then Goto Start End If Print "Ready". 'sebuah label diakhiri dengan : 'naikkan variabel A 'apakah lebih kecil 10? 'ya, lakukan lagi 'akhir IF 'ok. C. EXIT Untuk keluar secara langsung dari perulangan DO-LOOP, FOR-NEXT, WHILE-WEND. Cara penulisannya sebagai berikut : EXIT EXIT EXIT EXIT EXIT. FOR DO WHILE SUB FUNCTION. (keluar (keluar (keluar (keluar (keluar. dari dari dari dari dari. For-Next) Do-Loop) While-Wend) Sub-Endsub) suatu fungsi). - selesai Modul 1 -. Hal. 19.

(23) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra. Modul-2: Konsep I/O ATMega16 (LED dan Pushbutton) 2.1.. Rangkaian LED CC – Common Cathode. Pada Gambar 2.1 ditunjukkan delapan buah LED yang bisa dihubungkan ke suatu port pada mikrokontroler AVR, yang difungsikan sebagai luaran atau output. Pada konfigurasi ini LED akan menyala bila diberi logika HIGH dan LED akan padam bila diberi logika LOW. Hal ini disebabkan LED di konfigurasi sebagai Common Cathode atau CC, artinya (seluruh Katoda LED digabung menjadi satu dan dihubungkan ke GND). Anda bisa saja membalik polaritas dari LED tersebut, sehingga menjadi konfigurasi CA atau Common Anode, hanya saja untuk menghidupkan menggunakan logika HIGH.. Gambar 2.1. Mikrokontroler ATMega16 menggunakan kristal 11,0592MHz Pada rangkaian tersebut (Gambar 2.1) digunakan kristal sebesar 11.0592MHz, angka ini dipilih untuk menghasilkan ralat 0% untuk penentuan kecepatan baudrate (akan dijelaskan pada modul tersendiri). AVR bisa juga dijalankan tanpa menggunakan kristal eksternal, karena dari pabrik-nya sudah diset meggunakan osilator internal sebesar 1 MHz. Jika Anda kesulitan dalam mengatur osilator eksternal ini, maka seluruh program di buku ini pada bagian $crystal = 11059200 diganti dengan $crystal = 1000000, artinya digunakan frekuensi kerja 1 MHz, bukan 11.0592 MHz. Resistor sebesar 330 ohm digunakan untuk membatasi arus yang masuk pada LED, agar tidak cepat rusak dan cahayanya tidak terlalu menyilaukan mata (maaf tidak digambar).. 2.2.. Latihan-1: Menghidupkan semua LED. Untuk menghidupkan semua LED yang terhubung ke PORTB kita awali program dengan beberapa instruksi berikut... $regfile = "m16def.dat" $crystal = 11059200. Hal. 20.

(24) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Instruksi yang pertama digunakan untuk mendeklarasikan pustaka berdasar mikrokontroler yang digunakan, dalam contoh ini digunakan ATMega16 sehingga file yang dibutuhkan adalah m32def.dat. Sedangkan instruksi kedua ($crystal) digunakan untuk menentukan frekuensi kerja dari mikrokontrolernya, dalam hal ini digunakan kristal 11,0592MHz atau dituliskan 11059200 Hz1. Config Portb = Output Port_led Alias Portb Instruksi berikutnya (config portb) digunakan untuk menentukan apakah suatu PORT pada AVR digunakan sebagai masukan atau luaran, karena aplikasi yang sedang kita bicarakan dalam bagian ini adalah luaran tampilan LED, maka PORTB kita definisikan sebagai luaran (output). Untuk memudahkan akses PORTB bisa digunakan nama lain, misalnya PORT_LED, yang dilakukan dengan instruksi ALIAS (instruksi berikutnya). Port_led = 255 End. 'end program. Instruksi bagian akhir adalah menyalakan semua LED, yaitu dengan memberikan logika “1” sebanyak 8-bit atau 1 byte, artinya kita kirimkan &b11111111 atau &hFF atau 255. Jangan lupa diakhiri dengan instruksi END sebagai akhir program. Mengapa hal ini perlu dilakukan? Jika Anda lupa memberikan istruksi END, padahal program Anda sesungguhnya sudah selesai, hasil kompilasi tetap tidak mengetahui bahwa program Anda selesai, sehingga bisa menyebabkan hasil yang tidak diharapkan. Program selengkapnya... 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:. 2.3.. ‘ berkas LED01.BAS $regfile = "m16def.dat" $crystal = 11059200 Config Portb = Output Port_led Alias Portb Port_led = 255 End. 'end program. Latihan-2: Menghidupkan dan Mematikan LED. Okey, sekarang kita akan membuat aplikasi untuk menghidupkan dan mematikan LED secara bergantian dengan tundaan waktu tertentu. Rangkaian yang digunakan masih sama, diawal program, sebagaimana dijelaskan sebelumnya, dituliskan beberapa instruksi berikut (penjelasan sama seperti sebelumnya)... $regfile = "m16def.dat" $crystal = 11059200 Config Portb = Output 1. Defaultnya menggunakan osilator internal sebesar 1MHz, jadi sebaiknya ada tulis 1000000Hz, kecuali sudah ada atur setelan osilatornya ke 8MHz.. Hal. 21.

(25) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Port_led Alias Portb Kemudian langkah selanjutnya menuliskan serangkaian instruksi-instruksi berikut... Do Port_led = 255 Waitms 300 Port_led = 0 Waitms 300 Loop Diawali dengan instruksi DO..LOOP yang merupakan instruksi pengulangan tak berhingga, karena tidak dibatasi dengan UNTIL (lihat kembali penjelasan di Bagian 1 Handout ini). Apa yang diulangulang? Yup! Betul, menghidupkan (PORT_LED=255) dan mematikan (PORT_LED=0) LED yang terhubung ke PORTB secara bergantian dengan tundaan 300 milidetik (WAITMS 300), jika dirasa terlalu cepat silahkan saja diganti angka 300-nya dengan angka lain maksimum 65535. Perhatikan, WAITMS menggunakan satuan milidetik, WAITUS menggunakan satuan mikrodetik dan WAIT menggunakan satuan detik. Sedangkan DELAY (tanpa diikuti angka) bernilai tundaan selama 1000 mikrodetik atau 1 milidetik. Oya, mungkin Anda bertanya, loch instruksi END kok gak ditulis ya? Kelupaan-kah? Ooo tidak, sengaja saya tidak menuliskannya karena memang tidak perlu, mengapa? Karena hasil kompilasi program selalu aman karena disana ada pengulangan terus menerus, pengulangan tak berhingga, terus menerus mengulang (DO...LOOP) selama rangkaian mikrokontroler tersambung catu daya. Sehingga saya tidak khawatir program akan berjalan kacau sebagaimana saya uraikan sebelumnya. Jadi instruksi END Anda tulis atau tidak, dalam kasus ini, tidak ada efeknya... Program selengkapnya... 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:. ‘ berkas LED02.BAS $regfile = "m16def.dat" $crystal = 11059200. 2.4.. Latihan-3: Animasi LED. Config Portb = Output Port_led Alias Portb Do Port_led = 255 Waitms 300 Port_led = 0 Waitms 300 Loop. Sekarang kita tingkatkan latihan konsep luaran (output), masih menggunakan rangkaian yang sama, sebagaimana ditunjukkan pada Gambar 2.1, membuat aplikasi animasi ‘lampu berjalan’ menggunakan 8 LED yang terhubung di PORTB. Berikut ini program pertama (nanti saya berikan alternatif yang lebih pendek dan efisien)... 1: 2: 3:. ‘ berkas LED03.BAS $regfile = "m16def.dat" $crystal = 11059200. Hal. 22.

(26) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:. Config Portb = Output Port_led Alias Portb Do Port_led = Waitms 300 Port_led = Waitms 300 Port_led = Waitms 300 Port_led = Waitms 300 Port_led = Waitms 300 Port_led = Waitms 300 Port_led = Waitms 300 Port_led = Waitms 300 Loop. &B00000001 &B00000010 &B00000100 &B00001000 &B00010000 &B00100000 &B01000000 &B10000000. Maksudnya? Konsep programnya sama dengan program yang terakhir (LED02.BAS), hanya saja terdapat 8 data yang harus dikeluarkan melalui PORTB (yang tersambung dengan LED) dan diberi jeda 300 milidetik (baris 11, 13, 15, 17, 19, 21, 32 dan 25) secara bergantian, sehingga diperoleh kesan animasi LED (perhatikan pada data-data tersebut dan logika ‘1’-nya).. 2.5.. Latihan-4: Animasi LED – Alternatif Program. Tahukah Anda, bahwa program animasi tersebut terlalu panjang dituliskan. Ada cara lain untuk mengirimkan data seperti itu, perhatikan bahwa logika ‘1’ terlihat digeser kekiri, kemudian sampai diujung kiri (PORT_LED=&B10000000), kembali lagi dari kanan (PORT_LED=&B00000001). Untungnya, BASCOM AVR memiliki instruksi ROTATE yang dapat digunakan untuk menggeser (data) bit ke kanan atau ke kiri dan jika sudah sampai ujung kanan atau ujung kiri (tergantung penggeserannya) data akan dirotasikan. Perhatikan program alternatif selengkapnya berikut ini... 1: 2: 3: 4: 5: 6: 7:. ‘berkas LED04.BAS $regfile = "m16def.dat" $crystal = 11059200. 8: 9: 10: 11: 12: 13: 14:. Data_led = 1. Config Portb = Output Port_led Alias Portb Dim Data_led As Byte. Do Port_led = Data_led Waitms 50 Rotate Data_led , Left , 1 Loop. Hal. 23.

(27) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra ROTATE DATA_LED, LEFT, 1 (baris 13) artinya menggeser-putar (merotasi) data di variabel DATA_LED ke kiri (LEFT) sebanyak 1 bit.. 2.6.. Latihan-5: Animasi LED Lainnya. Nach sekarang apa yang dilakukan program berikut ini, perhatikan penggunaan FOR..NEXT (pada baris 13-17 dan baris 19-23) untuk melakukan pengulangan secara spesifik beberapa kali (lihat kembali penjelasan di Bagian-1 handout ini tentang FOR...NEXT).... 1: ‘berkas LED05.BAS 2: $regfile = "m16def.dat" 3: $crystal = 11059200 4: 5: Config Portb = Output 6: Port_led Alias Portb 7: Dim Data_led As Byte , X As Byte 8: 9: Data_led = &B00000011 10: 11: Do 12: 13: For X = 1 To 6 14: Port_led = Data_led 15: Waitms 50 16: Rotate Data_led , Left , 1 17: Next X 18: 19: For X = 1 To 6 20: Port_led = Data_led 21: Waitms 50 22: Rotate Data_led , Right , 1 23: Next X 24: 25: Loop. 2.7.. Latihan-6: Penerjemahan Penekanan PushButton pada Tampilan LED. Kali ini kita akan melakukan latihan dengan memanfaatkan pushbutton dan LED menggunakan rangkaian yang ditunjukkan pada Gambar 2.2. Perhatikan untuk rangkaian LED-nya sama seperti Gambar 2.1. Untuk rangkaian tombol-tekan atau pushbutton digunakan konfigurasi Aktif Rendah, artinya saat tombol tidak ditekan, PIN yang bersangkutan akan bernilai HIGH atau 1 dan saat ditekan akan terbaca logika LOW atau 0, karena terhubung semuanya dengan GND. Program pada Latihan ini akan digunakan untuk menerjemahkan penekanan tombol, dengan ketentuan sebagai berikut (baris 20-25 pada program): Jika ditekan tombol pada PORTD.0 (port D pin 0) atau PORTD terbaca &B11111110 atau &HFE, maka separo pertama dari LED akan dinyalakan dengan memberikan nilai &B00001111 atau &H0F pada PORTB; Jika ditekan tombol pada PORTD.1 (port d pin 1) atau PORTD terbaca &B11111101 atau &HFD, maka separo kedua dari LED akan dinyalakan, dengan memberikan nilai &B11110000 atau &HF0 pada PORTB; Jika ditekan tombol pada PORTD.2 (port d pin 2) atau PORTD terbaca &B11111011 atau &HFB, maka LED 0, 2, 4 dan 6 akan dinyalakan, dengan memberikan nilai &B01010101 atau &H55 pada PORTB;. Hal. 24.

(28) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Jika ditekan tombol pada PORTD.3 (port d pin 3) atau PORTD terbaca &B11110111 atau &HF7, maka LED 1, 3, 5 dan 7 akan dinyalakan, dengan memberikan nilai &B10101010 atau &HAA pada PORTB;. Gambar 2.2. Sama seperti Gambar 2.1 Program selengkapnya, perhatikan perintah SELECT-CASE yang digunakan untuk menerjemahkan arti dari masing-masing penekanan tombol sebagaimana telah dijelaskan sebelumnya: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:. ' program PUSH01.BAS ' $regfile = "m16def.dat" $crystal = 11059200 Dim X As Byte Config Portb = Output Config Portd = Input Hasil Alias Portb Masukan Alias Pind Portd = 255 ' menghidupkan LED berdasar penekanan push button di PORTD Do X = Masukan Select Case X Case &B11111011 : Hasil = &B01010101 Case &B11110111 : Hasil = &B10101010 End Select Loop. Hal. 25. ' pushbuton di portd.2 ' pushbuton di portd.3.

(29) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra. 2.8.. Latihan-7: Pushbutton dan Animasi LED. Masih menggunakan rangkaian seperti ditunjukkan pada Gambar 2.2, kali ini digunakan 2 (dua) tombol untuk mengubah arah animasi LED yang terpasang pada PORTB, silahkan mencermati dan memahami program selengkapnya berikut ini... ' program PUSH02.BAS ' $regfile = "m16def.dat" $crystal = 11059200 Dim X As Byte , Animasi As Byte , Status As Bit Config Portb = Output Config Portd = Input Hasil Alias Portb Masukan Alias Pind Portd = 255 Animasi = &H01 ' animasi LED berdasar penekanan push button di PORTD Do X = Masukan Select Case X Case &B11111011 : Status = 0 Case &B11110111 : Status = 1 End Select. ' pushbuton di portd.2 ' pushbuton di portd.3. If Status = 0 Then Rotate Animasi , Left Else Rotate Animasi , Right End If Hasil = Animasi Waitms 200 Loop. Jika Anda jeli, program ini akan menampilkan animasi LED berdasar penekanan tombol atau pushbutton pada PORTD.2 atau PORTD.3. - Selesai Modul 2 -. Hal. 26.

(30) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra. Modul-3: Timer, Counter dan PWM 3.1.. Pendahuluan Timer dan Counter. Mikrokontroler AVR ATMega16 (juga seri lainnya) memiliki tiga macam timer/counter (pewaktu/pencacah), yaitu Timer0, Timer1 dan Timer2: Timer0 dan Timer2 merupakan timer 8-bit (bisa mencacah dari 0 sampai dengan 255); Timer1 merupakan timer 16-bit (bisa mencacah dari 0 sampai dengna 65535). Sifat dasar dari timer/counter ini sama seperti RAM yang bisa dibaca dan diulisi, namun menawarkan fasilitas yang lebih dari sekedar baca/tulis: Timer melakukan pencacahan bisa secara otomatis (makanya disebut sebagai pewaktu). Cukup Anda berikan perintah untuk mengaktifkan (START TIMERn) atau menghentikan (STOP TIMERn), jika melibatkan interupsi bisa digunakan instruksi ENABLE TIMERn atau DISABLE TIMERn (n diganti angka 0, 1 atau 2); Anda tidak perlu setiap saat memeriksa apakah pencacahan sudah overflow (berlebihan) atau kejadian saat timer mencapai nilai maksimum, diberikan clock dan kembali menjadi nol lagi (atau nilai apa saja yang kita inginkan – reload value), karena masing-masing timer dilengkapi interupsi yang aktif saat terjadi overflow; Sumber detak ke timer bisa diperoleh secara internal (sebagai pewaktu) maupun eksternal (sebagai pencacah), masing-masing menggunakan instruksi CONFIG TIMERn = TIMER atau CONFIG TIMERn = COUNTER; Saat diberikan detak dari osilator internal bisa dipilih laju detak-nya sesuai dengan RC atau Crystal atau bahkan lebih lambat dengan cara membagi detak atau clock dengan angka 8, 64, 256 atau 1024 (angka-angka ini dinamakan sebagai prescaler). Misalnya, jika PRESCALE = 64, menggunakan frekuensi krsital 8MHz akan diperoleh (8.000.000/64) 125.000 clock per detik-nya, atau jika PRESCALE = 1024 akan diperoleh (8.000.000/1024) 7.812 clock per detik. Timer tidak harus melakukan pencacahan dari nol, Anda bisa memberikan nilai awal yang bukan nol, yang dikenal dengan nilai reload.. 3.2.. Tentang Timer0 dan Timer2. Pada Gambar 3.1 ditunjukkan diagram blok dari Timer0/Timer2 dengan lebar 8-bit (angka n pada gambar tersebut diganti dengan angka 0 atau 1, misalnya TCCRn menjadi TCCR0, dan seterusnya). Sebagaimana ditunjukkan pada Gambar 3.1 dan diperjelas dalam Gambar 3.2, masukan detak atau clock untuk Timer0 bisa diperoleh dari internal, melalui jalur Prescaler, atau eksternal, melalui jalur T0 yang harus melalui Edge Detector terlebih dahulu, yaitu sebuah unit yang bisa mendeteksi pulsa detak atau clock saat FALLING (1 ke 0) atau RISING (0 ke 1). Selanjutnya sinyal CLKT0 atau CLKT2 (baik dari internal maupun eksternal) ini diumpankan ke Control Logic. Control Logic inilah yang kemudian memberikan instruksi operasional ke Timer0/Timer2, apakah akan memberikan detak (count) menaikkan atau menurunkan isi (direction) dari register Timer0/Timer2 yaitu TCNT0/TCNT2, membersihkan isinya (clear). Jika TCNT0/TCNT2 sudah mencapai 0x00, maka akan diberikan sinya BOTTOM, sebaliknya, jika TCNT0/TCNT2 mencapai nilai maksimum, 0xFF, atau nilai tertentu, maka akan diberikan sinyal TOP ke Control Logic.. Hal. 27.

(31) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra. Gambar 3.1. Diagram blok Pewaktu/Pencacah 8-bit Pada saat TCNT0/TCNT2 = OCR0/OCR2 maka juga akan berikan sinyal TOP untuk memberitahukan bahwa pencacahan Timer0 sudah mencapai angka tertentu, dan tentu saja bisa memberikan interupsi yang terkait, yaitu OCF0/OCF2. Demikian juga, jika terjadi overflow (saat terjadinya limpahan karena nilai Timer0 yang sudah maksimal di-clock menjadi kembali nol lagi), maka diangkitkan interupsi overflow melalui TOV0/TOV2.. 3.3.. Timer0, Timer2 dan BASCOM AVR. Sebelum Anda gunakan, lakukan inisialisasi pada Timer0/Timer2 terlebih dahulu. Inisialisasi tersebut bisa dilakukan dengan instruksi-instruksi BASCOM AVR sebagai berikut: CONFIG CONFIG. TIMERn = TIMER, PRESCALE= 1|8|64|256|1024. TIMERn = COUNTER, PRESCALE= 1|8|64|256|1024, EDGE=RISING/FALLING, CLEAR TIMER = 1|0. Gambar 3.2. Diagram blok unit Pencacah 8-bit. Hal. 28.

(32) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Penjelasan CONFIG TIMERn = TIMER, artinya Timer0/Timer2 mendapatkan sumber detak atau clock secara internal: o PRESCALE= 1|8|64|256|1024, artinya sumber detak internal tersebut mo dibagi berapa? 1, 8, 64, 256 atau 1024 untuk mendapatkan sumber detak yang lebih lambat. CONFIG TIMERn = COUNTER, artinya Timer0/Timer2 mendapatkan sumber clock-nya dari eksternal (melalui pin T0): o EDGE=RISING/FALLING, kapan dilakukan aksi detak, apakah saat RISING, yaitu dari 0 ke 1, atau saat FALLING, yaitu dari 1 ke 0; o PRESCALE= 1|8|64|256|1024, sama penjelasannya... o CLEAR TIMER = 1|0, digunakan untuk memilih. 3.4.. Tentang Timer1. Timer1 merupakan pewaktu 16-bit, diagram blok-nya ditunjukkan pada Gambar 3.3, dan jika diperhatikan, fasilitas atau fitur-nya lebih lengkap dibandingkan Timer0 atau Timer2. Fitur tambahan tersebut antara lain, Timer1 memiliki 2 (dua) buah pembanding OCR1A dan OCR1B, yang masingmasing bisa mengaktifkan interupsi OC1A dan OC1B.. Gambar 3.3. Diagram blok Pewaktu/Pencacah 16-bit. Hal. 29.

(33) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Sumber detak-nya sama seperti Timer0 dan Timer2, bisa dari dalam (internal), dari dalam dengan dibagi prescaler atau dari luar melalui pin T1. Detilnya ditunjukkan pada Gambar 3.4. Perhatikan bahwa register timernya terbagi atas TCNT1H dan TCNT1L yang masing-masing panjangnya 8-bit, total 16-bit.. Gambar 3.4. Diagram blok Unit Pencacah 16-bit. 3.5.. Latihan-1: Menggunakan Timer1. Kali ini kita akan membuat sebuah jam digital yang ditampilkan melalui 2x7segmen menggunakan rangkaian yang ditunjukkan pada Gambar 3.5 (format Proteus 7.4 SP3). 7segmen yang digunakan sudah terpadu dengan IC BCD to 7Segmen, sehingga jika masukan BCD adalah 0 sampai dengan 9, maka keluarnya tampilan 7segmen juga 0 sampai dengan 9, sungguh mudah dan menyenangkan. Anda bisa membeli IC 74LS47 (CA) atau 74LS48 (CC) untuk mengkonversi data BCD menjadi datadata untuk 7-segmen, sebagaimana diagram pin untuk ditunjukkan pada Gambar 3.6.. Gambar 3.5. Rangkaian jam digital menggunakan ATMega16. Hal. 30.

(34) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra. Gambar 3.6. 74LS47 (kiri) dan 74LS48 (kanan) Karena hanya menggunakan dua digit, selama program berjalan pada ATMega16 hanya ditampilkan detik-nya saja, untuk menampilkan menit dan jam masing-masing bisa menggunakan tombol MENIT dan JAM (perhatikan Gambar 3.3), yang masing-masing terhubungkan ke PORTD.0 dan PORTD.1. Sedangkan untuk mereset jam, bisa digunakan tombol RESET JAM yang terhubungkan ke PORTD.7. Okey, mari kita mulai langkah demi langkah... Seperti biasanya, diawali dengan mendeklarasikan pustaka, kristal dan 5 variabel yang akan digunakan dalam program kita (baris 6 sampai dengan 10), antara lain: TEMP digunakan untuk menyimpan data jam, menit atau detik sementara; SECONDS, sudah jelas digunakan untuk menyimpan data detik; MINUTES, untuk menyimpan data menit; HOURS, untuk menyimpan data jam, dan KEYS, untuk pembacaan PORTD, apakah ada tombol yang ditekan, sehingga program bisa melakukan proses sesuai dengan tombol yang ditekan. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:. ' program jam.bas ' $regfile = "m16def.dat" $crystal = 11059200 Dim Dim Dim Dim Dim. Temp As Byte Seconds As Byte Minutes As Byte Hours As Byte Keys As Byte. Selanjutnya kita tetapkan sebuah konstanta untuk melakukan penundaan 1 detik tepat! Konstanta ini merupakan nilai pembanding yang nantinya disimpan pada OCR1H dan OCR1L, sehingga saat Timer1, yaitu TCNT1H dan TCNT1L, sama isinya masing-masing dengan OCR1H dan OCR1L, maka akan terjadi interupsi MATCH COMPARE. Untuk mendapatkan nilai konstanta ini, silahkan gunakan program AvrTimer1Calc.EXE, kemudian masukkan parameter-parameter seperti ditunjukkan pada Gambar 3.7, yaitu ditemukan nilai isi ulangnya adalah 34.288, supaya terjadi 31.250 detak yang setara dengan 1 detik. Nilai 34.288 ini yang kemudian dituliskan dalam program (baris 12), kemudian diikuti dengan mendeklarasikan fungsi dari timer1 sebagai pewaktu (TIMER) dengan prescaler sebesar 256 (baris 14). Sedangkan dua register untuk pembanding, yaitu OCR1H dan OCR1L masing-masing diisi dengan bagian HIGH dan LOW dari konstanta RELOAD (=34.288), perhatikan baris 16 dan 17:. Hal. 31.

(35) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra 12: 13: 14: 15: 16: 17: 18:. Const Reload = 34286. 'periode 1 detik. Config Timer1 = Timer , Prescale = 256 Ocr1ah = High(reload) Ocr1al = Low(reload). ' nilai reload utk timer1. Langkah selanjutnya adalah mengatur agar terjadi interupsi karena proses pembandingan (telah terjadi kecocokan data antara isi Timer1 TCNT1 dengan data pembanding OCR1AH dan OCR1AL). Untuk itu kita perlu mengatur isi register Timer/Counter1 Control atau TCCR1A, sebagaimana ditunjukkan pada Gambar 3.8.. Gambar 3.7. Program AVR Timer1 Calculator. Gambar 3.8. Register TCCR1A Arti dari masing-masing bit TCCR1A (Gambar 3.8) sebagai berikut: Bit 7:6 – COM1A1:0: Compare Output Mode for Channel A Bit 5:4 – COM1B1:0: Compare Output Mode for Channel B o Masing-masing pasangan bit ini (bit 7-6 dan bit 5-4) digunakan untuk mengatur pin OC1A dan OC1B melalui Tabel 4.1 Bit 3 – FOC1A: Force Output Compare for Channel A Bit 2 – FOC1B: Force Output Compare for Channel B o Untuk memaksa terjadinya Compare Match pada masing-masing kanal (A atau B) dengan cara memberikan logika 1 pada masing-masing tersebut. Bit 1:0 – WGM11:0: Waveform Generation Mode. Hal. 32.

(36) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra o. Mengontrol sekuens pencacahan pada pencacah, sebagaimana ditunjukkan pada Tabel 4.2 Tabel 4.1. Compare Output Mode, Non PWM. COM1A1/ COM1B1 0 0 1 1. COM1A0/ COM1B0 0 1 0 1. Keterangan Operasi port normal, OC1A/OC1B tidak dihubungkan ke pin PD4 dan PD5 Togel OC1A/OC1B pada saat terjadi Compare Match Reset OC1A/OC1B pada saat terjadi Compare Match Set OC1A/OC1B pada saat terjadi Compare Match. Tabel 4.2. Waveform Generation Mode Bit Description. Dalam kasus kita, register TCCR1A kita isi dengan nol, kemudian kita cek juga TCCR1B sebagaimana ditunjukkan pada Gambar 3.9.. Gambar 3.9. Register TCCR1B Arti dari masing-masing bit TCCR1B sebagai berikut: Bit 7 – ICNC1: Input Capture Noise Canceler o Untuk aktivasi masukan Capture Noise Canceler atau CNC. Bit 6 – ICES1: Input Capture Edge Select o Untuk memilih masukan Capture Edge Select jenis falling (0) atau rising (1).. Hal. 33.

(37) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Bit 5 – Reserved Bit o Cadangan, tidak digunakan sementara, untuk pengembangan ATMega16 di masa mendatang. Bit 4:3 – WGM13:2: Waveform Generation Mode o Lihat Tabel 4.2 Bit 2:0 – CS12:0: Clock Select o Lihat Tabel 4.3 Tabel 4.3. Clock Select Bit Description. Dalam kasus latihan ini, kita set TCCR1B.3 pada bagian WGM12-nya supaya Timer1 akan mereset setelah terjadi Compare Match, perhatikan baris 19 dan 20: 19: 20: 21:. Tccr1a = 0 Set Tccr1b.3. ' diskonek OC1A dari T/C1 ' reset T/C1 setelah compare. Selanjutnya masing-masing PORTA dan PORTD juga kita inisialisasi masing-masing sebagai luaran dan masukan, juga menyiapkan PORTD untuk masukan (baris 24): 22: 23: 24: 25:. Config Porta = Output Config Portd = Input Portd = 255. ' porta untuk tampilan ' portd untuk tombol ' semua luaran HIGH. Agar setiap terjadi interupsi Compare Match pada Timer1 dilakukan proses pada bagian tertentu di dalam program maka kita definisikan sebuah label TIMER1_ISR: 26: 27:. On Compare1a Timer1_isr. Okey, sekarang kita aktifkan interupsi pembandingnya (baris 26) dan interupsi global-nya (baris 27), perlu diketahui bahwa interupsi adalah sebuah proses yang menunda program yang sedang berjalan untuk mengerjakan sesuatu yang begitu penting, kemudian setelah selesai akan kembali mengerjakan pekerjaan yang sebelumnya ditinggalkan: 28: 29: 30:. Enable Compare1a Enable Interrupts. ' aktifkan interupsi timer compare ' aktifkan seluruh interupsi. Hal. 34.

(38) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra. Sampai disini sekarang semua sudah siap, sudah ready! Selanjutnya adalah membuat program untuk rutinitas jam digital sebagaimana kita rencanakan. Intinya adalah selalu menampilkan detik (baris 50) sambil terus menerus memeriksa tombol pada PORTD (baris 32), apakah ditekan tombol RESET, berarti mereset jam, menit dan detik (baris 33 sampai dengan 37), atau tombol JAM, artinya ditampilkan data jam (baris 48), atau tombol MENIT, artinya ditampilkan tombol menit (baris 49). Serta tidak lupa untuk selalu meng-update data-data detik (baris 38 sampai dengan 41), menit (baris 42 sampai dengan 45)dan jam (baris 46): 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:. Do Keys = Pind If Keys = &H7F Then ' reset jam Seconds = 0 Minutes = 0 Hours = 0 End If If Seconds = 60 Then ' jika detik sudah overflow Seconds = 0 Incr Minutes End If If Minutes = 60 Then ' jika menit sudah overflow Minutes = 0 Incr Hours End If If Hours = 24 Then Hours = 0 Temp = Makebcd(seconds) If Keys = &HFE Then Temp = Makebcd(minutes) If Keys = &HFD Then Temp = Makebcd(hours) ‘ tampilkan jam Porta = Temp Loop End. Ingat bahwa interupsi Timer1 karena Compare Match terjadi setiap 1 detik sekali (tepat!) dan yang dilakukan adalah (selalu) menaikkan data detik atau SECONDS: 54: 55: 56:. Timer1_isr: Incr Seconds Return. Program selengkapnya (file TIMER3.BAS) sebagai berikut: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:. ' program jam.bas ' $regfile = "m16def.dat" $crystal = 11059200 Dim Dim Dim Dim Dim. Temp As Byte Seconds As Byte Minutes As Byte Hours As Byte Keys As Byte. Const Reload = 34286. ' periode 1 detik. Config Timer1 = Timer , Prescale = 256. Hal. 35.

(39) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57:. Ocr1ah = High(reload) Ocr1al = Low(reload). ' nilai reload utk timer1. Tccr1a = 0 Set Tccr1b.3. ' diskonek OC1A dari T/C1 ' reset T/C1 setelah compare. Config Porta = Output Config Portd = Input Portd = 255. ' porta untuk tampilan ' portd untuk tombol ' semua luaran HIGH. On Compare1a Timer1_isr. ' lompat ke timer1_isr saat interupsi. Enable Compare1a Enable Interrupts. ' aktifkan interupsi timer compare ' aktifkan seluruh interupsi. Do Keys = Pind If Keys = &H7F Then ' reset jam Seconds = 0 Minutes = 0 Hours = 0 End If If Seconds = 60 Then ' jika detik sudah overflow Seconds = 0 Incr Minutes End If If Minutes = 60 Then ' jika menit sudah overflow Minutes = 0 Incr Hours End If If Hours = 24 Then Hours = 0 Temp = Makebcd(seconds) If Keys = &HFE Then Temp = Makebcd(minutes) ' tampilkan menit If Keys = &HFD Then Temp = Makebcd(hours) ' tampilkan jam Porta = Temp Loop End Timer1_isr: Incr Seconds Return. 3.6.. Latihan-2: Menggunakan Timer0. Kali ini kita akan berlatih menggunakan Timer0 untuk melakukan penundaan selama 50 milidetik. Keterangan tentang Timer0 sebagaimana telah dijelaskan di awal modul. Gunakan rangkaian Proteus 7.4 SP3 untuk melakukan percobaan, sebagaimana ditunjukkan pada Gambar 3.10. Rangkaian (Gambar 3.10) ini sangat sederhana, karena intinya hanya dilihat hasil luaran pada PORTB.0 atau PB0, perhatikan catatan pada Gambar 3.10 tersebut. Jangan lupa untuk melakukan setingan kristal pada jendela yang ditunjukkan pada Gambar 3.11, pada pilihan CKSEL Fuses dipilih Int. RC 4 MHz. Baiklah, seperti biasa, program diawali dengan deklarasi pustaka ATMega16 dan kristal yang digunakan (yaitu 4 MHz, bukan 8 MHz). Kemudian dilanjutkan dengan menuliskan konstanta reloadnya agar diperoleh penundaan 50 milidetik atau dengan kata lain, terjadi overflow (bukan Compare Match) setiap 50 milidetik.. Hal. 36.

(40) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Untuk menghitung konstanta reload, gunakan program AvrTimer0Calc.exe, kemudian isikan frekuensi kristal 4.000.000 Hz dan periode Timer0-nya adalah 50 milidetik atau yang mendekati, contoh pengaturan ditunjukkan pada Gambar 3.12. Ditemukan nilai 195 clock agar terjadi delay atau penundaan 50 milidetik atau mendekati 50 milidetik (49.92 milidetik), atau dengan kata lain, nilai reload kita isi 61 (baris 6), perhatikan Gambar 3.12.. Gambar 3.10. Rangkaian untuk Latihan Timer0. Gambar 3.11. Edit Component. Hal. 37.

(41) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra. Gambar 3.12. Program AVR Timer0 Calculator Tidak lupa juga mendefinisikan operasional Timer0 sebagai pewaktu dengan prescaler sebesar 1024 (baris 8): 1: 2: 3: 4: 5: 6: 7: 8: 9:. ' program kedipan.bas ' $regfile = "m16def.dat" $crystal = 11059200 Const Reload = 61. ' reload untuk 50ms. Config Timer0 = Timer , Prescale = 1024. Langkah berikutnya adalah memberitahukan bahwa jika terjadi interupsi Timer0, yang dikerjakan adalah mulai label TIMER0_ISR (baris 10), diikuti dengan mendefinisikan PORTB sebagai luaran (baris 12), mengaktifkan interupsi overflow Timer0 (baris 14) dan mengaktifkan interupsi global (baris 15): 10: 11: 12: 13: 14: 15: 16:. On Timer0 Timer0_isr. ' timer0 overflow interrupt. Config Portb = Output Enable Timer0 Enable Interrupts. Selanjutnya program tidak melakukan apapun (baris 17 – 19). Jika terjadi interupsi Timer0, karena sudah terjadi 195 kali clock atau setara dengan penundaan 50 milidetik, akan dikerjakan interupsi yaitu melompat ke label TIMER0_ISR atau baris 23, dan seterusnya, yang diawali dengan mengisi ulang TIMER0 dengan nilai reload (baris 24) dan PORTB.0 akan berlogika “1” dan “0” secara bergantian, menggunakan instruksi TOGGLE.. Hal. 38.

(42) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:. 3.7.. Do NOP Loop End Timer0_isr: Load Timer0 , Reload Portb.0 = Not Pinb.0 Return. ' isi kembali timer0 dg reload ' togel. Latihan-3: Menggunakan Counter0. Kali ini interupsi Timer0 akan terjadi pada saat dilakukan 5 kali penekanan tombol, dengan demikian Timer0 kita konfigurasi menjadi COUNTER (baris 9) dan pendeteksian clok-nya pada saat 1 ke 0 atau FALLING (baris 9) dan jangan lupa, isi dulu TIMER0 atau TCNT0 dengan nilai 5 (atau dalam hal ini disimpan dalam variabel TICKS, perhatikan baris 10 dan 6): 1: ' program counter0.bas 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Const Ticks = 5 7: Dim Count As Byte 8: 9: Config Timer0 = Counter , Edge = Falling 10: Load Timer0 , Ticks 11: 12: On Timer0 Timer0_isr 13: Jangan lupa juga mengarahkan interupsi (overflow) Timer0 ke TIMER0_ISR (baris 12), sebagaimana ditunjukkan pada baris 24-27: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:. Config Portc = Output Reset Ddrb.0 ' portb sebagai masukan cacah pulsa Enable Timer0 Enable Interrupts Do Portc = Count Loop Timer0_isr: ' lakukan interupsi jika 5 kali cacah Load Timer0 , Ticks Incr Count Return. PORTC didefinisikan sebagai luaran (baris 14), PB0 digunakan sebagai masukan tombol sehingga DDRB.0-nya diberi logika nol (atau sebagai luaran, baris 15). PORTC selalu menampilkan isi dari variabel COUNT, yaitu nilainya akan selalu naik setiap 5 kali penekanan tombol pada PB0 atau sebagai masukan detak ke Timer0 atau T0.. Hal. 39.

(43) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Rangkaian yang digunakan pada latihan ini dtiunjukkan pada Gambar 3.13 menggunakan Proteus 7.4 SP3.. Gambar 3.13. Rangkaian untuk Latihan Counter0 Program selengkapnya: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:. ' program counter0.bas ' $regfile = "m16def.dat" $crystal = 11059200 Const Ticks = 5 Dim Count As Byte Config Timer0 = Counter , Edge = Falling Load Timer0 , Ticks On Timer0 Timer0_isr Config Portc = Output Reset Ddrb.0. ' portb sebagai masukan cacah pulsa. Enable Timer0 Enable Interrupts Do Portc = Count Loop Timer0_isr: Load Timer0 , Ticks Incr Count. ' lakukan interupsi jika 5 kali cacah. Hal. 40.

(44) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra 27:. 3.8.. Return. Latihan-4: Menggunakan Fasilitas Capture pada Timer1. Fasilitas capture pada Timer1 memberikan fasilitas kepada kita untuk selalu bisa mengetahu nilai pewaktu atau pencacah melalui register ICRn (perhatikan Gambar 3.3, karena menggunakan Timer1 maka nama registernya adalah ICR1, karena 16-bit dan akan ditampilkan melalui PORTC yang 8 bit, maka hanya digunakan separo yang bawah atau ICR1L). Rangkaian yang digunakan ditunjukkan pada Gambar 3.14. perhatikan bahwa masukan clock melalui T1 atau PB1 sedangkan masukan aktivasi capture melalui ICP1 atau PD6. Program selengkapnya: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:. ' program capture1.bas ' $regfile = "m16def.dat" $crystal = 110592 Config Timer1 = Counter , Edge = Falling , Noise Cancel = 1 , Capture Edge = Rising Config Portc = Output Config Pinb.1 = Input. ' portb.1 disambung dg portd.4 ' agar dicapture setiap tekan tombol. Do Portc = Icr1l Loop. ' tampilkan hasil counter di portc. End. Gambar 3.14. Latihan untuk Fasilitas Capture pada Timer1 Penjelasan program:. Hal. 41.

Gambar

Gambar 1.5. Diagram Pin Mikrokontroler AVR ATMega16 tipe SMD
Gambar 1.6. Diagram blok Mikrokontroler AVR ATMega16
Gambar 1.7. Diagram alir perancangan aplikasi berbasis mikrokontroler (apa saja)
Gambar 1.8. Alur pemrograman aplikasi mikrokontroler
+7

Referensi

Dokumen terkait