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 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 PenekananPushButton 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 danDirective Komunikasi Serial ........................................................ 55 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 danPushbutton ...................................................................... 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 I 2 C 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! Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 1 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 atauRAM (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. 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 dalamROM atau yang lebih dikenal dengan BIOS(Basic I/O System) pada saat awal dihidupkan, kemudian mengambil atau 1 Memori yang hanya bisa dibaca saja. 2 Memori yang bisa dibaca juga bisa ditulisi. Masukan- masukan sensor cahaya sensor suhu sensor tekanan, dll Pemroses uC AT89 uC AVR uC PIC16F, dll Luaran-luaran aktuator - motor relay speaker, dll Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 2 menjalankan program yang tersimpan dalam hard disk. Sedangkan mikrokontroler sejak awal menjalankan program yang tersimpan dalamROM internal-nya (bisa berupa Mask ROM atauFlash PEROM atauFlash 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 dalamchip 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 danControl 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 olehALU (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 atauRAM Memory bisa digunakan sebagai tempat penyimpan sementara, sedangkan SFR (Special Function Register) sebagian ada yang langsung berhubungan dengan I/O dari Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 3 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 atauCounter 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 istilahembedded system atauembedded controller; Terdedikasi untuk satu macam aplikasi saja (lihat contoh-contoh yang akan saya terangkan pada bagian lain dari buku ini); Hanya membutuhkan daya yang (cukup) rendah (low power) sekitar 50 mWatt (Anda bandingkan dengan komputer yang bisa mencapai 50 Watt lebih); Memiliki beberapa keluaran maupun masukan yang terdedikasi, untuk tujuan atau fungsi- fungsi khusus; Kecil dan relatif lebih murah (seri AT89 di pasaran serendah-rendahnya bisa mencapai Rp. 15.000,00, mikrokontroler AVR di pasaran saat ini juga relatif murah sedangkan Basic Stamp bisa mencapai Rp. 500.000,00); Seringkali tahan-banting, terutama untuk aplikasi-aplikasi yang berhubungan dengan mesin atau otomotif atau militer. Mikrokontroler yang beredar saat ini dibedakan menjadi dua macam, berdasarkan arsitekturnya: o Tipe CISC atau Complex Instruction Set Computing yang lebih kaya instruksi tetapi fasilitas internal secukupnya saja (seri AT89 memiliki 255 instruksi); o Tipe RISC atau Reduced Instruction Set Computing yang justru lebih kaya fasilitas internalnya tetapi jumlah instruksi secukupnya (seri PIC16F hanya ada sekitar 30-an instruksi). 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 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 4 Multiplier), mampu menyimpan program hingga 256 KBytes, dilengkapi EEPROM 4K Bytes dan SRAM 8K Bytes. AVR XMEGA Mikrokontroler AVR 8/16-bit XMEGA memiliki periferal baru dan canggih dengan unjuk- kerja, sistemEvent dan DMA yang ditingkatkan, serta merupakan pengembangan keluarga AVR untuk pasar low power danhigh 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 adalahtinyAVR danmegaAVR, 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 berpindah- pindah (walaupun tidak disarankan) antar mikrokontroler AVR gak masalah dan mudah! Beberapa mikrokontroler AVR memiliki SRAM, EEPROM, antarmuka SRAM eksternal, ADC, pengali perangkat keras, UART, USART dan lain sebagainya. Bayangkan saja Anda punya TinyAVR dan MegaAVR, kemudian telanjangi (maksudnya copotin) semua periferal-nya, nah Anda akan memiliki AVR Core yang sama! Kayak membuang semua isi hamburger, maka Anda akan mendapatkan rotinya doang yang sama 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 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 5 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 Inggris 3 ... 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... Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 6 High-performance, Low-power AVR8-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 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 7 Power Consumption @ 1 MHz, 3V, and 25C 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 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 8 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 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 9 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 Masukan tegangan catu daya GND Ground, emang apalagi kalau bukan ground... PortA (PA7..PA0) Port A berfungsi sebagai masukan analog ke ADC internal pada mikrokontroler ATMega16, selain itu juga berfungsi sebagai port I/O dwi-arah 8-bit, jika ADC-nya tidak digunakan. Masing-masing pin menyediakan resistor pull-up internal 4 yang bisa diaktifkan untuk masing-masing bit. PortB(PB7..PB0) Port B berfungsi sebagai sebagai port I/O dwi-arah 8-bit.Masing-masing pin menyediakan resistor pull-up internal yang bisa diaktifkan untuk masing-masing bit. Port B juga memiliki berbagai macam fungsi alternatif, sebagaimana ditunjukkan pada Tabel 1.1 PortC(PC7..PC0) Port Cberfungsi 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 PortD(PD7..PD0) Port D berfungsi sebagai sebagai port I/O dwi-arah 8-bit.Masing-masing pin menyediakan resistor pull-up internal yang bisa diaktifkan untuk masing-masing bit. Port D juga memiliki berbagai macam fungsi alternatif, sebagaimana ditunjukkan pada Tabel 1.3 /RESET Masukan Reset. Level rendah pada pin ini selama lebih dari lama waktu minimum yang ditentukan akan menyebabkan reset, walaupunclock tidak dijalankan. XTAL1 Masukan ke penguat osilator terbalik (inverting) dan masukan ke rangkaianclock internal. XTAL2 Luaran dari penguat osilator terbalik AVCC Merupakan masukantegangancatu daya untuk Port A sebagai ADC, biasanya dihubungkan ke Vcc, walaupun ADC-nya tidak digunakan. Jika ADC digunakan sebaiknya dihubungkan ke Vcc melalui tapis lolos-bawah (low-pass filter). AREF Merupakan tegangan referensi untuk ADC 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. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 10 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. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 11 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 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 12 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 87segmen? 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. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 13 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 penggunaanya 5 . 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 prinsipworst 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! Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 14 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 Ukuran (Byte) JangkauanData Bit 1/8 0 atau 1 Byte 1 0 s/d 255 Integer 2 -32768 s/d 3.767 Word 2 0 s/d 65535 Long 4 -2147483648 s/d 2147483647 Single 4 1,5 x 10 -45 s/d 3,4 x 10 38 Double 8 5 x 10 -324 s/d 1,7 x 10 308 String s/d 254 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 : Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 15 1. Dengan pernyataan DIM Deklarasi ini dibuat dengan perintahDIM (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 =untuk tipe data integer, DEFBIT =untuk tipe data bit, DEFBYTE =untuk tipe data byte, DEFWORD =untuk tipe data word, DEFLNG =untuk tipe data long, DEFSNG =untuk tipe data singel, DEFDBL =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 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 16 Const pembagi = 23 1.8.4. Penulisan Bilangan Pada BASCOM-AVR, bilangan dapat ditulis dalam 3 bentuk : 1. Desimal ditulis biasa, contoh : 16 2. Biner diawali dengan &B, contoh : &B10001111 3. 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. Operator- operator BASCOM AVR ditunjjukkan pada Tabel 1.5, Tabel 1.6 dan Tabel 1.7. Tabel 1.5. Operator Aritmetik Operator Keterangan Contoh + Operasi penjumlahan A + B - Operasi pengurangan A B * Operasi perkalian A * B / Operasi pembagian A / B % Operasi sisa pembagian A %B Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 17 Tabel 1.6. Operator Relasional Operator Keterangan Contoh = Sama dengan A = B <> Tidak sama dengan A <> B > Lebih besar dari A > B < Lebih kecil dari A < B >= Lebih besar atau sama dengan A >= B <= Lebih kecil atau sama dengan A <= B Tabel 1.7. Operator Logika Operator Keterangan Contoh AND Operasi AND &B110 And &B101 = &B100 OR Operasi OR &B11001 Or &B10111 = &B11111 NOT Operasi NOT NOT &HFF = &HO XOR Operasi XOR &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 lebih dari 1 perintah <perintah 1> <perintah 2> ... End If B. IF - THEN ELSE Versi lengkap dari sebuah atau serangkaian instruksi akan dikerjakan jika memenuhi syarat- syarat 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 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 18 <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. Sintakspenulisannya : 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, carapenulisannya: While <kondisi> <perintah> ... Wend Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 19 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 perluRETURN. Contoh: Dim A As Byte Start: 'sebuah label diakhiri dengan : A = A + 1 'naikkan variabel A If A < 10 Then 'apakah lebih kecil 10? Goto Start 'ya, lakukan lagi End If 'akhir IF Print "Ready" 'ok C. EXIT Untuk keluar secara langsung dari perulangan DO-LOOP, FOR-NEXT, WHILE-WEND. Cara penulisannya sebagai berikut : EXIT FOR (keluar dari For-Next) EXIT DO (keluar dari Do-Loop) EXIT WHILE (keluar dari While-Wend) EXIT SUB (keluar dari Sub-Endsub) EXIT FUNCTION (keluar dari suatu fungsi) - selesai Modul 1 - Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 20 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 atauCC, artinya (seluruh Katoda LED digabung menjadi satu dan dihubungkan ke GND). Anda bisa saja membalik polaritas dari LED tersebut, sehingga menjadi konfigurasi CA atauCommon 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 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 21 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 Hz 1 . 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, makaPORTB 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: berkas LED01.BAS 2: $regfile = "m16def.dat" 3: $crystal = 11059200 4: 5: Config Portb = Output 6: Port_led Alias Portb 7: 8: Port_led = 255 9: 10: End 'end program 2.3. 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. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 22 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 diulang- ulang? 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, WAITMSmenggunakan satuan milidetik, WAITUSmenggunakan 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: berkas LED02.BAS 2: $regfile = "m16def.dat" 3: $crystal = 11059200 4: 5: Config Portb = Output 6: 7: Port_led Alias Portb 8: 9: Do 10: Port_led = 255 11: Waitms 300 12: Port_led = 0 13: Waitms 300 14: Loop 2.4. Latihan-3: Animasi LED 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: berkas LED03.BAS 2: $regfile = "m16def.dat" 3: $crystal = 11059200 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 23 4: 5: Config Portb = Output 6: 7: Port_led Alias Portb 8: 9: Do 10: Port_led = &B00000001 11: Waitms 300 12: Port_led = &B00000010 13: Waitms 300 14: Port_led = &B00000100 15: Waitms 300 16: Port_led = &B00001000 17: Waitms 300 18: Port_led = &B00010000 19: Waitms 300 20: Port_led = &B00100000 21: Waitms 300 22: Port_led = &B01000000 23: Waitms 300 24: Port_led = &B10000000 25: Waitms 300 26: Loop 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: berkas LED04.BAS 2: $regfile = "m16def.dat" 3: $crystal = 11059200 4: 5: Config Portb = Output 6: Port_led Alias Portb 7: Dim Data_led As Byte 8: Data_led = 1 9: 10: Do 11: Port_led = Data_led 12: Waitms 50 13: Rotate Data_led , Left , 1 14: Loop Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 24 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 tentangFOR...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 PenekananPushButton 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; Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 25 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 perintahSELECT-CASE yang digunakan untuk menerjemahkan arti dari masing-masing penekanan tombol sebagaimana telah dijelaskan sebelumnya: 1: ' program PUSH01.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Dim X As Byte 7: 8: Config Portb = Output 9: Config Portd = Input 10: Hasil Alias Portb 11: Masukan Alias Pind 12: 13: Portd = 255 14: 15: ' menghidupkan LED berdasar penekanan push button di PORTD 16: 17: Do 18: 19: X = Masukan 20: Select Case X 21: Case &B11111011 : Hasil = &B01010101 ' pushbuton di portd.2 22: Case &B11110111 : Hasil = &B10101010 ' pushbuton di portd.3 23: End Select 24: 25: Loop Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 26 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 ' pushbuton di portd.2 Case &B11110111 : Status = 1 ' pushbuton di portd.3 End Select 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 - Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 27 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 danTimer2 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, diberikanclock 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, jikaPRESCALE = 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) atauRISING (0 ke 1). Selanjutnya sinyal CLK T0 atauCLK T2 (baik dari internal maupun eksternal) ini diumpankan keControl 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 yaituTCNT0/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 keControl Logic. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 28 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 TIMERn = TIMER, PRESCALE= 1|8|64|256|1024 CONFIG TIMERn = COUNTER, PRESCALE= 1|8|64|256|1024, EDGE=RISING/FALLING, CLEAR TIMER = 1|0 Gambar 3.2. Diagram blok unit Pencacah 8-bit Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 29 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 masing- masing bisa mengaktifkan interupsi OC1A danOC1B. Gambar 3.3. Diagram blok Pewaktu/Pencacah 16-bit Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 30 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 IC74LS47 (CA) atau 74LS48 (CC) untuk mengkonversi data BCD menjadi data- data untuk 7-segmen, sebagaimana diagram pin untuk ditunjukkan pada Gambar 3.6. Gambar 3.5. Rangkaian jam digital menggunakan ATMega16 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 31 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 kePORTD.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: ' program jam.bas 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Dim Temp As Byte 7: Dim Seconds As Byte 8: Dim Minutes As Byte 9: Dim Hours As Byte 10: Dim Keys As Byte 11: 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 programAvrTimer1Calc.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, yaituOCR1H danOCR1L masing-masing diisi dengan bagianHIGH danLOW dari konstantaRELOAD (=34.288), perhatikan baris 16 dan 17: Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 32 12: Const Reload = 34286 'periode 1 detik 13: 14: Config Timer1 = Timer , Prescale = 256 15: 16: Ocr1ah = High(reload) 17: Ocr1al = Low(reload) ' nilai reload utk timer1 18: 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 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 33 o Mengontrol sekuens pencacahan pada pencacah, sebagaimana ditunjukkan pada Tabel 4.2 Tabel 4.1. Compare Output Mode, Non PWM COM1A1/ COM1B1 COM1A0/ COM1B0 Keterangan 0 0 Operasi port normal, OC1A/OC1B tidak dihubungkan ke pin PD4 dan PD5 0 1 Togel OC1A/OC1B pada saat terjadi Compare Match 1 0 Reset OC1A/OC1B pada saat terjadi Compare Match 1 1 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 masukanCapture Noise Canceler atau CNC. Bit 6 ICES1: Input Capture Edge Select o Untuk memilih masukanCapture Edge Select jenis falling (0) atau rising (1). Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 34 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: Tccr1a = 0 ' diskonek OC1A dari T/C1 20: Set Tccr1b.3 ' reset T/C1 setelah compare 21: Selanjutnya masing-masing PORTA dan PORTD juga kita inisialisasi masing-masing sebagai luaran dan masukan, juga menyiapkan PORTD untuk masukan (baris 24): 22: Config Porta = Output ' porta untuk tampilan 23: Config Portd = Input ' portd untuk tombol 24: Portd = 255 ' semua luaran HIGH 25: Agar setiap terjadi interupsi Compare Match pada Timer1 dilakukan proses pada bagian tertentu di dalam program maka kita definisikan sebuah label TIMER1_ISR: 26: On Compare1a Timer1_isr 27: 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: Enable Compare1a ' aktifkan interupsi timer compare 29: Enable Interrupts ' aktifkan seluruh interupsi 30: Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 35 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: Do 32: Keys = Pind 33: If Keys = &H7F Then ' reset jam 34: Seconds = 0 35: Minutes = 0 36: Hours = 0 37: End If 38: If Seconds = 60 Then ' jika detik sudah overflow 39: Seconds = 0 40: Incr Minutes 41: End If 42: If Minutes = 60 Then ' jika menit sudah overflow 43: Minutes = 0 44: Incr Hours 45: End If 46: If Hours = 24 Then Hours = 0 47: Temp = Makebcd(seconds) 48: If Keys = &HFE Then Temp = Makebcd(minutes) 49: If Keys = &HFD Then Temp = Makebcd(hours) tampilkan jam 50: Porta = Temp 51: Loop 52: 53: End Ingat bahwa interupsi Timer1 karena Compare Match terjadi setiap 1 detik sekali (tepat!) dan yang dilakukan adalah (selalu) menaikkan data detik atauSECONDS: 54: Timer1_isr: 55: Incr Seconds 56: Return Program selengkapnya (file TIMER3.BAS) sebagai berikut: 1: ' program jam.bas 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Dim Temp As Byte 7: Dim Seconds As Byte 8: Dim Minutes As Byte 9: Dim Hours As Byte 10: Dim Keys As Byte 11: 12: Const Reload = 34286 ' periode 1 detik 13: 14: Config Timer1 = Timer , Prescale = 256 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 36 15: 16: Ocr1ah = High(reload) 17: Ocr1al = Low(reload) ' nilai reload utk timer1 18: 19: Tccr1a = 0 ' diskonek OC1A dari T/C1 20: Set Tccr1b.3 ' reset T/C1 setelah compare 21: 22: Config Porta = Output ' porta untuk tampilan 23: Config Portd = Input ' portd untuk tombol 24: Portd = 255 ' semua luaran HIGH 25: 26: On Compare1a Timer1_isr ' lompat ke timer1_isr saat interupsi 27: 28: Enable Compare1a ' aktifkan interupsi timer compare 29: Enable Interrupts ' aktifkan seluruh interupsi 30: 31: Do 32: Keys = Pind 33: If Keys = &H7F Then ' reset jam 34: Seconds = 0 35: Minutes = 0 36: Hours = 0 37: End If 38: If Seconds = 60 Then ' jika detik sudah overflow 39: Seconds = 0 40: Incr Minutes 41: End If 42: If Minutes = 60 Then ' jika menit sudah overflow 43: Minutes = 0 44: Incr Hours 45: End If 46: If Hours = 24 Then Hours = 0 47: Temp = Makebcd(seconds) 48: If Keys = &HFE Then Temp = Makebcd(minutes) ' tampilkan menit 49: If Keys = &HFD Then Temp = Makebcd(hours) ' tampilkan jam 50: Porta = Temp 51: Loop 52: 53: End 54: 55: Timer1_isr: 56: Incr Seconds 57: 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 (yaitu4 MHz, bukan 8 MHz). Kemudian dilanjutkan dengan menuliskan konstanta reload- nya agar diperoleh penundaan 50 milidetik atau dengan kata lain, terjadi overflow (bukan Compare Match) setiap 50 milidetik. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 37 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 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 38 Gambar 3.12. Program AVR Timer0 Calculator Tidak lupa juga mendefinisikan operasional Timer0 sebagai pewaktu dengan prescaler sebesar 1024 (baris 8): 1: ' program kedipan.bas 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Const Reload = 61 ' reload untuk 50ms 7: 8: Config Timer0 = Timer , Prescale = 1024 9: 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: On Timer0 Timer0_isr ' timer0 overflow interrupt 11: 12: Config Portb = Output 13: 14: Enable Timer0 15: Enable Interrupts 16: 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. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 39 17: Do 18: NOP 19: Loop 20: 21: End 22: 23: Timer0_isr: 24: Load Timer0 , Reload ' isi kembali timer0 dg reload 25: Portb.0 = Not Pinb.0 ' togel 26: Return 3.7. 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: Config Portc = Output 15: Reset Ddrb.0 ' portb sebagai masukan cacah pulsa 16: 17: Enable Timer0 18: Enable Interrupts 19: 20: Do 21: Portc = Count 22: Loop 23: 24: Timer0_isr: ' lakukan interupsi jika 5 kali cacah 25: Load Timer0 , Ticks 26: Incr Count 27: 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. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 40 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: ' 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: 14: Config Portc = Output 15: Reset Ddrb.0 ' portb sebagai masukan cacah pulsa 16: 17: Enable Timer0 18: Enable Interrupts 19: 20: Do 21: Portc = Count 22: Loop 23: 24: Timer0_isr: ' lakukan interupsi jika 5 kali cacah 25: Load Timer0 , Ticks 26: Incr Count Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 41 27: Return 3.8. 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 adalahICR1, karena 16-bit dan akan ditampilkan melalui PORTC yang 8 bit, maka hanya digunakan separo yang bawah atauICR1L). Rangkaian yang digunakan ditunjukkan pada Gambar 3.14. perhatikan bahwa masukan clock melalui T1 atauPB1 sedangkan masukan aktivasi capture melalui ICP1 atauPD6. Program selengkapnya: 1: ' program capture1.bas 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 110592 5: 6: Config Timer1 = Counter , Edge = Falling , Noise Cancel = 1 , Capture Edge = Rising 7: 8: Config Portc = Output ' portb.1 disambung dg portd.4 9: Config Pinb.1 = Input ' agar dicapture setiap tekan tombol 10: 11: Do 12: Portc = Icr1l ' tampilkan hasil counter di portc 13: Loop 14: 15: End Gambar 3.14. Latihan untuk Fasilitas Capture pada Timer1 Penjelasan program: Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 42 Timer1 dikonfigurasi sebagai COUNTER, dengan masukan clock aktif pada saat transisi 1 ke 0 atauFALLING (baris 6). Noise canceller diaktifkan dengan instruksi NOISE CANCEL =1, dan capture terjadi pada saat transisi 1 ke 0 atauRISING (baris 7); Perhatian! Baris 6 dan 7 harus ditulis dalam satu baris! PORTC selalu menampilkan isi register ICR1L (baris 12-14). 3.9. Latihan-5: Tentang PWM (Pulse Width Modulation) Untuk mengendalikan kecerahan lampu LED atau kecepatan motor DC bisa dilakukan dengan menaikkan atau menurunkan tegangan, namun metode ini banyak kekurangannya, solusi yang baik adalah dengan menghidupkan dan mematikan secara cepat. Istilahnya dengan memberikan pulsa PWM atauPulse Width Modulation, perhatikan contoh-nya pada Gambar 3.15 sampai dengan 4.17. Gambar 3.15 Jika pulsa sebagaimana ditunjukkan pada Gambar 415 diberikan ke LED atau motor DC, maka LED cerah 50%atau kecepatan motornya 50%dari kecepatan maksimum. Dikatakan bahwa pulsaPWM sebagaimana ditunjukkan pada Gambar 3.15 memiliki duty cycle 50%, artinya lebar pulsa HIGH dan LOW-nya sama. Gambar 3.16 Sedangkan jika LED atau motor DC diberikan pulsa denganduty cycle 75%, sebagaimana ditunjukkan pada Gambar 3.16, maka kecerahan LED menjadi begitu juga dengan kecepatan Motor DC-nya. Contoh lain ditunjukkan pada Gambar 3.17 untuk duty cycle sebesar 25%, atau Motor DC-nya akan menurun kecepatannya hingga 25%dari kecepatan maksimum. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 43 Gambar 3.17 Pewaktu/pencacah AVR memiliki fasilitas mode kerja PWM, frekuensi-nya sama tetapi duty cycle-nya berbeda dan bisa diatur, perhatikan contoh-contoh pada gambar-gambar sebelumnya, semuanya memiliki periode 2 milidetik tetapi dengan duty cycle yang berbeda-beda (masing-masing 50%, 75% dan 25%). ATMega16 memiliki luaran PWM yang tersambung ke Timer1 melalui: OC1A atauPORTD.4, dan OC1B atauPORTD.5 Masing-masing luaran PWM tersebut memiliki pengaturan yang terpisah (masing-masingduty cycle- nya bisa berbeda) walaupun akan bekerja dengan frekuensi yang sama. Tiga mode PWM yang dibahas dalam modul ini adalah mode 8, 9 dan 10-bit: Dalam mode 8 bit, pencacah akan mencacah dari 0 ke 255 kemudian kembali turun lagi ke 0; Dalam mode 9 bit, pencacah akan mencacah dari 0 ke 511 kemudian kembali turun lagi ke 0; Dalam mode 10 bit, pencacah akan mencacah dari 0 ke 1023 kemudian kembali turun lagi ke 0; Perhatikan contoh atau ilustrasi mode 8 bit yang ditunjukkan pada Gambar 3.18. Kita harus menentukan sebuah titik antara 0 sampai dengan 255 yang nantinya digunakan untuk merubah luaran dari HIGH menjadi LOW. Jika nilainya, misalnya, kita 100, maka luaran OC1A yang melalui PORTD.5 akan berubah dari HIGH (logika 1) menjadi LOW (logika 0) sebagaimana ditunjukkan pada Gambar 3.19. Jika untuk OCR1B diberi nilai 10, maka perbandingan antara 100 pada OC1A dan 10 pada OC1B ditunjukkan pada Gambar 3.20. Gambar 3.18 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 44 Gambar 3.19 Perintah konfigurasi BASCOM AVR untuk mengatur OC1A dan OC1B sebagaimana dijelaskan sebelumnya adalah: Config Timer1 = Pwm, Pwm = 8, Compare A Pwm = Clear Up, Compare B Pwm = Clear up , Prescale = 1024 Compare1a = 100 Compare1b = 10 Rangkaian menggunakan Proteus 7.4 SP3 sebagaimana ditunjukkan pada Gambar 3.21, di sebelah kiri PIND.4 dan PIND.5 masing-masing dihubungkan denganchannel B dan A pada osiloskop. Gambar 3.20 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 45 Gambar 3.21. Rangkaian untuk latihan PWM Contoh program selengkapnya: 1: ' program pwm0.bas 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1024 7: 8: Compare1a = 100 9: Compare1b = 10 10: 11: Do 12: ' tidak melakukan apapun... 13: Loop Jika dijalankan menggunakan rangkaian sebenarnya akan tampak 1 LED berkedip-kedip (OC1A) dan yang satu bergetar redup (OC1B), sedangkan hasil osiloskop-nya ditunjukkan pada Gambar 3.22 (menggunakan Proteus 7.6 SP4). Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 46 Gambar 3.22 - Selesai Modul 3 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 47 Modul-4: Konsep Interupsi 4.1. Pendahuluan Interupsi Anda bisa membayangkan sebuah sistem elektronik yang selalu mengirimkan atau menampilkan data suhu per detik dan pada saat yang bersamaan melakukan kontrol pengadukan sebuah tangki, artinya proses atau kontrol utama pada sistem tersebut hanya melakukan pengadukan isi tangki dengan kecepatan yang bergantung pada data-data suhu. Setiap detik dilakukan pembacaan data suhu, kemudian ditampilkan pada layar LCD, misalnya, dan dijadikan acuan untuk menetapkan kecepatan pengadukan. Skenario tersebut membutuhkan mekanisme interupsi. Saat proses dilakukan secara normal, kemudian terjadi interupsi, program normal ditinggalkan terlebih dulu, mengerjakan rutin interupsi, kemudian kembali lagi mengerjakan program secara normal. Inilah konsep interupsi...! Mikrokontroler AVR memiliki 21 macam sumber interupsi yang terdiri dari 3 interupsi eksternal dan 18 interupsin internal, sebagaimana ditunjukkan pada Tabel 4.1. Manakah yang sesuai dengan kasus atau skenario yang saya tulis sebelumnya? Tabel 4.1. Daftar Sumber Interupsi Mikrokontroler AVR Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 48 Bagaimana, sudah ketemu jawabannya? Yup, gunakan interupsi Timer, TIMER0 OVF, TIMER1 OVF atauTIMER2 OVF. Okey mari kita pelajari konsep interupsi ini melalui latihan atau contoh program/rangkaian berikut ini... 4.2. Latihan-1: Interupsi Eksternal 0 dan 1 Latihan pertama ini akan mencoba menggunakan fasilitas Interupsi eksternal 0 dan 1, masing-masing terhubungkan ke PD2 dan PD3 (perhatikan kembali Gambar 1.4 dan 1.5), sedangkan rangkaian yang digunakan ditunjukkan pada Gambar 4.1 dan 4.2, pushbutton disambung langsung ke PORTD, delapan LED disambung ke PORTC. Gambar 4.1. Rangkaian untuk Latihan Interupsi 0 (INT0) dan 1 (INT1) Secara normal, program akan menyalakan LED secara berurutan (seperti animasi LED yang pernah dibahas pada Bagian-2. Jika terjadi interupsi eksternal 0 atau 1, maka akan ditampilkan pola tertentu pada LED yang terhubung dengan PORTC. Program selengkapnya sebagai berikut: 1: 'berkas INT_01.BAS 2: $regfile = "m16def.dat" 3: $crystal = 11059200 4: 5: On Int0 Label_int0 6: On Int1 Label_int1 7: 8: Port_led Alias Portb 9: 10: Config Int0 = Falling 11: Config Int1 = Falling 12: Config Portd = Input 13: Config Portb = Output 14: Portd = 255 15: Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 49 16: Enable Int0 17: Enable Int1 18: Enable Interrupts 19: 20: Do 21: Port_led = &B11111100 22: Waitms 500 23: Port_led = &B11110011 24: Waitms 500 25: Port_led = &B11001111 26: Waitms 500 27: Port_led = &B00111111 28: Waitms 500 29: Loop 30: 31: Label_int0: 32: Port_led = &B10101010 33: Bitwait Pind.2 , Set 34: Return 35: 36: Label_int1: 37: Port_led = &B01010101 38: Bitwait Pind.3 , Set 39: Return Penjelasan program: Seperti biasa, diawal program didekalrasikan dulu pustaka mikrokontroler dan frekuensi kristal yang digunakan (baris 2 dan 3); Instruksi berikutnya, karena menggunakan fasilitas interupsi eksternal 0 dan 1, adalah mendeklarasikan apa yang harus dilakukan jika terjadi interupsi 0 atau 1, pada baris 5 dan 6 diberikan instruksi (baris 5) On INT0 Label_int0, artinya jika terjadi interupsi eksternal 0 (INT0), maka program harus lompat ke label Label_int0; Nah untuk instruksi di baris 6 (On INT1 Label_int1) tentunya Anda sudah bisa memahami maksudnya, iya khan? Baris 8 merupakan deklarasi alias atau nama lain, sebagaimana telah dijelaskan dalam modul sebelumnya; Baris 10 dan 11 digunakan untuk mendefinisikan Interupsi eksternal 0 dan 1, kapan terjadi interupsi eksternal? Saat terjadi transisi dari 1 ke 0, dituliskanFalling. Lengkapnya untuk instruksi CONFIG INTx sebagai berikut: o CONFIG INTx = state o Nilai x bisa diisi dengan angka 0, 1, 2, 3 atau 4 menyesuaikan dengan mikrokontroler AVR yang digunakan, berapa jumlah maksimum interupsi eksternal yang dimiliki. o Parameter state bisa berisi: LOW LEVEL, interupsi terjadi pada saat level tegangan LOW atau logika 0. Menahan pin selalu LOW akan menyebabkan terjadinya interupsi terus menerus; FALLING, interupsi terjadi saat transisi logika 1 ke 0; RISING, interupsi terjadi saat transisi logika 0 ke 1; CHANGE, interupsi terjadi pada saat terjadi transisi apa saja, ingat tidak semua mikrokontroler mendukung mode ini. Baris 12 digunakan untuk memberitahukan mikrokontroler agar PORTD digunakan sebagai masukan, untuk interupsi eksternal masukan eksternal; Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 50 Baris 13 untuk memberitahukan mikrokontroler agar PORTB digunakan sebagai luaran yang terhubung ke delapan LED. Baris 14 untuk inisialisasi sebagai masukan diberikan nilai 255 atau 0xFF atau 11111111B; Sampai disini, apakah kemudian jika program kita selesaikan interupsi bisa berjalan sesuai dengan harapan? Ya belum donk! Karena masih ada hal yang harus dilakukan, yaitu mengaktifkan interupsi eksternal 0 dan 1, sebagaimana ditunjukkan pada baris 16 dan 17, dan mengaktifkan interupsi secara umum, ditunjukkan pada baris 18. Untuk mengaktifkan interupsi eksternal 0 digunakan instruksi Enable INT0, untuk interupsi eksternal 1, gunakan instruksi Enable INT1. Sedangkan untuk mengaktifkan interupsi secara umum, gunakan instruksi Enable Interupts. Program utama ditunjukkan pada baris 20 hingga 29, silahkan dipahami sesuai dengan contoh-contoh yang mirip di Modul 2. Ingat untuk menuliskan rutin interupsi yang bersangkutan, jika lupa, tentu pertanyaannya, Buat apa ngaktifin interupsi kalo rutin interupsi yang bersangkutan lupa dituliskan?. Rutin interupsi eksternal 0 ditunjukkan pada baris 31 hingga 34, awali dengan nama label (baris 31) dan akhiri dengan RETURN (baris 34), untuk kembali lagi ke instruksi yang tadi ditinggalkan karena harus memproses interupsi yang bersangkutan. Begitu juga dengan rutin interupsi eksternal 1 yang ditunjukkan pada baris 36 hingga 39. Instruksi BITWAIT x, SET/RESET (ditunjukkan pada baris 33 untuk interupsi eksternal 0, dan baris 38 untuk interupsi eksternal 1): o Instruksi ini digunakan untuk menunggu suatu kondisi bit hingga bernilai logika 1 (SET) atau hingga bernilai logika 0 (RESET); o Nilai x merupakan bit suatu variabel atau register, misalnyaPIND.2; o MisalnyaBITWAIT PIND.2, SET artinya menunggu PIND bit 2 hingga berlogika 1 setelah terjadi penekanan pushbutton dengan logika 0; 4.3. Latihan-2: Program Apakah ini?! Berikut ini sebuah program yang memanfaatkan penggunaan interupsi eksternal 0 dan 1, apa yang dilakukan oleh program ini? Silahkan Anda coba amati... ' program INT_02.BAS ' $crystal = 11059200 $regfile = "m16def.dat" Config Portb = Output 'LEDs on portB Config Pind.2 = Input 'Interrupt 0 Config Pind.3 = Input 'Interrupt 1 On Int0 Int0_handler On Int1 Int1_handler Config Int0 = Falling Config Int1 = Falling Enable Int0 ' aktivasi INT0 Enable Int1 ' aktivasi INT1 Enable Interrupts ' aktivasi interupsi Portd = 255 Portb = &B11111111 'turns off LEDs Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 51 Dim Pattern As Byte Dim Direction As Bit ' inisialisasi veriabel Pattern = 254 Direction = 0 Do If Direction = 1 Then Rotate Pattern , Left Else Rotate Pattern , Right End If Portb = Pattern ' hanya 1 LED menyala Waitms 100 Portb = 255 ' semua led mati Waitms 50 Loop Int0_handler: Direction = 1 Return Int1_handler: Direction = 0 Return 4.4. Latihan-3: Membuat STOPWATCH Membuat stopwatch menggunakan mikrokontroler AVR merupakan tantangan tersendiri, karena akan dimanfaatkan antarmuka LCD, pushbutton dan fasilitas timer. Rangkaian-nya ditunjukkan pada Gambar 4.2. Gambar 4.2. Rangkaian untuk Aplikasi Stopwatch Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 52 Program selengkapnya sebagai berikut, untuk sementara antarmuka LCD belum dijelaskan terlebih dahulu, fokus pada logika interupsi-nya dulu. Tentang LCD selengkapnya ada di modul 8. 1: ' program STPWATCH.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 8: Cursor Off 9: Cls 10: 11: Dim Pengali As Word 12: Dim Detik_1 As Byte 13: Dim Detik As Byte 14: Dim Menit As Byte 15: Dim Jam As Word 16: 17: Config Timer0 = Timer , Prescale = 256 18: 19: ' mengatur arah PORTA sebagai masukan... 20: Ddra = 0 21: Porta = 255 22: 23: ' jika terjadi overflow Timer0 lompat ke Int_timer0 24: On Ovf0 Int_timer0 25: 26: ' membuat nama lain untuk PINA.0 dan PINA.1 27: Pin_reset Alias Pina.2 28: Pin_stop Alias Pina.1 29: Pin_start Alias Pina.0 30: 31: ' aktifkan interupsi Timer0 32: Enable Timer0 33: 34: ' tampilan awal pada LCD 35: Lcd "Stopwatch AVRM16" 36: 37: ' program utama 38: Do 39: If Pin_start = 0 Then Enable Interrupts 40: If Pin_stop = 0 Then Disable Interrupts 41: If Pin_reset = 0 Then 42: Pengali = 0 43: Detik_1 = 0 44: Detik = 0 45: Menit = 0 46: Jam = 0 47: End If 48: Locate 2 , 4 49: Lcd Jam ; ":" ; Menit ; ":" ; Detik ; ":" ; Detik_1 ; " " 50: Loop 51: 52: ' rutin layanan interupsi timer0 53: Int_timer0: 54: ' 55: ' dengan 8MHz terjadi 122 kali interupsi per detik 56: ' agar sinkron dengan 1/100 detik maka 122/100 = 1,22 dibulatkan = 1 57: ' sehingga stopwtach ini KURANG AKURAT! Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 53 58: ' 59: Incr Pengali 60: If Pengali > 0 Then ' pembulatan 1,22 menjadi 1 61: Pengali = 0 62: Incr Detik_1 63: End If 64: If Detik_1 > 99 Then 65: Detik_1 = 0 66: Incr Detik 67: End If 68: If Detik > 59 Then 69: Detik = 0 70: Incr Menit 71: End If 72: If Menit > 59 Then 73: Menit = 0 74: Incr Jam 75: End If 76: Return Penjelasan: Untuk deklarasi atau konfigurasi antarmuka LCD, pada baris 6 dan 7 akan dijelaskan lebih lanjut pada Modul 8; Baris 8 dan 9 masing-masing digunakan untuk mematikan tampilan kursor pada LCD dan membersihkan layar LCD; Baris 11 hingga 15 digunakan untuk mendeklarasikan variabel-variabel yang terlibat dalam program stopwatch ini yaitu Pengali, Detik_1, Detik, Menit dan Jam, masing-masing akan digunakan untuk menyimpan data kelipatan pewaktu, seperseratus detik, detik, menit dan jam sesuai dengan namanya; PORTA digunakan untuk masukan tiga tombol, yaitu START, STOP dan RESET yang masing- masing dihubungkan ke PORTA.0, PORTA.1 dan PORTA.2, sehingga PORTA didefinisikan sebagai masukan (baris 20) dan dilakukan inisialisasi (baris 21); Pada baris 24 dilakukan deklarasi jika terjadi OVERFLOW pada timer0, maka lakukan interupsi dengan menjalankan rutin interupsi Int_timer0; Baris 27 hingga 29 digunakan untuk mendeklarasikan nama-nama lain dari PINA.2, PINA.1 dan PINA.0 masing-masing sebagai Pin_reset, Pin_stop danPin_start; Agar interupsi bisa bekerja, maka dilakukan aktivasi interupsi yang terkait, yaitu Timer0, pada baris 32; Dilakukan tampilan awal pada LCD STOPWATCH AVRM32, tampilannya ditunjukkan pada Gambar 4.3. Gambar 4.3 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 54 Kemudian barulah masuk program utama, yaitu baris 38 hingga 50. Program utama ini bekerja melakukan pengujian ketiga tombol serta menampilkan nilai waktu ke penampil LCD: o Pertama, baris 39, digunakan untuk memeriksa apakah tombol START ditekan? Jika ditekan maka aktifkan interupsi Timer0, pada saat itu Timer0 langsung bekerja; o Kedua, baris 40, digunakan untuk memeriksa apakah tombol STOP ditekan? Jika ditekan maka matikan interupsi Timer0, stopwatch berhenti; o Ketiga, baris 41, dilakukan pemeriksaan tombol RESET, jika ditekan maka semua variabel yang terkait (baris 42 46) di-nol-kan; o Baris 48 dan 49 untuk menampilkan variabel-variabel yang terkait ke LCD, demikian dilakukan terus menerus (DO-LOOP). Baris 53 hingga 76 merupakan rutin layanan interupsi, sebuah subrutin yang dikerjakan setiap terjadi interupsi Timer0: o Dengan 8MHz akan terjadi 122 kali interupsi per detik agar sinkron dengan 1/100 detik maka 122/100 =1,22 dibulatkan =1 sehingga stopwtach ini KURANG AKURAT! o Tahunya dari mana nilai ini? Coba Anda aktifkan kembali program Timer0 Calculator, sebagaimana ditunjukkan pada Gambar 4.4 di bagian Timer0 Interrupts per second. Gambar 4.4. Program AVR Timer0 Calculator untuk prescale 256 o Artinya, setiap terjadi interupsi Timer0 maka variabel Pengali dinaikkan satu (baris 59) dan hal ini terjadi 122 kali dalam watu detik. Jika nilai variabel Pengali sudah lebih besar 0, maka harus segera diupdate variabel 1/100 detiknya (variabel Detik_1), sebagaimana ditunjukkan pada baris 60 63. Demikian seterusnya untuk variabel-variabel lainnya, baris 64 75. - Selesai Modul 4 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 55 Modul-5: Komunikasi Serial 5.1. Komunikasi Serial Komunikasi serial pada Mikrokontroler AVR khususnya ATMega16 menggunakan fasilitas UART (Universal Asynchronous Receiver Transmitter) dengan beberapa fitur sebagai berikut: Operasi Full Duplex (Independent Serial Receive and Transmit Registers) Operasi secara sinkron atau asinkron Master or Slave Clocked Synchronous Operation High Resolution Baud Rate Generator Supports Serial Frames with 5, 6, 7, 8, or 9 Data Bits and 1 or 2 Stop Bits Odd or Even Parity Generation and Parity Check Supported by Hardware Data OverRun Detection Framing Error Detection Noise Filtering Includes False Start Bit Detection and Digital Low Pass Filter Three Separate Interrupts on TX Complete, TX Data Register Empty, and RX CompleteMulti- processor Communication Mode Double Speed Asynchronous Communication Mode Penggunaan komunikasi serial menggunakan BASCOM AVR sangat mudah. Ada beberapa instruksi yang perlu diperhatikan dalam komunikasi serial ini, yaitu: Print PrintBin Input InputBin InputHex Waitkey Inkey IsCharWaiting Spc Sedangkandirective (bukan instruksi tetapi perintah yang ditujukan ke compiler BASCOM AVR-nya) yang terkait dengan komunikasi serial adalah: $Baud $Crystal Beberapa mikrokontroler AVR memiliki lebih dari 1 UART 5.2. Penjelasan Instruksi danDirective Komunikasi Serial Directive $Baud dan $Crystal masing-masing digunakan untuk menentukan kecepatan pengiriman atau penerimaan data pada komunikasi serial dalam satuanbps atau bit per detik atau baud dan penentuan frekuensi kristal yang digunakan (baik internal atau eksternal). PRINT <"konstanta | variabel | konstanta; variabel> Digunakan untuk mengirim data (konstanta, variabel atau konstanta dan variabel) secara serial melalui fasilitas UART-nya mikrokontroler AVR. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 56 PRINTBIN <variabel> Digunakan untuk mengirimkan konten biner pada variabel ke saluran komunikasi serial; INPUT [prompt] , var [, var] Untuk menerima masukan melalui terminal komputer (diketik), jika prompt dituliskan berarti ada kata atau kalimat pertanyaan atau penjelasan; INPUTBIN var1 [, var2] INPUTHEX var1 [, var2] Masing-masing digunakan untuk menerim masukanBINER danHEKSADESIMAL, kemudian disimpan pada vari1, var2 dan seterusnya. Var = INKEY() jika tidak ada karakter yang menunggu, akan dikembalikan nilai nol. Gunakan instruksi ISCHARWAITING untuk memeriksa apakah ada sebuah byte yang sedang menunggu (untuk diproses lebih lanjut). Var = WAITKEY() instruksi WAITKEY() mirip dengan INKEY() yaitu mengembalikan suatu karakter dari buffer, hanya saja INKEY akan melanjutkan ke instruksi berikutnya ada atau tidak karakter yang dimasukkan melalui port serial, sedangkan WAITKEY() menunggu hingga benar-benar ada karakter yang dimasukkan melalui port serial; Var = ISCHARWAITING() Lihat keterangan padaINKEY(). PRINT SPC(x) Mencetak sekian x jumlah spasi ke port serial. 5.3. Latihan-1: Komunikasi Serial dan LCD Bagian 1 Rangkaian antarmuka port serial pada mikrokontroler AVR dengan komputer ditunjukkan pada Gambar 5.1. Perhatikan, port serial mikrokontroler AVR memiliki tingkat tegangan TTL (0 sampai 5 volt), sedangkan port serial komputer menggunakan tingkat tegangan RS232 (-15 sampai +15volt). Sungguh jauh berbeda, dengan demikian agar tidak terjadi kerusakan, dibutuhkan konverter tegangan TTL RS232, misalnya menggunakan MAX232 (rangkaian pada Gambar 5.1). Gambar 5.1. Rangkaian antarmuka MAX232 Untuk latihan pertama ini akan dibuat sebuah aplikasi yang menuliskan kata Saya Keren ke LCD dan ke terminal komputer (bisa menggunakan HyperTerminalnya Windows). Rangkaian yang digunakan menggunakan rangkaian yang ditunjukkan pada Gambar 5.2, antarmuka MAX232 walaupun tidak ada di gambar, dalam rangkaian sebenarnya tetap ada! Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 57 Gambar 5.2. Rangkaian komunikasi serial dan keypad Program selengkapnya ditunjukkan sebagai berikut... 1: ' berkas SERIAL01.BAS 2: $regfile = "m16def.dat" 3: $baud = 9600 4: $crystal = 11059200 5: 6: ' melakukan konfigurasi LCD... 7: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 8: Config Lcd = 16 * 2 9: 10: Cursor Off ' mematikan tampilan cursor LCD 11: Cls ' membersihkan layar LCD 12: 13: Locate 1 , 7 14: Lcd "saya" 15: Locate 2 , 7 16: Lcd "keren" 17: 18: Print "saya keren" 19: 20: Do Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 58 21: ' tidak melakukan sesuatu 22: Loop Penjelasan: Aplikasi menggunakan LCD dan port serial. Untuk penjelasan lebih lanjut tentang LCD ada di modul 8. Baris 7 dan 8 digunakan untuk mendeklarasikan konfigurasi antarmuka LCD dengan mikrokontroler AVR, dalam hal ini LCD dihubungkan ke PORTB (penjelasan lengkap ada di modul 8). Baris 10 digunakan untuk mematikan kursor pada LCD, sedangkan Baris 11 digunakan untuk membersihkan tampilan LCD; Baris 13 sampai dengan 16 digunakan untuk menampilkan kata saya dan keren, masing masing pada lokasi baris 1 kolom 7 dan baris 2 kolom 7. Sekali lagi penjelasan detil tentang LCD ada di modul 8; Inti program ini ada di baris 18, yaitu mengirimkan kalimat Saya keren ke port serial yang kemudian diterima oleh komputer, misalnya, menggunakan Hyperterminal: o Percobaan menggunakan komputer melalui Hyperterminal, saat diaktifkan akan ditampilkan jendela Connection Description, sebagaimana ditunjukkan pada Gambar 5.3, tuliskan nama koneksi, misalnya mikroku kemudian klik OKatau tekanENTER; Gambar 5.3. Connection Description o Selanjutnya akan ditampilkan pengaturan konfigurasi komunikasi serial Connect To, sebagaimana ditunjukkan pada Gambar 5.4. Kita pilih Connect usingmenggunakan COM yang Anda gunakan sebagai saluran komunikasi serial dengan rangkaian mikrokontrolernya. Misalnya COM1, klikOK; Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 59 Gambar 5.4. Connect To o Kemudian akan muncul pengaturan komunikasi serial lebih lanjut, yaitu jendela COMx Properties (x merupakan angka 1, 2, 3 dan seterusnya, sesuai dengan pilihan sebelumnya). Lakukan pengaturan sebagaimana ditunjukkan pada Gambar 5.5. Kemudian klikOK; o Hyperterminal siap melakukan komunikasi serial dengan mikrokontroler, hidupkan atau RESET rangkaian mikrokontroler, sehingga akan ditampilkan kalimat saya keren di layar Hyperterminal, contohnya ditunjukkan pada Gambar 5.6. Baris 20 sampai dengan 22 bisa diganti dengan instruksi END. Gambar 5.5. COM1 Properties Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 60 Gambar 5.6. Hyperterminal 5.4. Latihan-2: Komunikasi Serial dan LCD Bagian 2 Menggunakan rangkaian yang sama seperti pada Gambar 5.2, kali ini dibuat sebuah aplikasi yang akan menerima kalimat/kata dari terminal port serial komputer, kemudian menampilkan-nya di LCD. Program selengkapnya... 1: ' berkas SERIAL02.BAS 2: $regfile = "m16def.dat" 3: $baud = 9600 4: $crystal = 11059200 5: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 8: 9: Dim Teks As String * 16 10: 11:Cursor Off 12:Cls 13: 14:Print "ketik karakter yang diinginkan(max 16 kar) 15:Print "kemudian tekan enter..." 16: 17:Do 18: Input Teks 19: Cls 20: Lcd Teks 21:Loop Penjelasan: Mikrokontroler akan mengirimkan dua kalimat ke komputer melalui port serial (diterima oleh Hyperterminal), sebagaimana ditunjukkan pada baris 14 dan 15, menggunakan instruksi PRINT; Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 61 Program utama yang diulang-ulang ditunjukkan pada baris 17 hingga 21, diantara DO dan LOOP (pengulangan terus menerus). Diawali dengan menerima masukan (tersimpan ke variabel TEKS) dari port serial komputer (dengan instruksi INPUT pada baris 18), menghapus tampilan LCD (dengan CLS pada baris 19) dan menuliskan masukan dari port serial komputer ke LCD (dengan instruksi LCD pada baris 20); Kalimat yang ditulis pada terimal PC selalu ditampilkan pada baris-1 di LCD, bagaimana caranya untuk menampilkan ke baris-2? Silahkan digunakan untuk latihan Anda, selamat mencoba... 5.5. Latihan-3: Protokol Komunikasi Serial Dalam dunia SCADA atau Supervisory Control And Data Acquisition, dikenal adanya proses pemantauan dan/atau pengontrolan melalui berbagai macam media komunikasi. Media yang paling sederhana dan sering dijumpai adalah komunikasi serial. Hanya saja diperlukan protokol atau tata cara komunikasi atau aturan-aturan berkomunikasi. Latihan 4 ini mengenalkan konsep protokol komunikasi serial. Aplikasinya akan menampilkan tulisan pada LCD sesuai dengan perintah yang dikirimkan melalui konsol atau hyperterminal, yaitu angka 0, 1, 2 atau 3. Masing-masing memiliki arti yang berbeda... 1: ' berkas LED_SERIAL.BAS 2: ' belajar membuat protokol kontrol komunikasi serial 3: ' 4: $regfile = "m16def.dat" 5: $baud = 9600 6: $crystal = 11059200 7: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 8: 9: Config Lcd = 16 * 2 10: Config Portb = Output 11: Portb = &H00 12: 13: Dim Perintah As String * 1 14: 15: Cursor Off 16: Cls 17: 18: Print "silahkan menuliskan karakternya..." 19: 20: Do 21: Perintah = Waitkey() 22: Select Case Perintah 23: Case "0" : Cls 24: Upperline 25: Lcd "semua LED" 26: Lowerline 27: Lcd "MATI" 28: Portb = &H00 29: Case "1" : Cls 30: Upperline 31: Lcd "semua LED" 32: Lowerline 33: Lcd "HIDUP" 34: Portb = &HFF 35: Case "2" : Cls 36: Upperline 37: Lcd "LED 0,2,4 dan 6" Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 62 38: Lowerline 39: Lcd "HIDUP" 40: Portb = &B01010101 41: Case "3" : Cls 42: Upperline 43: Lcd "LED 1,3,5 dan 7" 44: Lowerline 45: Lcd "HIDUP" 46: Portb = &B10101010 47: End Select 48: Loop Penjelasan singkat... Instruksi waitkey(), pada baris 21, digunakan untuk menunggu hingga diketikkan sesuatu (1 karakter saja) pada konsol: o Jika 0, maka akan ditampilkan tulisan Semua LED MATI pada LCD (baris 24-27), sebagaimana contohnya ditampilkan pada Gambar 5.7. Dan semua LED yang terhubung pada PORTB dimatikan (baris 28) Gambar 5.7. Contoh tampilan pada LCD o Jika 1, maka akan ditampilkan tulisan Semua LED HIDUP pada LCD (baris 30-33) dan semua LED yang terhubung pada PORTB dihidupkan (baris 34); o Jika 2, maka akan ditampilkan tulisan LED 0,2,4 dan 6 HIDUP pada LCD (baris 36- 39) dan semua LED 0,2,4 dan 6 yang terhubung pada PORTB dihidupkan (baris 40); o Jika 3, maka akan ditampilkan tulisan LED 1,3,5 dan 7 HIDUP pada LCD (baris 42- 45) dan semua LED 1,3,5 dan 7 yang terhubung pada PORTB dihidupkan (baris 46) - Selesai Modul 5 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 63 Modul-6: LCD dan ADC 6.1. Rangkaian Antarmuka LCD 2x16 Karakter Gambar 6.1. Rangkaian antarmuka LCD 4-bit Gambar 6.2. Tampilan sebuah LCD 16x2 Pada Gambar 6.1 ditunjukkan rangkaian baku antarmuka LCD untuk mendukung instruksi-instruksi khusus LCD pada BASCOM AVR. LCD, yang contohnya ditunjukkan pada Gambar 6.2, merupakan tipe 2x16 karakter dan tentunya masih ada tipe-tipe lainnya yang didukung BASCOM AVR, antara lain: 40x4, 16x1, 16 x 4, dan lain-lain (bisa dilihat pada Help-nya BASCOM AVR). Penjelasan Gambar 6.1: D4 s/d D7: jalur data 4-bit (BASCOM AVR bisa mendukung antarmuka 4 bit atau 8 bit, untuk efisiensi pin, pada modul ini hanya dibahas antarmuka 4-bit); Pin R/W di-GND-kan, artinya data dikirim sebagai proses WRITE (menulis) ke LCD; Pin RS dan E masing-masing disambungkan ke pin pada mikrokontroler AVR untuk melakukan pengontrolan Register Select dan Enable. Anda tidak perlu kawatir bagaimana caranya mengontrol LCD, karena sudah diurus langsung oleh BASCOM AVR; Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 64 Beberapa perintah yang berkaitan dengan antarmuka LCD dalam BASCOM AVR adalah: o CONFIG LCD = ... o CONFIG LCDPIN = ... o LOCATE <baris>, <kolom> o LCD <string> o UPPERLINE o LOWERLINE o SHIFTLCD LEFT/RIGHT 6.2. Rangkaian Antarmuka LCD dan ADC Gambar 6.3. Rangkaian dasar LCD dan ADC Pada Gambar 6.3 ditunjukkan cotnh rangkaian antarmuka LCD dan ADC dengan ATMega16 yang bisa digunakan untuk latihan-latihan antarmuka LCD dan ADC. 6.3. Latihan-1: Tampilan Saya Manusia Keren di LCD Sebagai pendahuluan, pada Latihan 1 ini akan ditampilkan kalimat Saya manusia Keren! pada LCD 2x16 karakter dalam 2 baris. Oke, kita awali program seperti biasa dengan inisialisasi pustaka ATMega16 dan kristal yang digunakan 11,0592MHz: 1: ' program LCD01.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: Selanjutnya tidak serta merta kita langsung bisa menuliskan kalimat Saya manusia keren! pada LCD, tetapi lakukan terlebih dahulu inisialisasi LCD, agar BASCOM AVR bisa melakukan inisialisasi LCD Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 65 dengan baik dan benar. Pertama kita definisikan dulu rangkaiannya, 4 jalur data D4 sampai dengan D7 disambungkan dengan pin apa saja, termasuk RS dan E-nya juga (baris 6). Kemudian dilanjutkan dengan tipe LCD yang digunakan (baris 8). Kedua baris instruksi ini bisa dibolak-balik: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 8: Awas! Baris 6 (CONFIG LCDPIN) HARUS DITULIS DALAM SATU BARIS! Ilustrasi di atas hanya untuk penjelasan modul saja supaya tidak terlalu panjang... Kemudian kursor LCD kita matikan (baris 9), Anda bisa saja tetap menghidupkan, ini hanya opsional saja, kemudian dilanjutkan dengan membersihkan layar LCD denganCLS(baris 10): 9: Cursor Off 10: Cls 11: Kemudian langsung dilanjutkan dengan menempatkan kursor pada bari-1, kolom 3 dan menuliskan Saya manusia diikuti dengan menempatkan kursor pada baris-2, kolom-6 dan menuliskan keren! 12: Locate 1 , 3 ' mulai lokasi baris-1 kolom 7 13: Lcd "saya manusia" 14: Locate 2 , 6 ' mulai lokasi baris-2 kolom 7 15: Lcd "keren!" 16: 17: End Program selengkapnya sebagai berikut (baris 6 lihat program LCD01.BAS): 1: ' program LCD01.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 8: 9: Cursor Off 10: Cls 11: 12: Locate 1 , 3 ' mulai lokasi baris-1 kolom 7 13: Lcd "saya manusia" 14: Locate 2 , 6 ' mulai lokasi baris-2 kolom 7 15: Lcd "keren!" 16: 17: End Hasilnya ditunjukkan pada Gambar 6.4 (diambil dari rangkaian Proteus 7.4 SP3). Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 66 Gambar 6.4 6.4. Latihan-2: Tampilan Saya Manusia Keren Berkedip-kedip di LCD Mmm mudah bukan? Sekarang tampilan Saya manusia keren! kita buat berkedip-kedip, berikut program selengkapnya, perhatikan perubahan pada program sebelumnya, dengan memberikan instruksi DO..LOOP (baris 12 sampai dengan 20): 1: ' program LCD02.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 8: 9: Cursor Off 10: Cls 11: 12: Do 13: Cls 14: Waitms 200 15: Locate 1 , 3 16: Lcd "saya manusia" 17: Locate 2 , 6 18: Lcd "keren!" 19: Waitms 200 ' tunggu 300 milidetik 20: Loop Pada program tersebut, diawali dengan membersihkan layar (baris-13), artinya LCD dalam kondisi bersih, kemudian ditunda 200 milidetik (baris-14) dilanjutkan menampilkan Saya manusia keren! seperti pada program sebelumnya(baris-15 sampai dengan 18), kemudian ditahan 200 milidetik (baris-19), demikian seterusnya. Anda bisa bereksperimen dengan kalimat-kalimat lain, mulai pada lokasi-lokasi yang Anda inginkan atau merubah tundaan-tundaanWAITMS. Jika kalimat yang Anda tuliskan lebih dari 16 karakter apa yang terjadi? Silahkan dicoba... Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 67 6.5. Latihan-3: Menggeser Tampilan pada LCD Okey, berikutnya kita berikan contoh penggeseran teks pada LCD menggunakan instruksi SHIFTLCD yang bisa diikuti dengan LEFT atau RIGHT (mo geser kekiri atau kekanan). Berikut program selengkapnya: 1: ' program LCD03.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 8: 9: Dim Pos As Byte 10: 11: Do 12: 13: Cls 14: Upperline 15: Lcd "012345678901agfi" 16: Lowerline 17: Lcd "012345678901asik" 18: For Pos = 0 To 16 Step 1 19: Waitms 100 20: Shiftlcd Left 21: Next Pos 22: 23: Loop Penggeseran yang dilakukan sebanyak 16 kali, sesuai dengan tampilan LCD 16 karakter. Diawali dengan membersihkan layar LCD (baris-11), kemudian diikuti dengan instruksi untuk menempatkan kursor pada baris teratas (dalam hal ini baris-1 kolom-1) menggunakan perintah UPPERLINE (baris- 12) dan menuliskan teksnya (baris-13), dan dilanjutkan dengan menempatkan kursor di bagian paling bawah atau baris-2 kolom-1 menggunakanLOWERLINE (baris-14) dan seterusnya. Penggeseran dilakukan melalui instruksi SHIFTLCD LEFT (geser kiri), sebagaimana ditunjukkan pada baris-18, sebanyak 16 kali (baris-16 dan 19). 6.6. Latihan-4: Animasi Karakter pada LCD Wow asik sekali! Sekarang kita tingkatkan kemampuan kita dengan mencoba menampilkan animasi karakter buatan kita di layar LCD. Apa bisa? Ya tentu saja donk! Bagaimana caranya? Pendefinisian karakter pada LCD menggunkan bantuan menu Tools LCD Designer, sehingga ditampilkan jendela LCD Designer, sebagaimana ditunjukkan pada Gambar 6.5. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 68 Gambar 6.5. Kotak dialogLCD designer Baiklah kita coba saja, buka berkas baru pada BASCOM AVR, kemudian kita siapkan program-nya sejak awal, ketik saja bagian berikut ini... 1: ' program LCD04.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 8: Config Portd = Output 9: Dim Star As Byte 10: Cursor Off 11: Tempatkan kursor pada baris 11 atau 12, kemudian aktifkan LCD Designer dan buatlah gambar pertama sebagaimana ditunjukkan pada Gambar 6.6 Gambar 6.6. Menggambar suatu karakter Kemudian klik Ok, sehingga pada editor BASCOM AVR akan dihasilkan sebuah baris seperti berikut ini: Deflcdchar ? , 32 , 4 , 4 , 31 , 4 , 4 , 32 , 32 replace ? with number (0-7) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 69 Gantilah ? dengan angka 0, kemudian lanjutkan dengan baris berikutnya menggunakan karakter sebagaimana ditunjukkan pada Gambar 6.7. Jangan lupa tanda ? diganti dengan angka 1 dan seterusnya (nantinya sampai angka 5, karena masih ada 4 karakter lainnya, perhatikan Gambar 6.8). Gambar 6.7. Karakter berikutnya Lanjutkan dengan karakter-karakter sebagaimana ditunjukkan pada Gambar 6.8, total ada 6 buah karakter. Gambar 6.8. Sekumpulan karakter berikutnya Data selengkapnya sebagai berikut: 12: Deflcdchar 0 , 32 , 4 , 4 , 31 , 4 , 4 , 32 , 32 13: Deflcdchar 1 , 32 , 2 , 20 , 14 , 5 , 8 , 32 , 32 14: Deflcdchar 2 , 32 , 2 , 26 , 4 , 11 , 8 , 32 , 32 15: Deflcdchar 3 , 32 , 17 , 10 , 4 , 10 , 17 , 32 , 32 16: Deflcdchar 4 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32 17: Deflcdchar 5 , 32 , 8 , 5 , 14 , 20 , 2 , 32 , 32 18: Selanjutnya, kita tuliskan instruksi-instruksi untuk menampilkan ke-6 karakter tersebut secara bergantian pada baris dan kolom yang sama sedemikian hingga akan tercipta sebuah animasi. Kita bersihkan layarnya... 19: Cls Kemudian dilanjutkan dengan DO..LOOP untuk pengulangan terus menerus (baris-21 dan 27). Karena ada 6 karakter yang akan ditampilkan secara bergantian, kita gunakan instruksi FOR..NEXT menggunakan variabel STAR dari 0 hingga 5, sebagaimana ditunjukkan pada baris 22 dan 26, instruksi STEP boleh ditulis boleh tidak. Tunggu 50 milidetik (baris-23), tempatkan kursor pada baris- 1 kolom-16 (baris-24, Anda bisa menempatkan dimana saja Anda inginkan), dan jangan lupa, ini paling penting, yaitu menampilkan karakter menggunakan instruksi LCD CHR(star), dimana star berisi 0 hingga 5 secara bergantian 1 . 1 Itulah sebabnya definisi karakter tanda ? diganti dengan angka 0 sampai dengan 5 (berurutan). Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 70 20: Do 21: For Star = 0 To 5 Step 1 22: Waitms 50 23: Locate 1 , 16 24: Lcd Chr(star) 25: Next Star 26: Loop 27: 28: End Program selengkapnya... 1: ' program LCD04.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 8: 9: Config Portd = Output 10: Dim Star As Byte 11: 12: Cursor Off 13: 14: Deflcdchar 0 , 32 , 4 , 4 , 31 , 4 , 4 , 32 , 32 15: Deflcdchar 1 , 32 , 2 , 20 , 14 , 5 , 8 , 32 , 32 16: Deflcdchar 2 , 32 , 2 , 26 , 4 , 11 , 8 , 32 , 32 17: Deflcdchar 3 , 32 , 17 , 10 , 4 , 10 , 17 , 32 , 32 18: Deflcdchar 4 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32 19: Deflcdchar 5 , 32 , 8 , 5 , 14 , 20 , 2 , 32 , 32 20: 21: Cls 22: 23: Do 24: For Star = 0 To 5 Step 1 25: Waitms 50 26: Locate 1 , 16 27: Lcd Chr(star) 28: Next Star 29: Loop 30: 31: End Baiklah sekarang bagaimana dengan program berikut... karakter animasinya kita ganti, coba Anda jalankan dengan ATMega16 dan amati hasilnya (LCD04A.BAS): 1: ' program LCD04A.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 8: 9: Config Portd = Output 10: Dim Jman As Byte Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 71 11: 12: Cursor Off 13: 14: Deflcdchar 0 , 21 , 14 , 4 , 4 , 4 , 27 , 32 , 32 15: Deflcdchar 1 , 4 , 14 , 21 , 4 , 4 , 10 , 10 , 10 16: Cls 17: 18: Do 19: For Jman = 0 To 1 Step 1 20: Waitms 50 21: Locate 1 , 16 22: Lcd Chr(jman) 23: Next Star 24: Loop 25: 26: End Dan juga program berikut... (LCD04B.BAS) 1: ' program LCD04B.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 8: 9: Config Portd = Output 10: Dim Mbar As Byte 11: 12: Cursor Off 13: 14: Deflcdchar 0 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 6 15: Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 32 , 6 , 6 16: Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 6 , 6 , 6 17: Deflcdchar 3 , 32 , 32 , 32 , 32 , 6 , 6 , 6 , 6 18: Deflcdchar 4 , 32 , 32 , 32 , 6 , 6 , 6 , 6 , 6 19: Deflcdchar 5 , 32 , 32 , 6 , 6 , 6 , 6 , 6 , 6 20: Deflcdchar 6 , 32 , 6 , 6 , 6 , 6 , 6 , 6 , 6 21: Deflcdchar 7 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 22: 23: Cls 24: 25: Do 26: Locate 1 , 16 27: Lcd " " 28: Waitms 50 29: For Mbar = 0 To 7 Step 1 30: Locate 1 , 16 31: Lcd Chr(mbar) 32: Waitms 50 33: Next Mbar 34: For Mbar = 6 To 0 Step -1 35: Locate 1 , 16 36: Lcd Chr(mbar) 37: Waitms 50 38: Next Mbar 39: Loop 40: Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 72 41: End Program terakhir ini akan menampilkan garis yang naik turun, perhatikan bahwa STEP -1 sebagaimana ditunjukkan pada baris 32 wajib dituliskan karena, nilai MBAR turun dari 6 hingga 0. SedangkanSTEP 1 pada baris 27, sebagaimana telah dijelaskan sebelumnya bersifat opsional. 6.7. Latihan-5: Antarmuka LCD danPushbutton Wah latihan 3 yang cukup panjang tetapi Anda mendapatkan informasi atau pengetahuan yang luar biasa. Okey, kali ini digabungkan 4 tombol dan sebuah LCD, sebagaimana antarmuka LCD dan pushbutton dengan ATMega16 ditunjukkan pada Gambar 6.9. Gambar 6.9. Rangkaian pushbutton (PORTD.2 dan PORTD.3) dan LCD Nantinya tampilan LCD akan menyesuaikan dengan penekanan tombol, jika tombol tidak ditekan, maka tampilan LCD akan ditunjukkan pada Gambar 6.10. sedangkan penekanan tombol, misalnya tombol 2, akan ditunjukkan pada Gambar 6.11 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 73 Gambar 6.10 Gambar 6.11 Okey kita mulai pemrogramannya... seperti biasanya, kita awali dengan inisialisasi segala hal... 1: ' program lcd_push.bas 2: ' 3: 4: $regfile = "m16def.dat" 5: $crystal = 11059200 6: 7: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 8: Config Lcd = 16 * 2 9: 10: Cursor Off 11: Cls 12: 13: Config Portd = Input 14: Ingat, PORTC kita sambungkan ke 4 buah pushbutton (Gambar 6.9), sehingga didefinisikan sebagai masukan (baris 13). Selanjutnya kita tampilkan kalimat-kalimat pembuka sebagaimana ditunjukkan pada Gambar 6.10 (baris 15 sampai dengan 18) dan PORTC diberi nilai 1 (baris 20) semua untuk masukan aktif rendah: 15: Locate 1 , 1 16: Lcd "belum ada tombol" 17: Locate 2 , 3 18: Lcd "yg ditekan!" 19: 20: Portd = 255 21: Langkah berikutnya adalah mendeteksi masing-masing tombol dan menampilkan teks pada LCD sesuai dengan tombol yang ditekan, mulai dari PINC.0 (tombol-1), PINC.1 (tombol-2), PINC.2 (tombol-3) dan PINC.3 (tombol-4): 22: Do Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 74 23: If Pind.2 = 0 Then 24: Cls 25: Locate 1 , 3 26: Lcd "anda menekan" 27: Locate 2 , 4 28: Lcd "tombol INT0" 29: End If 30: 31: If Pind.3 = 0 Then 32: Cls 33: Locate 1 , 3 34: Lcd "anda menekan" 35: Locate 2 , 4 36: Lcd "tombol INT1" 37: End If 38: Loop Bagaimana? Mudah bukan? Memang perlu waktu untuk memahami, jika Anda rajin latihan, saya jamin akan cepat bisa paham. Baiklah, Latihan 4 merupakan latihan terakhir untuk LCD, mari kita lanjutkan dengan memhami atau menggunakan fasiltasADC atauAnalog Digital Converter pada ATMega16. ADC ini digunakan untuk merubah tegangan analog menjadi data-data digital dengan resolusi 10 bit. Pada ATMega16 terdapat 8 saluran ADC yang menempati masing-masing pin pada PORTA. 6.8. Latihan-6: Pemanfaatan ADC pada Mikrokontroler AVR Menggunakan rangkaian yang ditunjukkan pada Gambar 6.3 yang merupakan rangkaian antarmuka ADC dan LCD dengan ATMega16. Pada rangkaian tersebut, kanal atau channel ADC yang digunakan pada latihan ini adalah kanal-7 atau ADC7 pada PA7. Masukan ADC7 tersebut dihubungkan ke sebuah potensiometer (atau bisa juga diganti dengan LM35 atau sensor apa saja yang menghasilkan tegangan 0 Vref). Penggunaan fasilitas ADC pada AVR mensyaratkan kita melakukan inisialisasi dengan CONFIG ADC, kemudian diikuti dengan menjalankan proses konversi ADC menggunakan instruksi START ADC. Okey, kita buat programnya. Inisialisasi di awal program untuk pustaka dan kristal, kemudian diikuti dengan inisialiasai LCD (baris 6 dan 7): 1: ' program ADC01.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 Kemudian diikuti dengan mendeklarasikan ADC-nya (baris 6): 8: Config Adc = Single , Prescaler = Auto , Reference = Avcc 9: Start Adc 10: 11: Dim Data_adc As Word , Adc_convert As Single , Adc_string As String * 10 12: Pendeklarasikan ADC menggunakan CONFIG ADC. Cara penulisannya sebagai berikut: Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 75 CONFIG ADC = single, PRESCALER = AUTO, REFERENCE = opt Keterangan: Parameter pertama bisa diisi SINGLE atauFREE. Artinya: o SINGLE: Konversi dilakukan untuk sekali pembacaan tegangan masukan; Gunakan saat dibutuhkan saja; o FREE: Konversi dilakukan terus menerus secara kontinu (ADC membaca sampel tegangan masukan kemudian menyimpan hasilnya di ADCH:ADCL); Parameter PRESCALER: o Auto, biarkan compiler BASCOM-AVR menghasilkan nilai terbaik untuk nilai kristal yang digunakan; o Angka, tentukan angkanya sendiri untuk pembagi clock (2, 4, 8, 16, 32, 64 atau 128) ADC membutuhkan clock antara 50-200 kHz. Parameter REFERENCE: o OFF, referensi internal di-OFF-kan o AVCC, menggunakan kapasitor eksternal di pin AREF; o INTERNAL, tegangan referensi internal 2.56V dengan kapasitor eksternal di pin AREF. Lantas apa arti dari baris-8 tersebut? Silahkan merujuk keterangan saya di atas dan itulah sebabnya mengapa AREFdihubungkan ke VCC. Selanjutnya ADC kita aktifkan (baris-9), dan dideklarasikan variabel untuk menyimpan data ADC di DATA_ADC (baris-8 dalam format word, 16-bit, karena tidak cukup jika dalam format byte yang hanya 8-bit). Berikutnya pengambilan data ADC melalui nstruksi GETADC(nomor_kanal), sebagaimana ditunjukkan pada baris-14. Karena ADC yang digunakan adalah kanal-1 (terhubung dengan potensiometer), maka digunakan instruksi GET_ADC(1), demikian seterusnya. Baris-15 sampai dengan 19 Anda pasti sudah jelas maksudnya... 13: Do 14: Data_adc = Getadc(1) 15: Locate 1 , 1 16: Lcd "Data ADC (volt):" 17: Locate 2 , 6 18: Lcd Adc_string ; " " 19: Waitms 200 20: Loop O iya, hasilnya masih berupa angka atau nilai dari 0 sampai dengan 1023, perhatikan Gambar 6.16 untuk nilai minimum (0) dan maksimum (1023). Gambar 6.16 Hasil tersebut belum dikonversi menjadi tegangan 0 sampai dengan 5 volt, masih berupa data digital 0 s/d 1023 (10 bit). Untuk mengubah menjadi nilai tegangan 0 sampai 5 volt digunakan persamaan: Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 76 Tampilan =(data_adc / 1024) x 5 volt Sebagaimana ditunjukkan pada potongan program berikut: 17: Data_adc = Getadc(1) 18: Adc_convert = Data_adc 19: Adc_convert = Adc_convert / 1024 20: Adc_convert = Adc_convert * 5 21: Adc_string = Fusing(adc_convert , "#.##") Perhatikan implementasi persamaan pada baris 17 sampai 20, sedangkan baris-21 digunakan untuk memformat tampilan 3 digit dengan 2 digit pecahan yag kemudian ditampilkan melalui LCD, perhatikan contoh hasil minimum yang ditunjukkan pada Gambar 6.17. Gambar 6.17 Program selengkapnya: 1: ' program ADC01.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 7: Config Lcd = 16 * 2 8: Config Adc = Single , Prescaler = Auto , Reference = Avcc 9: Start Adc 10: 11: Dim Data_adc As Word , Adc_convert As Single , Adc_string As String * 10 12: 13: Cursor Off 14: Cls 15: 16: Do 17: Data_adc = Getadc(1) 18: Adc_convert = Data_adc 19: Adc_convert = Adc_convert / 1024 20: Adc_convert = Adc_convert * 5 21: Adc_string = Fusing(adc_convert , "#.##") 22: 23: Locate 1 , 1 24: Lcd "Data ADC (volt):" 25: Locate 2 , 6 26: Lcd Adc_string ; " " 27: Waitms 200 28: Loop Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 77 6.9. Latihan-7: Pemanfaatan ADC untuk Sensor Suhu LM35 Pada Gambar 6.18 ditunjukkan rangkaian antarmuka ADC mirip dengan Gambar 6.3, hanya saja potensiometer diganti dengan LM35 sebagai sensor suhu. LM35 memiliki kenaikan linear terhadap suhu, yaitu 10mV per derajat Celcius. Gambar 6.18. Rangkaian ATMega16 dan LM35 Untuk menampilkan suhu pada LCD, program selengkapnya sebagai berikut... 1: ' program LM35.BAS 2: 3: $regfile = "m32def.dat" 4: $crystal = 8000000 5: 6: Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0 7: Config Lcd = 16 * 2 8: Config Adc = Single , Prescaler = Auto , Reference = Avcc 9: Start Adc 10: 11: Dim Data_adc As Word , Adc_convert As Single , Adc_string As String * 10 12: 13: Cursor Off 14: 15: Locate 1 , 1 16: Lcd "Pemantau Suhu" 17: Locate 2 , 1 18: Lcd "Indonesia 2012" 19: Wait 1 20: 21: Cls Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 78 22: 23: Do 24: Data_adc = Getadc(7) 25: Adc_convert = Data_adc 26: Adc_convert = Adc_convert / 1024 27: Adc_convert = Adc_convert * 500 28: Adc_string = Fusing(adc_convert , "#.") 29: 30: Locate 1 , 1 31: Lcd "Data Suhu:" 32: Locate 2 , 2 33: Lcd Adc_string ; " celcius" 34: Waitms 200 35: Loop Penjelasan: Pada baris 8 dilakukan inisialisasi ADC, lihat kembali penjelasan sebelumnya; Baris 24 sampai dengan 27 tipikal pengambilan data ADC seperti pada penjelasan-penjelasan sebelumnya, hanya saja sekarang hasil pembacaan data ADC dikalikan dengan 500, artinya bilangan 5 sebagai tegangan maksimum untuk referensi dan bilangan 100 merupakan konversi untuk LM35 itu sendiri. Kenaikan tegangan linear terhadap suhu, yaitu 10 milivolt per derajat Celcius atau 1/100 volt per derajat Celcius, sehingga masih harus dikalikan dengan 100, jadinya dikalikan 500 (baris 27); Contoh tampilan hasil ditunjukkan pada Gambar 6.19. Gambar 6.19 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 79 6.10. Latihan-8: Pembacaan 2 Kanal ADC pada Mikrokontroler AVR Kali ini akan kita coba menggunakan 2 (dua) potensiometer untuk melakukan pembacaan multikanal ADC pada Mikrokontroler ATMega16, sedangkan LCD yang digunakan masih 2x16, sebagaimana rangkaian antarmukanya ditunjukkan pada Gambar 6.20. Gambar 6.20 Kanal yang digunakan adalah ADC0 dan ADC7, program yang dibuat akan menampilkan hasil pembacaan dari kedua ADC tersebut secara bergantian, perhatikan program selengkapnya berikut ini... ' program ADC02.BAS ' $regfile = "m32def.dat" $crystal = 8000000 Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0 Config Lcd = 16 * 2 Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Dim Data_adc0 As Word , Adc_convert0 As Single , Adc_string0 As String * 10 Dim Data_adc7 As Word , Adc_convert7 As Single , Adc_string7 As String * 10 Cursor Off Cls Do Data_adc0 = Getadc(0) Adc_convert0 = Data_adc0 Adc_convert0 = Adc_convert0 / 1024 Adc_convert0 = Adc_convert0 * 5 Adc_string0 = Fusing(adc_convert0 , "#.##") Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 80 Data_adc7 = Getadc(7) Adc_convert7 = Data_adc7 Adc_convert7 = Adc_convert7 / 1024 Adc_convert7 = Adc_convert7 * 5 Adc_string7 = Fusing(adc_convert7 , "#.##") Locate 1 , 1 Lcd "ADC-0 : " ; Adc_string0 ; "volt" Locate 2 , 1 Lcd "ADC-7 : " ; Adc_string7 ; "volt" Waitms 200 Loop Contoh hasil pembacaan ditunjukkan pada Gambar 6.21 Gambar 6.21 6.11. Latihan-9: Pembacaan 4 Kanal ADC pada Mikrokontroler AVR Jika pada latihan sebelumnya dilakukan pembacaan 2 kanal, pada latihan 10 ini dilakukan pembacaan 4 (empat) kanal ADC dengan rangkaian antarmuka yang ditunjukkan pada Gambar 6.22. Sengaja pemilihan ADC dibuat berurutan (yaitu ADC0, ADC1, ADC2 dan ADC3) sehingga program akan lebih efisien. LCD yang digunakan sudah diganti dengan 4x16 karakter, karena akan ada 4 tampilan pembacaan ADC. Program selengkapnya mirip dengan latihan 9, hanya saja pembacaan ADC menggunakan FOR..NEXT untuk mengefisiensikan penulisan program... ' program ADC03.BAS ' $regfile = "m32def.dat" $crystal = 8000000 Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0 Config Lcd = 16 * 2 Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Dim I As Byte , Num As Byte Dim Data_adc As Word , Adc_convert As Single , Adc_string As String * 10 Cursor Off Cls Do For I = 0 To 3 Data_adc = Getadc(i) Adc_convert = Data_adc Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 81 Adc_convert = Adc_convert / 1024 Adc_convert = Adc_convert * 5 Adc_string = Fusing(adc_convert , "#.##") Num = I + 1 Locate Num , 1 Lcd "ADC-" ; I ; " : " ; Adc_string ; "volt" Waitms 100 Next I Waitms 100 Loop Contoh Hasil ditunjukkan pada Gambar 6.23 Gambar 6.22 Gambar 6.23 - Selesai Modul 6 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 82 Modul-7: Aplikasi RTC dan EEPROM 7.1. Pendahuluan RTC DS1307 Emping (chip/IC) RTC (Real Time Clock) DS1307 bekerja dengan daya rendah (low power), memiliki kalender/jam BCD dan SRAM yangnonvolatiledengan kapasitas 56bytes. Alamat dan data dikirim melalui 2 kabel dwi- arah. Jam dan kalender pada DS1307 menyediakan informasi detik, menit, jam, hari, tanggal, bulan dan tahun. Banyak hari dalam satu bulan diatur secara otomatis oleh IC ini baik untuk 31 hari maupun kurang. Jam bekerja dalam format 24 jam atau 12 jam dengan indikator AM/PM. DS1307 dapat mendeteksi secara otomatis catu dayanya, jika catu daya ke sistem mati, maka secara otomatis DS1307 akan mengambil catu daya dari baterai (jika dipasang). DS 1307 memiliki 8 buah pin dan tersedia dalam bentuk 8-pin DIP serta 8- pin SOIC. Konfigurasi ditunjukkan pada Gambar 7.1. Gambar 7.1. Diagram pin RTC DS1307 Penjelasan Gambar 7.1: VCC, GND: Tegangan DC disediakan pada pin ini. Vcc bernilai 5 volt. Jika diberikan tegangan 5 volt, IC dapat diakses secara penuh baik untuk menulis maupun membaca data. Ketika baterai disambungkan pada IC dan nilai Vcc dibawah 1.25V BAT . Proses penulisan dan pembacaan data tidak dapat dilakukan, namun proses pencacahan waktu tetap berjalan dan tidak terpengaruh oleh penurunan Vcc, karena IC akan mengambil sumber tegangan dari V BAT . VBAT: digunakan sebagai masukan baterai lithium 3 volt atau sumber energi yang lain. Tegangan baterai harus berkisar antara 2 volt sampai 3.5 volt. Baterai lithium48 mA atau lebih besar dapat digunakan lebih dari 10 tahun pada suhu 25C. SCL (Serial Clock Input): SCL digunakan untuk sinkronisasi perpindahan data pada antarmuka serial. SDA (Serial Data Input/Output): SDA berfungsi sebagai pin masukan dan keluaran pada antarmuka serial 2-kabel. Pin SDA dan SCL membutuhkan resistor pull-up sekitar 4K7 ohm. SQW/OUT (Square Wave/Output Driver): jika diaktifkan, SQWE bit harus diset ke 1. SQWE akan mengeluarkan gelombang kotak dengan pilihan frekuensi (1Hz, 4kHz, 8kHz, 32kHz). Pin SQW/OUT membutuhkan resistor pull-up eksternal. SQW/OUT dapat bekerja baik dengan sumber tegangan Vcc maupun tegangan baterai. X1, X2 dihubungkan dengan kristal 32,768kHz. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 83 7.2. Komunikasi I 2 C pada RTC DS1307 Pada komunikasi I2C antara DS1307 dan mikrokontroler, data-data jam dan yang lain dikirim dalam format BCD. Data dikirim per-byte dari mikrokontroler ke DS1307 secara serial. Setelah menerima satu byte data, DS1307 sebagai slave akan mengirimkan sinyal acknowledge ke mikrokontroler. Sinyal acknowledge adalah tanda bahwa satu byte data telah diterima oleh DS1307. Format pengiriman data waktu ke DS1307 ditunjukkan pada Gambar 7.2. Gambar 7.2. Format pengiriman data jam ke DS1307 Untuk format pengiriman data tanggal ditunjukkan pada Gambar 7.3. Data tanggal ditulis mulai alamat 04H. Untuk pengaturan hari tidak dilakukan, karena DS1307 otomatis akan menyesuaikan hari berdasarkan tanggal yang telah diatur. Gambar 7.3. Format pengiriman data tanggal ke DS1307 Pada Gambar 7.4 ditunjukkan format pembacaan data dari DS1307 oleh mikrokotroler. Awal komunikasi, mikrokontroler akan membangkitkan sinyal start I2C. Kemudian mikrokontroler akan mengirimkan alamat grup dari DS1307 yaitu 1101 dan kode untuk menulis ke DS1307 yaitu 0 pada LSB-nya. Kode tulis ini diberikan ke DS1307 karena mikrokontroler akan menuliskan terlebih dahulu alamat awal pembacaan register DS1307 yaitu 00H. Gambar 7.4. Format pembacaan data dari DS1307 Setelah itu, proses pembacaan I2C dimulai. Mikrokontroler mengirimkan alamat DS1307 beserta kode instruksi baca. Proses pembacaan dilakukan per-byte dimulai dari register detik sampai register tahun, alamat masing-masing register tersebut ditunjukkan pada Gambar 7.5. Setelah menerima data 1-byte utuh mikrokontroler akan mengirimkan sinyal acknowledge ke DS1307. Pada akhir pembacaan register tahun, akan dikirim sinyal notacknowledgedan diakhiri dengan sinyal stop. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 84 Gambar 7.5. Register penyimpan informasi kalender di dalam DS1307 7.3. Rangkaian Baku RTC DS1307 Rangkaian baku antara mikrokontroler (misalnya ATMega32) dengan RTC DS1307 ditunjukkan pada Gambar 7.5. terlihat bahwa pinSDA danSCL masing-masing dihubungkan ke dua buah pin yang berbeda pada mikrokontroler, misalnya ke PINC.1 untuk SDA-nya dan ke PINC.0 untuk SCL- nya. Jangan lupa juga memasang tahanan atau resistor pullup sekitar 4K7 pada kedua pin SDA danSCL, jika lupa atau belum terpasang, dipastikan tidak terbaca data-datanya. Gambar 7.5. Rangkaian baku antarmuka DS1307 7.4. Latihan-1: Jam Digital (LCD) dengan RTC DS1307 Okey, setelah sekilas saya berikan penjelasan tentang DS1307, maka ini saat-nya untuk melakukan latihan agar bisa dipahami dengan jelas bagaimana menangani DS1307 menggunakan mikrokontroler AVR, khususnya ATMega8535 (atau juga Atmega lainnya). Rangkaian yang digunakan ditunjukkan pada Gambar 7.6 (Proteus 7.4 SP3). Perhatikan aturan rangkaian baku yang sudah dijelaskan sebelumnya. Pin SDA dan SCL bisa juga Anda hubungkan dengan dua pin terpisah lainnya, asalkan deklarasi pada BASCOM AVR-nya juga menyesuaikan. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 85 Gambar 7.6. Rangkaian jam digital berbasis DS1307 Baiklah, seperti biasa kita awali program kita dengan mendeklarasikan berkas pustaka ATMega32 dan kristal yang digunakan (baris 1 dan 2). Sebagai tambahan kita deklarasikan juga sebuah variabel WEEKDAY sebagai byte (baris 4), variabel ini nantinya akan digunakan untuk membaca hari dalam minggu yang terdapat pada memori internal DS1307. Perlu diketahui juga, ada beberapa variabel yang tidak dideklarasikan secara eksplisit tetapi muncul dalam program, mengapa hal ini bisa terjadi dan tidak menyebabkanerror? Akan dijelaskan lebih lanjut... 1: 'program RTC01.BAS 2: ' 3: $regfile = "m16def.dat" 4: $crystal = 11059200 5: 6: Dim Weekday As Byte 7: 8: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 9: Config Lcd = 16 * 2 10: Config Date = Dmy , Separator = / ' setup format tgl & otomasi dekl. var. ybs 11: Config Clock = User ' aktivasi pemanggilan GetDateTime dari user 12: Berikutnya, karena kita meggunakan LCD untuk menampilkan jam digital kita, maka perlu dilakukan deklarasi LCD seperti biasanya (baris 8 harus diketikkan dalam satu baris, dan baris 9). Okey, sampai disini hal-hal rutin yang telah dijelaskan pada modul-modul sebelumnya sudah kita lakukan (baris 1 sampai dengan 9). Selanjutnya akan saya perkenalkan deklarasi penting yang berhubungan dengan operasi DS1307. Pertama adalahCONFIG DATE sebagaimana ditunjukkan pada baris 10. Instruksi ini digunakan untuk mendefinisikan format tanggal dalam BASCOM AVR. Pada baris 10 tertulis format DMY, artinya Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 86 format DayMonthYear (Tanggal, Bulan, Tahun), dengan demikian Anda bisa menuliskan beberapa macam kemungkinan, misalnya MDY, YMD, YDM dan seterusnya. Kemudian untuk pemisah antara tanggal, bulan dan tahun digunakan tanda / (separator). Instruksi berikutnya, pada baris 11, diperkenalkan deklarasi baru CONFIG CLOCKyang digunakan untuk mengkonfigurasi pewaktu yang digunakan oleh variabel TIME$ dan DATE$. Ini adalah dua variabel yang langsung akan dideklarasikan secara otomatis oleh BASCOM AVR saat Anda memberikan instruksi CONFIG CLOCK. Pilihan ada dua: CONFIG CLOCK =SOFT, artinya menggunakan rutin-rutin jam milik BASCOM AVR, tetapi karena kita ingin menggunakan rutin-rutin sendiri (mengambil data dari piranti eksternal DS1307), maka digunakan instruksi atau deklarasi CONFIG CLOCK =USER, sebagaimana ditunjukkan pada baris 11. Sampai pada baris 11 tersebut, maka BASCOM AVR secara otomatis akan menyiapkan variabel- variabel: _sec , _min , _hour, _day , _month dan _year. Variabel-variabel tersebut yang nantinya akan digunakan dalam program kita, selainTIME$ danDATE$ yang sudah dijelaskan sebelumnya. Baik. Langkah berikutnya adalah mendefisinikan sambungan I2C DS1307 (SCL dan SDA) dengan mikrokontroler, yaitu PORTC.0 dan PORTC.1 sebagaimana ditunjukkan pada baris 15 dan 17 (menyesuaikan rangkaian): 13: '------------------------------------------ 14: ' konfigurasi bus I2C 15: Config Scl = Portc.0 16: ' jalur untuk clock I2C 17: Config Sda = Portc.1 18: ' jalur untuk data I2C 19: '------------------------------------------- 20: Perlu diketahui, komunikasi I2C membutuhkan alamat-alamat akses pada piranti yang bersangkutan. Untuk DS1307, alamat untuk mengakses penulisan memori adalah 0xD0 (&HD0), sedangkan untuk pembacaan data adalah0xD1 (&HD1), kita lakukan dengan dua konstanta berikut (baris 22 dan 24): 21: ' perintah penulisan 22: Const Ds1307w = &HD0 23: ' perintah pembacaan 24: Const Ds1307r = &HD1 25: '------------------------------------------- 26: Mengapa menggunakan alamat &HD0 dan &HD1? Perhatikan Gambar 7.7, pada bagian yang diberi panah, alamat DS1307 diawali dengan &HD, kemudian diikuti dengan pilihan Read atau Write (samping kanan dari bagian yang dipanah), jika menulis data R/W=0, untuk membaca data R/W=1, dengan demikian jika digabungkan menjadi &HD0 untuk penulisan data dan &HD1 untuk pembacaan data. Gambar 7.7. Perhatikan tanda panah untuk penentuan alamat baca/tulis register Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 87 Baiklah, sudah kita siapkan semuanya, sekarang tinggal menuliskan rutinitas program-nya. Yaitu menampilkan jam digital melalui LCD 2x16 karakter. Kita awali dengan menampilkan salam pembuka melalui layar LCD, silahkan mengganti sendiri kalau dirasa kurang menarik, atau hapus saja kalau dirasa tidak perlu. Rangkaian instruksi-nya ditunjukkan pada baris 28 sampai dengan 32, perlu ditahan sekitar 1 detik untuk menampilkan salam pembuka, apalagi kalau ada nama Anda ditampilkan di LCD, keren khan... he he he... 27: '------------------------------------------- 28: Cls 29: Cursor Off 30: Locate 1 , 3 31: Lcd "DS1307 demo!" 32: Wait 1 33: Rutinitas-nya ditunjukkan antara DO dan LOOP pada baris 33 sampai dengan 42. Sebentar! Kok cuman kayak gitu? Mosok gak ada pemanggilan subrutin baca data dari DS1307?? Nah itu dia kelebihan saya... eh bukan maksudnya BASCOM AVR. Karena sudah kita definisikan menggunakan CONFIG CLOCK = USER, maka program akan secara otomatis memanggil subrutin internal GetDateTime (nama ini harus ditulis persis dan nantinya akan dijelaskan lebih lanjut). So, yang perlu dilakukan dalam hal ini hanya cukup menampilkan isi dari variabel TIME$ (baris 35 dan 36) serta isi variabel DATE$ (baris 37 dan 38), cukup mudah bukan? 34: '------------------------------------------- 35: Cls 36: Do ' jalankan setiap saat 1 detik sekali 37: Locate 1 , 2 38: Lcd Time$ 39: Locate 2 , 2 40: Lcd Date$ 41: 42: Wait 1 ' tunggu 1 detik 43: 44: Loop 45: '------------------------------------------- 46: End 47: Okey, kalau begitu mana rutinGetDateTime-nya? Ini dia... 48: Getdatetime: 49: I2cstart 50: I2cwbyte Ds1307w 51: I2cwbyte 0 52: 53: I2cstart 54: I2cwbyte Ds1307r 55: I2crbyte _sec , Ack ' _sec sdh otomatis terdefinisi 56: I2crbyte _min , Ack 57: I2crbyte _hour , Ack 58: I2crbyte Weekday , Ack 59: I2crbyte _day , Ack 60: I2crbyte _month , Ack 61: I2crbyte _year , Nack 62: I2cstop 63: _sec = Makedec(_sec) 64: _min = Makedec(_min) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 88 65: _hour = Makedec(_hour) 66: _day = Makedec(_day) 67: _month = Makedec(_month) 68: _year = Makedec(_year) 69: Return Ini adalah rutin I2C yang perlu dilakukan agar dapat dibaca data tanggal sekaligus jam-nya RTC DS1307. Ingat setiap piranti I2C memiliki cara akses yang berbeda, cara yang saya jelaskan disini hanya berlaku untuk RTC DS1307. Rutin diawali dengan instruksi I2CSTART (baris 49) dan dilanjutkan dengan dua kali I2CWBYTE (perintah I2C untuk menuliskan data) yang ditunjukkan pada baris 50 dan 51. I2CWBYTE DS1307W (baris 50) digunakan untuk memberitahukan DS1307 alamat akses untuk penulisan data pada register di alamat &HD0 (lihat penjelasan paling awal di modul ini). Kemudian diakhiri dengan I2CWBYTE 0 (baris 51). Selanjutnya setelah ketiga instruksi tersebut, DS1307 sudah siap (ready) baik untuk urusan penulisan data maupun pembacaan data. Karena pada aplikasi ini hanya dibaca saja data dari DS1307, maka rangkaian perintah diawali denganI2CSTART (baris 53), diikuti denganI2CWBYTE DS1307R (baris 54) untuk akses pembacaan register pada alamat &HD1. Langkah selanjutnya adalah proses pembacaan data itu sendiri, dimulai dengan data detik, menggunakan instruksi I2CRBYTE, sebagaimana ditunjukkan pada baris 53, yang kemudian disimpan dalam variabel _sec. Parameter ACK pada akhir instruksi I2CRBYTE digunakan untuk memberitahukan masih ada data lain yang perlu dibaca, yaitu menit (baris 56), kemudian data jam (baris 57) dan seterusnya (baris 58 sampai dengan 61). Diakhiri dengan menghentikan I2C menggunakan instruksi I2CSTOP. Langkah berikutnya adalah mengubah data-data yang telah terbaca, karena masih dalam format BCD, menjadi data desimal menggunakan fungsi MAKEDEC(), sebagaimana ditunjukkan pada baris 63 sampai 68. Contoh tampilan hasil ditunjukkan pada Gambar 7.8. Gambar 7.8 Program selengkapnya sebagai berikut... 'program RTC01.BAS ' $regfile = "m16def.dat" $crystal = 11059200 Dim Weekday As Byte Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 89 Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 Config Lcd = 16 * 2 Config Date = Dmy , Separator = / ' setup format tgl & otomasi deklarasi var. ybs Config Clock = User ' aktivasi pemanggilan GetDateTime dari user '------------------------------------------ ' konfigurasi bus I2C Config Scl = Portc.0 ' jalur untuk clock I2C Config Sda = Portc.1 ' jalur untuk data I2C '------------------------------------------- ' perintah penulisan Const Ds1307w = &HD0 ' perintah pembacaan Const Ds1307r = &HD1 '------------------------------------------- '------------------------------------------- Cls Cursor Off Locate 1 , 3 Lcd "DS1307 demo!" Wait 1 '------------------------------------------- Cls Do ' jalankan setiap saat 1 detik sekali Locate 1 , 2 Lcd Time$ Locate 2 , 2 Lcd Date$ Wait 1 ' tunggu 1 detik Loop '------------------------------------------- End Getdatetime: I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cstart I2cwbyte Ds1307r I2crbyte _sec , Ack ' _sec sdh otomatis terdefinisi I2crbyte _min , Ack I2crbyte _hour , Ack I2crbyte Weekday , Ack I2crbyte _day , Ack I2crbyte _month , Ack I2crbyte _year , Nack I2cstop _sec = Makedec(_sec) _min = Makedec(_min) _hour = Makedec(_hour) _day = Makedec(_day) _month = Makedec(_month) _year = Makedec(_year) Return Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 90 7.5. Latihan-2: Jam Digital (LCD) dengan RTC DS1307, Alternatif Masih sama seperti contoh sebelumnya, hanya saja, tampilan awal jam digital kita diinginkan pada tanggal 01 Januari 2010 jam 00:00:00. So bagaimana caranya? Berarti harus dimodifikasi agar dapat menuliskan atau mengatur jam dan tanggal di dalam DS1307. Tambaha instruksi yang perlu diberikan adalah langsung memberikan pengaturan jam dan tanggal masing-masing ke variabel TIME$ danDATE$ sebagaimana ditunjukkan berikut ini, baris 30 dan 31: Tidak hanya mengatur isi variabel TIME$ dan DATE$, namun perlu juga dituliskan rutin untuk menyimpan data, ingat MENYIMPAN data, bukan membaca data. Artinya, ketika BASCOM AVR mengeksekusi baris 30 dan 31, otomatis akan dipanggil sebuah rutinSETTIME danSETDATE. Untuk itulah kita harus mempersiapkan kedua rutin tersebut, cara penggunaan I2C-nya sama saja, hanya sekarang digunakan perintahI2CRBYTE untuk menuliskan data, perhatikan subrutinSETDATE berikut ini: Dan subrutinSETTIME berikut ini: Kedua subrutin tersebut diawali dengan menyiapkan data, karena data-nya masih dalam bentuk desimal, sedangkan penyimpanan di dalam DS1307 dalam format BCD, maka digunakan instruksi MAKEBCD (kebalikan dari MAKEDEC sebagaimana dijelaskan sebelumnya). Perhatikan baris 69 dan 80. Selanjutnya prosedur akses I2C sama dengan sebelumnya (baris 70, 71 dan 72 serta 81, 82 dan 83), kemudian diikuti dengan inisialisasi register untuk menyimpa data atau write pada alamat &HD1, sebagaimana ditunjukkan pada baris 71 dan 82. Dan diakhiri dengan menyimpan masing- masing data, jam, menit dan detik (pada baris 84 sampai 86) serta tanggal, bulan dan tahun (pada baris 73 sampai 75) dan dilanjutkan dengan perintah menghentikan I2C dengan I2CSTOP (baris 76 dan 87). Program selengkapnya sebagai berikut: 'program RTC02.BAS ' $regfile = "m16def.dat" Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 91 $crystal = 11059200 Dim Weekday As Byte Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 Config Lcd = 16 * 2 Config Date = Dmy , Separator = / Config Clock = User Declare Sub Baca_waktu '------------------------------------------ ' konfigurasi bus I2C Config Scl = Portc.0 ' jalur untuk clock I2C Config Sda = Portc.1 ' jalur untuk data I2C '------------------------------------------- ' perintah penulisan Const Ds1307w = &HD0 ' perintah pembacaan Const Ds1307r = &HD1 '------------------------------------------- Cls Locate 1 , 3 Lcd "DS1307 demo!" Date$ = "01/01/10" Time$ = "00:00:00" Wait 1 Cls Do Locate 1 , 2 Lcd Time$ Locate 2 , 2 Lcd Date$ Wait 1 Loop End Getdatetime: I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cstart I2cwbyte Ds1307r I2crbyte _sec , Ack I2crbyte _min , Ack I2crbyte _hour , Ack I2crbyte Weekday , Ack I2crbyte _day , Ack I2crbyte _month , Ack I2crbyte _year , Nack I2cstop _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour) _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year) Return Setdate: _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year) I2cstart ' Generate start code I2cwbyte Ds1307w ' send address Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 92 I2cwbyte 4 ' starting address in 1307 I2cwbyte _day ' Send Data to SECONDS I2cwbyte _month ' MINUTES I2cwbyte _year ' Hours I2cstop Return Settime: _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour) I2cstart ' Generate start code I2cwbyte Ds1307w ' send address I2cwbyte 0 ' starting address in 1307 I2cwbyte _sec ' Send Data to SECONDS I2cwbyte _min ' MINUTES I2cwbyte _hour ' Hours I2cstop Return 7.6. Latihan-3: Akses EEPROM Internal Mikrokontroler ATMega16 Sebagaimana diketahui sebelumnya, bahwa ATMeag16 memiliki EEPROM internal dengan kapasitas 512 byte (ATMega32 sebesar 1024 byte). EEPROM internal yang lumayan terbatas kapasitas-nya ini sudah membuat kita lega sedikit karena bisa menyimpan data-data (dalam satuan byte) tanpa khawatir hilang data walaupun catu daya ke mikrokontroler yang bersangkutan sudah tidak ada lagi (alat dimatikan). Latihan kali ini kita fokus pada akses EEPROM internalini. Bagaimana caranya? Mari kita mulai membahas langkah demi langkah... Okey, kita awali dengan rangkaian yang digunakan, cukup sederhana, dalam hal ini hanya digunakan sebuah LCD (Gambar 7.6) untuk memberitahukan kepada kita apa yang terjadi di-dalam sana, maksudnya di dalam mikrokontroler yang bersangkutan. Nantinya aplikasi ini hanya akan menuliskan 10 bilangan acak ke EEPROM mulai alamat 0 sampai dengan 9. Cukup sederhana karena yang ditekankan adalah konsep pengaksesan EEPROM yang begitu mudah menggunakan BASCOM AVR dari MCSELEC. Diawali dengan deklarasi berkas pustaka seperti biasanya... $regfile = m32def.dat $crystal = 7372800 Selanjutnya badan program-nya sama semua. Kita awali dengan mendeklarasikan konfigurasi LCD sesuai dengan ketentuan yang saya berikan sebelumnya, sekaligus mendefinisikan beberapa variabel yang terkait atau terlibat Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Porta.1 , Rs = Porta.0 Config Lcd = 16 * 2 Dim X As Byte , I As Byte , D As Byte Berikutnya menampilkan layar pembuka pada LCD dengan tundaan sekitar 3 detik Cls Locate 1 , 1 Lcd ATMega-32 Locate 2 , 1 Lcd Demo EEPROM Wait 3 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 93 Jika Anda ingat, perintahLOCATE digunakan untuk menempatkan kursor pada LCD, sehinggaLOCATE 2,1 artinya tempatkan kursor LCD pada posisi baris 2, kolom 1 demikian seterusnuya. Sedangkan perintah LCD diikuti dengan parameter teks yang akan ditampilkan pada LCD, karena LCD-nya ukuran 2 baris x16 karakter, jika teks lebih dari 16 akan terpotong. Berikutnya menyiapkan tampilan proses untuk penulisan data dan pembacaan data ke/dari EEPROM melalui LCD 216 karakter Cls Locate 1 , 1 Lcd menulis EEPROM.. Locate 2 , 1 Lcd datanya= Untuk penulisan data-data acak ke EEPROM yang bersangkutan, mulai dari alamat 0 sampai dengan 9 gunakan potongan program berikut For I = 0 To 9 Locate 2 , 9 D = Rnd(100) Lcd D Writeeeprom D , I Wait 1 Next I Instruksi WRITEEEPROM diikuti dengan parameter DATA danALAMAT eeprom, sedangkan untuk mendapatkan data-data acak digunakan fungsi RND(100), artinya hasilkan bilangan acak dengan bilangan maksimum 100. Berikutnya menyiapkan tampilan pada LCD untuk pembacaan data Locate 2 , 1 Lcd selesai menulis! Wait 2 Cls Locate 1 , 1 Lcd membaca EEPROM.. Locate 2 , 1 Lcd data ke- Untuk pembacaan data-data yang sudah kita tuliskan sebelumnya (10 bilangan acak mulai lokasi 0 sampai dengan 9) gunakan potongan program berikut For I = 0 To 9 Locate 2 , 9 Readeeprom X , I Lcd I ; = ; X Wait 1 Next I End Jangan lupa akhiri program dengan pernyataan END! Program selengkapnya sebagai berikut... 1: ' eeprom_avr.bas 2: 3: $crystal = 7372800 4: $regfile = "m32def.dat" 5: 6: Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Porta.1 , Rs = Porta.0 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 94 7: Config Lcd = 16 * 2 8: 9: Dim X As Byte , I As Byte , D As Byte 10: 11: Cls ; tampilkan pembuka di LCD 12: Locate 1 , 1 13: Lcd "ATMega-32" 14: Locate 2 , 1 15: Lcd "Demo EEPROM" 16: 17: Wait 3 ; tunggu 3 detik 18: 19: Cls ; tampilkan proses menulis di LCD 20: Locate 1 , 1 21: Lcd "menulis EEPROM.." 22: Locate 2 , 1 23: Lcd "datanya=" 24: 25: For I = 0 To 9 ; mulai proses penulisan EEPROM 26: Locate 2 , 9 27: D = Rnd(100) 28: Lcd D 29: Writeeeprom D , I 30: Wait 1 31: Next I 32: 33: Locate 2 , 1 ; tulis status selesai menulis di LCD 34: Lcd "selesai menulis!" 35: Wait 2 36: 37: Cls ; tampilkan proses membaca di LCD 38: Locate 1 , 1 39: Lcd "membaca EEPROM.." 40: Locate 2 , 1 41: Lcd "data ke-" 42: 43: For I = 0 To 9 ; mulai proses membaca isi EEPROM 44: Locate 2 , 9 45: Readeeprom X , I 46: Lcd I ; " = " ; X 47: Wait 1 48: Next I 49: 50: End Hal yang perlu diperhatikan adalah catatan dari sahabat saya masAnang Dono Prasetyo: Jika tegangan kurang dari yg diperlukan mikro, memang mikro akan salah menjalankan program. Salah ini bisa berupa mengendalikan port2 yg salah, salah data komunikasi dan juga dapat mengganti data pada EEPROM. Parahnya lagi kesalahan itu random!!! tdk bisa ditanggulangi dgn program. HAL INI SANGAT BERBAHAYA JIKA MENYANGKUT SISTEM YG SENSITIF. Sulusinya adalah dengan menggunakan Brown-out Detection(BOD). Kalo pada mikro klan MCS51 sepertinya kita harus membuat rangkaian BOD sendiri di luar mikro, kalo mikro klan AVR sudah menyediakan BOD on-chip. Cara kerja BOD adalah; mikro akan berhenti bekerja jika tegangan sumber melewati batas bawah tegangan BOD (VBOD-) dan akan bekerja lagi(dianggap reset) jika tegangan telah melebihi batas Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 95 atas tegangan BOD (VBOD+). selisih VBOD- dan VBOD+disebut tegangan histerisis (VHYST). Dengan adanya fasilitas BOD ngak ada lagi mikro yg ngawur.. Lalu bagaimana menggunakannya? Contoh: ATmega8 Kita tinggal mengaktifkan fuse BODEN, maka BOD akan bekerja dengan VBOD- =3.7V dan VBOD+= 4.5V. Artinya jika VCC kurang dari 4.5V, mikro tdk bekerja. Jika di atas 4.5V, mikro akan mulai bekerja. Setelah bekerja jika VCC turun di bawah 3.7V, mikro akan berhenti bekerja. Untuk dapat bekerja kembali tegangan VCC harus di atas 4.5V. Jika terpenuhi maka mikro akan bekerja kembali dari awal program, bukan melanjutkan program sebelumnya pada waktu tegangan turun. Satu lagi fuse yg berhubungan dengan BOD yaitu BODLEVEL. tapi fuse ini bekerja untuk ATmega8L. Untuk lengkapnya lihat ATmega8.pdf hal:38 trimakasih. 7.7. 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) 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 7.9. Sedangkan diagram blok-nya ditunjukkan pada Gambar 7.10. 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. 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 7.11. 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. Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 96 Gambar 7.9. Diagram Pin AT24C32/64 Gambar 7.10. Diagram blok AT24C32/64 Gambar 7.11. Pengalamatan divais AT24C32/64 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 97 7.8. Latihan-4: Akses EEPROM Eksternal AT24C64 Okey, setelah Anda membaca tentang AT24C64, sekarang kita belajar mengakses divais tersebut. Rangkaian yang digunakan ditunjukkan pada Gambar 7.6. A2, A1 dan A0 sebagai alamat divais kita GND-kan semua sehingga nilai binernya 000. Kita awali, seperti biasa dengan deklarasi penting di awal program (pustaka, kristal, lcd, dan lain sebagainya): 1: ' program eeprom_ext01.bas 2: ' menulis dan membaca eeprom at24c64 3: ' alamat divais dalam format 1010, a2, a1, a0, r/w 4: ' r/w = 0 (menulis), 1 (membaca) 5: ' 6: $regfile = "m16def.dat" 7: $crystal = 11059200 8: 9: Dim D_w As Byte , D_r As Byte 10: 11: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 12: Config Lcd = 16 * 2 13: Baris 6 dan 7 sudah jelas dan tidak perlu saya ulang-ulang, toch nanti Anda malah bosan sendiri (he he he he). Baris 9 kita deklarasikan dua buah variabel D_w danD_r yang semuanya bertipe byte dan masing-masing digunakan untuk menyimpan data yang akan dituliskan ke eeprom serta hasil pembacaan eeprom alamat tertentu (dalam latihan ini kita menulis ke alamat atau lokasi 0x0000 di dalam eeprom). Baris 11 dan 12 juga sudah jelas. Kita lanjutkan ke baris-baris berikutnya... 14: Config Scl = Portc.0 15: Config Sda = Portc.1 16: 17: Locate 1 , 1 18: Lcd " Demo EEPROM " 19: Locate 2 , 1 20: Lcd " AT24C64" 21: Wait 1 22: 23: D_w = 100 24: Sama seperti latihan akses RTC DS1307, baris 14 dan 15 digunakan untuk mendefinisikan pin berapa saja pada mikrokontroler yang digunakan sebagai kaki SCL dan SDA. Kemudian diikuti dengan membuat tampilan pembuka melalui LCD (baris 17 hingga 20), ditahan 1 detik saja (baris 21) serta menyiapkan data yang akan dituliskan ke serial eeprom at24c64. Ok, next... 25: '********** menulis satu byte ke EEPROM 26: I2cstart 'memulai 27: I2cwbyte &B10100000 'kirim alamat divais 28: I2cwbyte 0 'H adress dari EEPROM 29: I2cwbyte 0 'L adress dari EEPROM 30: I2cwbyte D_w 'data ke EEPROM 31: I2cstop 'berhenti 32: Waitms 10 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 98 33: Sederetan instruksi di baris 26 hingga 31 merupakan rutin untuk menulis suatu data (byte) ke serial eeprom at24c32/64: Diawali dengan inisialisasi I2C (juga seperti pada contoh DS1307) perhatikan baris 26; Kirim alamat divais yaitu 1010 (rujukan Gambar 7.6) dikuti dengan 000 (karena A2, A1 dan A0 di-GND-kan semua), kemudian R/W=0 operasi penulisan. Sehingga alamat divaisnya adalah 10100000; Kirim alamat HIGH (baris 28) dan LOW (baris 29) pada eeprom yaitu lokasi 0x0000; Baru dituliskan datanya (Baris 30); Hentikan proses I2C (baris 31); Tunggu kira-kira 10 milidetik agar at24C64 menyelesaikan prosesnya. Selanjutnya... untuk membaca data... 34: '********** membaca dari EEPROM 35: I2cstart 'mulai 36: I2cwbyte &B10100000 'kirim alamat divais 37: I2cwbyte 0 'H address dari EEPROM 38: I2cwbyte 0 'L address dari EEPROM 39: I2cstart 'ulangi start 40: I2cwbyte &B10100001 'alamat slave untuk pembacaan 41: I2crbyte D_r , Nack 'baca byte dari EEPROM 42: I2cstop ' stop 43: Penjelasan atau algoritma-nya sama seperti penulisan ke eeprom, hanya sajai2cstart() diulangi lagi (baris 39) yang kemudian diikuti dengan pengiriman alamat divais 10100001 (bit terakhir sama dengan 1 karena operasi pembacaan data, perhatikan baris 40). Dilanjutkan dengan membaca data di alamat atau lokasi 0x0000 dari serial eeprom (abris 41). Caranya mirip dengan latihan akses RTC DS1307. Bagian terakhir adalah menampilkan isi variabel D_w (data yang ditulis ke eeprom) dengan isi variabel D_r (hasil pembacaan dari eeprom) ke LCD... 44: Cls 45: Upperline 46: Lcd "D_w= " 47: Lcd D_w 'show byte on LCD 48: Lowerline 49: Lcd "D_r= " 50: Lcd D_r 51: 52: End Program selengkapnya... ' program eeprom_ext01.bas ' menulis dan membaca eeprom at24c64 ' alamat divais dalam format 1010, a2, a1, a0, r/w ' r/w = 0 (menulis), 1 (membaca) ' $regfile = "m16def.dat" $crystal = 11059200 Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 99 Dim D_w As Byte , D_r As Byte Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 Config Lcd = 16 * 2 Config Scl = Portc.0 Config Sda = Portc.1 Locate 1 , 1 Lcd " Demo EEPROM " Locate 2 , 1 Lcd " AT24C64" Wait 1 D_w = 100 '********** menulis satu byte ke EEPROM I2cstart 'memulai I2cwbyte &B10100000 'kirim alamat divais I2cwbyte 0 'H adress dari EEPROM I2cwbyte 0 'L adress dari EEPROM I2cwbyte D_w 'data ke EEPROM I2cstop 'berhenti Waitms 10 '********** membaca dari EEPROM I2cstart 'mulai I2cwbyte &B10100000 'kirim alamat divais I2cwbyte 0 'H address dari EEPROM I2cwbyte 0 'L address dari EEPROM I2cstart 'ulangi start I2cwbyte &B10100001 'alamat slave untuk pembacaan I2crbyte D_r , Nack 'baca byte dari EEPROM I2cstop ' stop Cls Upperline Lcd "D_w= " Lcd D_w 'show byte on LCD Lowerline Lcd "D_r= " Lcd D_r End 7.9. Latihan-5: Akses EEPROM Eksternal AT24C64 alternatif SUBRUTIN Program berikut ini sama seperti program sebelumnya, hanya saja kita buat subrutin untuk menulis dan membaca data dari eeprom, berikut listingnya... 1: ' program eeprom_ext02.bas - modifikasi subrutin 2: ' menulis dan membaca eeprom at24c64 3: ' alamat divais dalam format 1010, a2, a1, a0, r/w 4: ' r/w = 0 (menulis), 1 (membaca) Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 100 5: ' 6: $regfile = "m16def.dat" 7: $crystal = 11059200 8: 9: Dim D_w As Byte , D_r As Byte 10: Dim Almt_h As Byte , Almt_l As Byte 11: 12: Declare Sub I2c_eeprom_tulis(byval Alamat As Word , Byval Isi As Byte) 13: Declare Sub I2c_eeprom_baca(byval Alamat As Word) 14: 15: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 16: Config Lcd = 16 * 2 17: 18: Config Scl = Portc.0 19: Config Sda = Portc.1 20: 21: Locate 1 , 1 22: Lcd " Demo EEPROM " 23: Locate 2 , 1 24: Lcd " AT24C64" 25: Wait 1 26: 27: D_w = 100 28: 29: Call I2c_eeprom_tulis(0 , D_w) 30: Call I2c_eeprom_baca(0) 31: 32: Cls 33: Upperline 34: Lcd "D_w= " 35: Lcd D_w 'show byte on LCD 36: Lowerline 37: Lcd "D_r= " 38: Lcd D_r 39: 40: End 41: 42: Sub I2c_eeprom_tulis(byval Alamat As Word , Byval Isi As Byte) 43: '********** menulis satu byte ke EEPROM 44: Almt_h = High(alamat) 45: Almt_l = Low(alamat) 46: I2cstart 'memulai 47: I2cwbyte &B10100000 'kirim alamat divais 48: I2cwbyte Almt_h 'H adress dari EEPROM 49: I2cwbyte Almt_l 'L adress dari EEPROM 50: I2cwbyte Isi 'data ke EEPROM 51: I2cstop 'berhenti 52: Waitms 10 53: End Sub 54: 55: Sub I2c_eeprom_baca(byval Alamat As Word) 56: '********** membaca dari EEPROM 57: Almt_h = High(alamat) 58: Almt_l = Low(alamat) 59: I2cstart 'mulai 60: I2cwbyte &B10100000 'kirim alamat divais 61: I2cwbyte Almt_h 'H address dari EEPROM 62: I2cwbyte Almt_l 'L address dari EEPROM 63: I2cstart 'ulangi start 64: I2cwbyte &B10100001 'alamat slave untuk pembacaan Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra Hal. 101 65: I2crbyte D_r , Nack 'baca byte dari EEPROM 66: I2cstop 'berhenti 67: End Sub Penjelasan singkat: Hal yang perlu Anda perhatikan adalah deklarasi variabel sebagaimana ditunjukkan pada baris 12 dan 13. PenggunaanByval untuk mengirim parameter ke dalam subrutin, jika keluar tidak perlu dituliskan apapun atau gunakanByRef, default jika tidak dituliskan adalahByRef; Juga pada masing-masing subrutin itu sendiri: o SubrutinI2c_eeprom_tulis pada baris 42-53, dan o SubrutinI2c_eeprom_baca pada baris 55-67. Untuk latihan: o Buatlah program menuliskan dan membaca kembali 10 bilangan acak dari angka 20 hingga 50 ke dalam eeprom mulai alamat 0x0000; o Buatlah program untuk menuliskan data-data eeprom satu persatu melalui terminal komputer, kemudian membaca kembali Selamat mencoba dan berlatih! - Selesai Modul 9