Anda di halaman 1dari 0

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

Anda mungkin juga menyukai