Mudah Pemrograman Mikrokontroller ATMEL AVR Dengan BASCOM AVR PDF
Mudah Pemrograman Mikrokontroller ATMEL AVR Dengan BASCOM AVR PDF
Daftar Isi
Modul-1: ATMega16 DAN BASCOM AVR .......................................................................................... 1
1.1. Apakah Mikrokontroler itu? ............................................................................................... 1
1.2. Pengetahuan Dasar Mikrokontroler AVR ............................................................................ 3
1.2.1. Pendahuluan .............................................................................................................. 3
1.2.2. Memilih AVR yang benar ......................................................................................... 4
1.3. Ada Apa dengan Mikrokontroler AVR ATMega16?.............................................................. 5
1.4. Ringkasan Fitur-fitur Mikrokontroler AVR ATMega16 ......................................................... 5
1.5. Diagram Pin dan Diagram Blok Mikrokontroler AVR ATMega16 .......................................... 7
1.6. Penjelasan Singkat Pin-pin pada Mikrokontroler AVR ATMega16........................................ 9
1.7. Mengawali Membuat Aplikasi berbasis Mikrokontroler AVR............................................. 10
1.8. Bahasa Pemrograman BASIC AVR (BASCOM AVR)............................................................. 14
1.8.1. Tipe Data .................................................................................................................. 14
1.8.2. Variabel .................................................................................................................... 14
1.8.3. Konstanta ................................................................................................................. 15
1.8.4. Penulisan Bilangan ................................................................................................... 16
1.8.5. Alias ......................................................................................................................... 16
1.8.6. Array atau Larik ........................................................................................................ 16
1.8.7. Operator .................................................................................................................. 16
1.8.8. Operasi Bersyarat ..................................................................................................... 17
1.8.9. Pengulangan Operasi ................................................................................................ 18
1.8.10. Lompatan Proses ...................................................................................................... 19
Modul-2: Konsep I/O ATMega16 (LED dan Pushbutton) ................................................................. 20
2.1. Rangkaian LED CC Common Cathode ............................................................................. 20
2.2. Latihan-1: Menghidupkan semua LED ............................................................................... 20
2.3. Latihan-2: Menghidupkan dan Mematikan LED ................................................................ 21
2.4. Latihan-3: Animasi LED ..................................................................................................... 22
2.5. Latihan-4: Animasi LED Alternatif Program .................................................................... 23
2.6. Latihan-5: Animasi LED Lainnya ........................................................................................ 24
2.7. Latihan-6: Penerjemahan Penekanan PushButton pada Tampilan LED .............................. 24
2.8. Latihan-7: Pushbutton dan Animasi LED ........................................................................... 26
Modul-3: Timer, Counter dan PWM................................................................................................ 27
3.1. Pendahuluan Timer dan Counter ...................................................................................... 27
3.2. Tentang Timer0 dan Timer2 ............................................................................................. 27
3.3. Timer0, Timer2 dan BASCOM AVR .................................................................................... 28
3.4. Tentang Timer1 ................................................................................................................ 29
3.5. Latihan-1: Menggunakan Timer1 ...................................................................................... 30
3.6. Latihan-2: Menggunakan Timer0 ...................................................................................... 36
3.7. Latihan-3: Menggunakan Counter0 .................................................................................. 39
3.8. Latihan-4: Menggunakan Fasilitas Capture pada Timer1 ................................................... 41
3.9. Latihan-5: Tentang PWM (Pulse Width Modulation) ......................................................... 42
Modul-4: Konsep Interupsi ............................................................................................................. 47
4.1. Pendahuluan Interupsi ..................................................................................................... 47
4.2. Latihan-1: Interupsi Eksternal 0 dan 1............................................................................... 48
4.3. Latihan-2: Program Apakah ini?! ...................................................................................... 50
4.4. Latihan-3: Membuat STOPWATCH .................................................................................... 51
Modul-5: Komunikasi Serial ............................................................................................................ 55
5.1. Komunikasi Serial ............................................................................................................. 55
5.2. Penjelasan Instruksi dan Directive Komunikasi Serial ........................................................ 55
Hak Cipta dilindungi Undang-Undang, 2010 (c) Agfianto Eko Putra
Sama-sama memiliki unit pengolah pusat atau yang lebih dikenal dengan CPU (Central
Processing Unit);
CPU tersebut sama-sama menjalankan program dari suatu lokasi atau tempat, biasanya dari
ROM (Read Only Memory)1 atau RAM (Random Access Memory)2;
Sama-sama memiliki RAM yang digunakan untuk menyimpan data-data sementara atau
yang lebih dikenal dengan variabel-variabel;
Sama-sama memiliki beberapa luaran dan masukan (I/O) yang digunakan untuk melakukan
komunikasi timbal-balik dengan dunia luar, melalui sensor (masukan) dan aktuator (luaran),
perhatikan bagan yang ditunjukkan pada Gambar 1.1.
Lantas apa yang membedakan antara Mikrokontroler dengan Komputer atau Mikrokomputer?
Begitu mungkin pertanyaan yang ada di benak kita, saat kita membaca beberapa daftar kesamaan
yang sudah saya tuliskan tersebut. Sama sekali berbeda, itu jawaban yang saya berikan kepada Anda:
Mikrokontroler adalah versi mini dan untuk aplikasi khusus dari Mikrokomputer atau Komputer!
Berikut saya berikan kembali daftar kesamaan yang pernah kemukakan sebelumnya dengan
menekankan pada perbedaan antara Mikrokontroler dan Mikrokomputer:
CPU pada sebuah Komputer berada eksternal dalam suatu sistem, sampai saat ini kecepatan
operasionalnya sudah mencapai lebih dari 2,5 GHz, sedangkan CPU pada Mikrokontroler
berada didalam (internal) sebuah chip, kecepatan kerja atau operasionalnya masih cukup
rendah, dalam orde MHz (misalnya, 24 MHz, 40 MHz dan lain sebagainya). Kecepatan yang
relatif rendah ini sudah mencukupi untuk aplikasi-aplikasi berbasis mikrokontroler.
Jika CPU pada mikrokomputer menjalankan program dalam ROM atau yang lebih dikenal
dengan BIOS (Basic I/O System) pada saat awal dihidupkan, kemudian mengambil atau
1
Memori yang hanya bisa dibaca saja.
2
Memori yang bisa dibaca juga bisa ditulisi.
Hal. 1
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
menjalankan program yang tersimpan dalam hard disk. Sedangkan mikrokontroler sejak
awal menjalankan program yang tersimpan dalam ROM internal-nya (bisa berupa Mask
ROM atau Flash PEROM atau Flash ROM). Sifat memori program dalam mikrokontroler ini
non-volatile, artinya tetap akan tersimpan walaupun tidak diberi catu daya.
RAM pada mikrokomputer bisa mencapai ukuran sekian GByte dan bisa di-upgrade ke
ukuran yang lebih besar dan berlokasi di luar CPU-nya, sedangkan RAM pada mikrokontroler
ada di dalam chip dan kapasitasnya rendah, misalnya 128 byte, 256 byte dan seterusnya dan
ukuran yang relatif kecil inipun dirasa cukup untuk aplikasi-aplikasi mikrokontroler.
Luaran dan masukan (I/O) pada mikrokomputer jauh lebih kompleks dibandingkan dengan
mikrokontroler, yang jauh lebih sederhana, selain itu, pada mikrokontroler akses keluaran
dan masukan bisa per bit.
Jika diamati lebih lanjut, bisa dikatakan bahwa Mikrokomputer atau Komputer merupakan
komputer serbaguna atau general purpose computer, bisa dimanfaatkan untuk berbagai
macam aplikasi (atau perangkat lunak). Sedangkan mikrokontroler adalah special purpose
computer atau komputer untuk tujuan khusus, hanya satu macam aplikasi saja.
Perhatikan Gambar 1.2, agar Anda mendapatkan gambaran tentang mikrokontroler lebih jelas.
ALU, Instruction Decoder, Accumulator dan Control Logic, sebagaimana ditunjukkan pada Gambar
1.2, merupakan Otak-nya mikrokontroler yang bersangkutan. Jantungnya berasal dari detak OSC
(lihat pada Gambar 1.2 sebelah kiri atas). Sedangkan di sekeliling Otak terdapat berbagai macam
periferal seperti SFR (Special Function Register) yang bertugas menyimpan data-data sementara
selama proses berlangsung). Instruction Decoder bertugas menerjemahkan setiap instruksi yang ada
di dalam Program Memory (hasil dari pemrograman yang kita buat sebelumnya). Hasil
penerjemahan tersebut merupakan suatu operasi yang harus dikerjakan oleh ALU (Arithmetic Logic
Unit), mungkin dengan bantuan memori sementara Accumulator yang kemudian menghasilkan
sinyal-sinyal kontrol ke seluruh periferal yang terkait melalui Control Logic.
Memori RAM atau RAM Memory bisa digunakan sebagai tempat penyimpan sementara, sedangkan
SFR (Special Function Register) sebagian ada yang langsung berhubungan dengan I/O dari
Hal. 2
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
mikrokontroler yang bersangkutan dan sebagian lain berhubungan dengan berbagai macam
operasional mikrokontroler.
ADC atau Analog to Digital Converter (tidak setiap mikrokontroler memiliki ADC internal),
digunakan untuk mengubah data-data analog menjadi digital untuk diolah atau diproses lebih lanjut.
Timer atau Counter digunakan sebagai pewaktu atau pencacah, sebagai pewaktu fungsinya seperti
sebuah jam digital dan bisa diatur cara kerjanya. Sedangkan pencacah lebih digunakan sebagai
penghitung atau pencacah event atau bisa juga digunakan untuk menghitung berapa jumlah pulsa
dalam satu detik dan lain sebagainya. Biasanya sebuah mikrokontroler bisa memiliki lebihd dari 1
timer.
EEPROM (sama seperti RAM hanya saja tetap akan menyimpan data walaupun tidak mendapatkan
sumber listrik/daya) dan port-port I/O untuk masukan/luaran, untuk melakukan komunikasi dengan
periferal eksternal mikrokontroler seperti sensor dan aktuator.
TinyAVR (tidak ada kaitannya ama mbak Tini yang jualan gudeg)
Mikrokontroler (mungil, hanya 8 sampai 32 pin) serbaguna dengan Memori Flash untuk
menyimpan program hingga 16K Bytes, dilengkapi SRAM dan EEPROM 512 Bytes.
MegaAVR (nah yang ini sudah mulai banyak yang nulis bukunya)
Mikrokontroler dengan unjuk-kerja tinggi, dilengkapi Pengali Perangkat keras (Hardware
Hal. 3
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Multiplier), mampu menyimpan program hingga 256 KBytes, dilengkapi EEPROM 4K Bytes
dan SRAM 8K Bytes.
AVR XMEGA
Mikrokontroler AVR 8/16-bit XMEGA memiliki periferal baru dan canggih dengan unjuk-
kerja, sistem Event dan DMA yang ditingkatkan, serta merupakan pengembangan keluarga
AVR untuk pasar low power dan high performance (daya rendah dan unjuk-kerja tinggi).
AVR32 UC3
Unjuk-kerja tinggi, mikrokontroler flash AVR32 32-bit daya rendah. Memiliki flash hingga 512
KByte dan SRAM 128 KByte.
AVR32 AP7
Unjuk-kerja tinggi, prosesor aplikasi AVR32 32-bit daya rendah, memiliki SRAM hingga 32
KByte.
Cuman yang populer di Indonesia adalah tinyAVR dan megaAVR, itupun masih kalah populer dengan
keluarga AT89 yang belakangan juga sudah mulai banyak yang beralih ke AVR.
Perbedaan jenis-jenis tersebut terletak dari fasilitas, atau lebih dikenal dengan fitur-fiturnya. Jenis
TinyAVR merupakan mikrokontroler dengan jumlah pin yang terbatas (sedikit maksudnya) dan
sekaligus fitur-fiturnya juga terbatas dibandingkan yang megaAVR. Semua mikrokontroler AVR
memiliki set instruksi (assembly) dan organisasi memori yang sama, dengan demikian 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
Hal. 4
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Untuk lebih jelasnya perhatikan keterangan singkat yang saya berikan berikut ini, berdasar informasi
resmi dari Atmel (http://www.atmel.com) dan maaf masih dalam bahasa Inggris (supaya
kelihatannya aura kecanggihannya, he he he...).
tinyAVR
o Optimized for simple applications requiring a small microcontroller.
o Great performance for cost effective devices.
o Fully featured with 10-bit ADCs and high speed PWMs onboard.
o Self-Programming Flash memory for maximum flexibility.
o debugWIRE On-Chip Debug and In-System Programming.
megaAVR
o Self-Programming Flash memory with boot block.
o High accuracy 10-bit A/D converters with up to x200 analog gain stage.
o USART, SPI and TWI(1) compliant serial interfaces.
o IEEE 1149.1 compliant JTAG interface on megaAVRs with 44 pins or more.
o On-Chip Debug through JTAG or debugWIRE interface.
AVR XMEGA
o picoPower technology for ultra low power consumption
o True 1.6 volt operation and CPU speed up to 32 MHz.
o Event System and DMA Controller.
o High speed, high resolution 12-bit ADC and DAC.
o Crypto engine, Timers/Counters and fast communication interfaces.
o Accurate and flexible Clock System with dynamic clock switching.
AVR32 UC3
o High CPU performance.
o Low power consumption.
o High data throughput.
o Low system cost.
o High reliability.
o Easy to use.
AVR32 AP7
o High CPU perfromance.
o Low power consumption.
o SIMD / DSP instructions.
o Instruction & data caches.
o Memory management unit.
o Built for embedded Linux
3
Jika Anda bingung dengan istilah-istilah pada fitur-fitur ini silahkan merujuk ke datasheet aslinya, sehingga
fokus pada buku ini tidak melulu pada datasheet...
Hal. 5
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Hal. 6
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Hal. 7
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Pada Gambar 1.6 ditunjukkan diagram blok untuk Mikrokontroler AVR ATMega16, perhatikan begitu
banyaknya fitur-fitur dalam diagram blok tersebut, sebagaimana juga sudah saya kutipkan pada
bagian sebelumnya.
Hal. 8
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Pada Tabel 1.1, 1.2 dan 1.3 ditunjukkan masing-masing alternatif fungsi dari Port B, Port C dan Port
D. Dalam buku saya ini sengaja penjelasan dari masing-masing fungsi tersebut (kecuali antarmuka
JTAG) akan dibahas pada saat digunakan, sehingga Anda bisa memahami langsung dengan mencoba,
istilah kerennya Learning by Doing...
4
Resistor pull up internal berkaitan dengan rangkaian internal pada mikrokontroler AVR yang bersangkutan.
Hal. 9
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Hal. 10
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Gambar 1.7. Diagram alir perancangan aplikasi berbasis mikrokontroler (apa saja)
Nach, berdasar diagram alir tersebut, semuanya berawal dari MASALAH, atau bisa juga Anda sebut
PROYEK, KASUS atau apa saja yang Anda suka selama artinya adalah sesuatu yang ingin dicari atau
dibuat solusinya. Lebih tepatnya, pada tahap awal yang perlu dilakukan adalah IDENTIFIKASI
MASALAH, persis atau detilnya bagaimana, misalnya
Ini tentunya belum cukup, informasinya masih kurang, beberapa pertanyaan yang bisa diajukan
antara lain:
LED-nya berapa?
Tombol apa saja yang ditekan?
Bagaimana hubungan antara sebuah tombol dengan LED yang bersangkutan?
Apakah dimungkinkan menekan dua tombol atau lebih secara bersamaan?
Apakah menyala-nya LED menggunakan tundaan? Atau hanya sekedar sesuai dengan tombol
yang bersangkutan?
Dan lain sebagainya.
Hal ini sangat penting, dikarenakan dengan informasi yang detil, maka kita bisa membuat rangkaian
dan program yang benar-benar sesuai dengan apa yang diinginkan. Dan yang lebih penting lagi, jika
ini merupakan proyek atau pesanan, bisa dijadikan bahan dalam kontrak kerja atau berita acara.
Tidak peduli akan Anda selesaikan dengan mikrokontroler AVR maupun AT89 atau bahkan
Hal. 11
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
mikrokontroler apapun. Hal ini juga menjadi penting untuk menentukan berapa lama pekerjaan
harus diselesaikan, bukankah dengan informasi yang lengkap akan jauh lebih mudah memperkirakan
segalanya?
Selain itu, dengan detil informasi yang diperoleh, Anda bisa menentukan mikrokontroler apa yang
akan digunakan, sesuai dengan kebutuhan. Ingatlah bahwa setiap mikrokontroler (baik keluarga AVR
maupun AT89) masing-masing bisa memiliki fasilitas yang sama dan juga bisa berbeda. Apakah
aplikasi atau solusi yang Anda tawarkan memerlukan Timer? Counter? Timer dan Counter? Sinyal
PWM? Menggunakan motor servo? Motor DC? Motor Langkah? Apakah memerlukan Watchdog?
Berapa frekuensi Clock yang dibutuhkan? Dan lain sebagainya
Biasanya, persoalan yang dihadapi adalah mencari solusi itu sendiri. Katakan saja jika persoalan
masukan/luaran sudah teridentifikasi secara 100% semuanya, langkah berikutnya adalah
MERANCANG atau MENEMUKAN SOLUSI, termasuk memilih mikrokontroler mana yang akan
digunakan. Untuk keperluan mendapatkan informasi mikrokontroler AVR secara lengkap silahkan
merujuk datasheet masing-masing. Ini adalah sumber utama yang bisa dipercaya, karena langsung
diterbitkan oleh pabrik mikrokontroler yang bersangkutan (ATMEL, http://www.atmel.com).
Setelah Anda melakukan IDENTIFIKASI MASALAH, langkah berikutnya (lihat diagram alir) adalah
MELAKUKAN PERANCANGAN atau MENEMUKAN SOLUSI (termasuk menentukan masukan dan
luaran apa saja yang terlibat dalam solusi tersebut). Langkah ini memang tidak semudah
mengatakan-nya, namun ANDA PASTI BISA, karena semakin tinggi jam terbang Anda dalam
menangani berbagai macam kasus-kasus yang melibatkan penggunaan mikrokontroler, Anda akan
semakin terampil dan jenius.
Misalnya saja, ada pertanyaan yang masuk ke saya bagaimana menampilkan hasil perhitungan atau
hasil akuisisi data di LCD, Dot Matrix atau bahkan di 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).
Hal. 12
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Pembuatan program aplikasi bisa Anda lakukan dengan bahasa pemrograman apapun yang Anda
inginkan, jika Anda seorang pemula, saya sarankan untuk menggunakan BASCOM 8051 atau
BASCOM AVR dari MCSELEC.COM, karena sangat mudah penggunaanya5.
Oya program Anda, yang menggunakan bahasa apapun yang Anda suka, harus dikompilasi
(menggunakan perangkat lunak yang sudah saya sebutkan sebelumnya) menjadi berkas BIN atau
HEX (format heksadesimal), sebagaimana prosesnya ditunjukkan pada Gambar 1.8, untuk kemudian
di-download-kan ke mikrokontroler yang bersangkutan. Sehingga mikrokontroler Anda bisa
menjalankan program Anda. Selain itu, Anda juga bisa mencoba-nya terlebih dahulu melalui
simulator mikrokontroler menggunakan perangkat lunak Proteus VSM dari LabCenter (silahkan
mengunduh demonya di http://www.labcenter.co.uk/).
Langkah selanjutnya tentu saja MELAKUKAN UJI-COBA DAN EVALUASI apakah rangkaian dan
program sudah berjalan dengan benar atau belum, lakukan TROUBLESHOTING jika memang masih
ada kesalahan mayor maupun minor, sehingga hasil yang diperoleh menjadi baik dan benar. Jika
perlu gunakan prinsip worst case scenario atau skenario kondisi terburuk (misalnya, bagaimana kalo
kepanasan, kebanjiran, gempa, interferensi frekuensi dan lain sebagainya), sehingga produk aplikasi
Anda bisa bertahan dalam segala macam kondisi di lapangan.
Apakah ada masalah dengan program? Cek pada program Anda. Atau ada masalah pada rangkaian?
Silahkan cek, apakah rangkaian sudah benar. Atau justru permasalahan terjadi karena Anda
memberikan solusi yang salah atau kurang tepat, silahkan cek semuanya. Sekali lagi perhatikan
diagram alir proses pada Gambar 1.7.
Ingatlah bahwa kesalahan bisa terjadi pada RANGKAIAN dan/atau PROGRAM, bahkan seringkali
kesalahan-kesalahan sepele tetapi berdampak besar pada jalannya aplikasi kita, dengan demikian
lakukan pengecekan secara menyeluruh. Saya pernah menanyakan kepada salah satu bimbingan TA
saya untuk melakukan pengecekan, Apakah PCB sudah kamu cek semua?, jawaban dia, Ooo
5
Sampai paragraf ini, apakah pertanyaan BASCOM AVR apaan tuch? sudah terjawab? Mmmm, seharusnya
sudah!
Hal. 13
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
sudah pak, sudah nyambung semua.... Wah kaget saya, Lho kalo nyambung semua ya konslet
donk...! Ha ha ha..., dia juga ikut tertawa, Anda saya harapkan jangan ikut ketawa ya...
Pada bagian ini saya tidak perlu menjelaskan tentang apa dan bagaimana melakukan pemrograman
BASCOM AVR, karena langsung akan saya jelaskan melalui masing-masing modul sesuai dengan
kebutuhan. Jika Anda masih penasaran dengan konsep-konsep dasar BASCOM AVR silahkan ikut saja
penjelasan saya ini, atau bisa Anda beli buku-buku Mikrokontroler AVR yang menggunakan BASCOM
AVR seperti punya saya ini. Bingung? Ya sama...! ha ha ha...
Udah kita lanjutkan saja ke modul pertama yang berbicara tentang Konsep I/O pada Mikrokontroler
AVR dan pemrograman BASCOM AVR-nya... yuuuk...
1.8.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:
Hal. 14
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Contoh :
Jika beberapa variabel dideklarasikan dalam satu baris, maka harus dipisah dengan
tanda koma.
Contoh:
Contoh :
DEFINT angka
DEFBYTE bilangan
Untuk variabel dengan tipe data yang sama dapat dideklarasikan dengan dipisah titik
koma, misal
1.8.3. Konstanta
Berbeda dengan variabel, sebuah konstanta akan bernilai tetap. Sebelum digunakan, konstanta
dideklarasikan terlebih dulu dengan cara (ada dua cara):
Contoh :
Hal. 15
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Const pembagi = 23
1.8.5. Alias
Untuk mempermudah pemrograman, biasanya nama register dalam mikrokontroler dibuatkan nama
yang identik dengan hardware yang dibuat, contoh :
Contoh:
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.
Hal. 16
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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:
Hal. 17
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
<perintah 2>
...
End If
D. SELECT - CASE
Cocok digunakan untuk menangani pengujian kondisi yang jumlahnya cukup banyak. Cara
penulisannya :
B. DO - LOOP
Pernyataan ini untuk melakukan perulangan terus menerus tanpa henti (pengulangan tak
berhingga) selama mikrokontroler-nya masih mendapatkan detak dan/atau catu daya. Cara
penulisannya :
Do
<pernyataan>
...
Loop
Jika pengulangan dibatasi oleh suatu kondisi maka caranya ditunjukkan berikut ini, artinya
pengulangan terus dilakukan sehingga suatu kondisi terpenuhi atau melakukan pengulangan
selama kondisinya salah:
Do
<pernyataan>
...
Loop Until <kondisi>
C. WHILE - WEND
Berbeda dengan DO-LOOP, instruksi ini digunakan untuk melakukan pengulangan selama
kondisinya benar, cara penulisannya:
While <kondisi>
<perintah>
...
Wend
Hal. 18
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Routine:
Print "This will be executed"
Return
B. GOTO <label>
Perintah ini untuk melakukan lompatan ke label kemudian melakukan serangkaian instruksi
tanpa harus kembali lagi, sehingga tidak perlu RETURN. Contoh:
Dim A As Byte
Start: '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 :
- selesai Modul 1 -
Hal. 19
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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).
$regfile = "m16def.dat"
$crystal = 11059200
Hal. 20
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Instruksi yang pertama digunakan untuk mendeklarasikan pustaka berdasar mikrokontroler yang
digunakan, dalam contoh ini digunakan ATMega16 sehingga file yang dibutuhkan adalah
m32def.dat. Sedangkan instruksi kedua ($crystal) digunakan untuk menentukan frekuensi
kerja dari mikrokontrolernya, dalam hal ini digunakan kristal 11,0592MHz atau dituliskan 11059200
Hz1.
Instruksi berikutnya (config portb) digunakan untuk menentukan apakah suatu PORT pada AVR
digunakan sebagai masukan atau luaran, karena aplikasi yang sedang kita bicarakan dalam bagian ini
adalah luaran tampilan LED, maka PORTB kita definisikan sebagai luaran (output).
Untuk memudahkan akses PORTB bisa digunakan nama lain, misalnya PORT_LED, yang dilakukan
dengan instruksi ALIAS (instruksi berikutnya).
Port_led = 255
End 'end program
Instruksi bagian akhir adalah menyalakan semua LED, yaitu dengan memberikan logika 1 sebanyak
8-bit atau 1 byte, artinya kita kirimkan &b11111111 atau &hFF atau 255. Jangan lupa diakhiri dengan
instruksi END sebagai akhir program. Mengapa hal ini perlu dilakukan? Jika Anda lupa memberikan
istruksi END, padahal program Anda sesungguhnya sudah selesai, hasil kompilasi tetap tidak
mengetahui bahwa program Anda selesai, sehingga bisa menyebabkan hasil yang tidak diharapkan.
Program selengkapnya...
1: 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
$regfile = "m16def.dat"
$crystal = 11059200
1
Defaultnya menggunakan osilator internal sebesar 1MHz, jadi sebaiknya ada tulis 1000000Hz, kecuali sudah
ada atur setelan osilatornya ke 8MHz.
Hal. 21
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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, WAITMS menggunakan satuan milidetik, WAITUS menggunakan satuan mikrodetik dan
WAIT menggunakan satuan detik. Sedangkan DELAY (tanpa diikuti angka) bernilai tundaan selama
1000 mikrodetik atau 1 milidetik.
Oya, mungkin Anda bertanya, loch instruksi END kok gak ditulis ya? Kelupaan-kah? Ooo tidak,
sengaja saya tidak menuliskannya karena memang tidak perlu, mengapa? Karena hasil kompilasi
program selalu aman karena disana ada pengulangan terus menerus, pengulangan tak berhingga,
terus menerus mengulang (DO...LOOP) selama rangkaian mikrokontroler tersambung catu daya.
Sehingga saya tidak khawatir program akan berjalan kacau sebagaimana saya uraikan sebelumnya.
Jadi instruksi END Anda tulis atau tidak, dalam kasus ini, tidak ada efeknya...
Program selengkapnya...
1: 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
Berikut ini program pertama (nanti saya berikan alternatif yang lebih pendek dan efisien)...
1: berkas LED03.BAS
2: $regfile = "m16def.dat"
3: $crystal = 11059200
Hal. 22
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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).
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
Hal. 23
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
ROTATE DATA_LED, LEFT, 1 (baris 13) artinya menggeser-putar (merotasi) data di variabel
DATA_LED ke kiri (LEFT) sebanyak 1 bit.
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
Program pada Latihan ini akan digunakan untuk menerjemahkan penekanan tombol, dengan
ketentuan sebagai berikut (baris 20-25 pada program):
Jika ditekan tombol pada PORTD.0 (port D pin 0) atau PORTD terbaca &B11111110 atau
&HFE, maka separo pertama dari LED akan dinyalakan dengan memberikan nilai
&B00001111 atau &H0F pada PORTB;
Jika ditekan tombol pada PORTD.1 (port d pin 1) atau PORTD terbaca &B11111101 atau
&HFD, maka separo kedua dari LED akan dinyalakan, dengan memberikan nilai &B11110000
atau &HF0 pada PORTB;
Jika ditekan tombol pada PORTD.2 (port d pin 2) atau PORTD terbaca &B11111011 atau
&HFB, maka LED 0, 2, 4 dan 6 akan dinyalakan, dengan memberikan nilai &B01010101 atau
&H55 pada PORTB;
Hal. 24
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Jika ditekan tombol pada PORTD.3 (port d pin 3) atau PORTD terbaca &B11110111 atau
&HF7, maka LED 1, 3, 5 dan 7 akan dinyalakan, dengan memberikan nilai &B10101010 atau
&HAA pada PORTB;
Program selengkapnya, perhatikan perintah SELECT-CASE yang digunakan untuk menerjemahkan arti
dari masing-masing penekanan tombol sebagaimana telah dijelaskan sebelumnya:
Hal. 25
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Portd = 255
Animasi = &H01
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 -
Hal. 26
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Timer0 dan Timer2 merupakan timer 8-bit (bisa mencacah dari 0 sampai dengan 255);
Timer1 merupakan timer 16-bit (bisa mencacah dari 0 sampai dengna 65535).
Sifat dasar dari timer/counter ini sama seperti RAM yang bisa dibaca dan diulisi, namun menawarkan
fasilitas yang lebih dari sekedar baca/tulis:
Timer melakukan pencacahan bisa secara otomatis (makanya disebut sebagai pewaktu).
Cukup Anda berikan perintah untuk mengaktifkan (START TIMERn) atau menghentikan
(STOP TIMERn), jika melibatkan interupsi bisa digunakan instruksi ENABLE TIMERn atau
DISABLE TIMERn (n diganti angka 0, 1 atau 2);
Anda tidak perlu setiap saat memeriksa apakah pencacahan sudah overflow (berlebihan)
atau kejadian saat timer mencapai nilai maksimum, diberikan clock dan kembali menjadi nol
lagi (atau nilai apa saja yang kita inginkan reload value), karena masing-masing timer
dilengkapi interupsi yang aktif saat terjadi overflow;
Sumber detak ke timer bisa diperoleh secara internal (sebagai pewaktu) maupun eksternal
(sebagai pencacah), masing-masing menggunakan instruksi CONFIG TIMERn = TIMER atau
CONFIG TIMERn = COUNTER;
Saat diberikan detak dari osilator internal bisa dipilih laju detak-nya sesuai dengan RC atau
Crystal atau bahkan lebih lambat dengan cara membagi detak atau clock dengan angka 8,
64, 256 atau 1024 (angka-angka ini dinamakan sebagai prescaler). Misalnya, jika PRESCALE =
64, menggunakan frekuensi krsital 8MHz akan diperoleh (8.000.000/64) 125.000 clock per
detik-nya, atau jika PRESCALE = 1024 akan diperoleh (8.000.000/1024) 7.812 clock per detik.
Timer tidak harus melakukan pencacahan dari nol, Anda bisa memberikan nilai awal yang
bukan nol, yang dikenal dengan nilai reload.
Sebagaimana ditunjukkan pada Gambar 3.1 dan diperjelas dalam Gambar 3.2, masukan detak atau
clock untuk Timer0 bisa diperoleh dari internal, melalui jalur Prescaler, atau eksternal, melalui jalur
T0 yang harus melalui Edge Detector terlebih dahulu, yaitu sebuah unit yang bisa mendeteksi pulsa
detak atau clock saat FALLING (1 ke 0) atau RISING (0 ke 1).
Selanjutnya sinyal CLKT0 atau CLKT2 (baik dari internal maupun eksternal) ini diumpankan ke Control
Logic. Control Logic inilah yang kemudian memberikan instruksi operasional ke Timer0/Timer2,
apakah akan memberikan detak (count) menaikkan atau menurunkan isi (direction) dari register
Timer0/Timer2 yaitu TCNT0/TCNT2, membersihkan isinya (clear).
Jika TCNT0/TCNT2 sudah mencapai 0x00, maka akan diberikan sinya BOTTOM, sebaliknya, jika
TCNT0/TCNT2 mencapai nilai maksimum, 0xFF, atau nilai tertentu, maka akan diberikan sinyal TOP
ke Control Logic.
Hal. 27
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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.
Hal. 28
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Penjelasan
CONFIG TIMERn = TIMER, artinya Timer0/Timer2 mendapatkan sumber detak atau clock
secara internal:
o PRESCALE= 1|8|64|256|1024, artinya sumber detak internal tersebut mo dibagi
berapa? 1, 8, 64, 256 atau 1024 untuk mendapatkan sumber detak yang lebih
lambat.
CONFIG TIMERn = COUNTER, artinya Timer0/Timer2 mendapatkan sumber clock-nya dari
eksternal (melalui pin T0):
o EDGE=RISING/FALLING, kapan dilakukan aksi detak, apakah saat RISING, yaitu dari 0
ke 1, atau saat FALLING, yaitu dari 1 ke 0;
o PRESCALE= 1|8|64|256|1024, sama penjelasannya...
o CLEAR TIMER = 1|0, digunakan untuk memilih
Hal. 29
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Sumber detak-nya sama seperti Timer0 dan Timer2, bisa dari dalam (internal), dari dalam dengan
dibagi prescaler atau dari luar melalui pin T1. Detilnya ditunjukkan pada Gambar 3.4. Perhatikan
bahwa register timernya terbagi atas TCNT1H dan TCNT1L yang masing-masing panjangnya 8-bit,
total 16-bit.
Anda bisa membeli IC 74LS47 (CA) atau 74LS48 (CC) untuk mengkonversi data BCD menjadi data-
data untuk 7-segmen, sebagaimana diagram pin untuk ditunjukkan pada Gambar 3.6.
Hal. 30
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Karena hanya menggunakan dua digit, selama program berjalan pada ATMega16 hanya ditampilkan
detik-nya saja, untuk menampilkan menit dan jam masing-masing bisa menggunakan tombol MENIT
dan JAM (perhatikan Gambar 3.3), yang masing-masing terhubungkan ke PORTD.0 dan PORTD.1.
Sedangkan untuk mereset jam, bisa digunakan tombol RESET JAM yang terhubungkan ke PORTD.7.
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.
Selanjutnya kita tetapkan sebuah konstanta untuk melakukan penundaan 1 detik tepat! Konstanta
ini merupakan nilai pembanding yang nantinya disimpan pada OCR1H dan OCR1L, sehingga saat
Timer1, yaitu TCNT1H dan TCNT1L, sama isinya masing-masing dengan OCR1H dan OCR1L, maka
akan terjadi interupsi MATCH COMPARE.
Untuk mendapatkan nilai konstanta ini, silahkan gunakan program AvrTimer1Calc.EXE, kemudian
masukkan parameter-parameter seperti ditunjukkan pada Gambar 3.7, yaitu ditemukan nilai isi
ulangnya adalah 34.288, supaya terjadi 31.250 detak yang setara dengan 1 detik.
Nilai 34.288 ini yang kemudian dituliskan dalam program (baris 12), kemudian diikuti dengan
mendeklarasikan fungsi dari timer1 sebagai pewaktu (TIMER) dengan prescaler sebesar 256 (baris
14). Sedangkan dua register untuk pembanding, yaitu OCR1H dan OCR1L masing-masing diisi dengan
bagian HIGH dan LOW dari konstanta RELOAD (=34.288), perhatikan baris 16 dan 17:
Hal. 31
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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.
Hal. 32
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Dalam kasus kita, register TCCR1A kita isi dengan nol, kemudian kita cek juga TCCR1B
sebagaimana ditunjukkan pada Gambar 3.9.
Hal. 33
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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:
Selanjutnya masing-masing PORTA dan PORTD juga kita inisialisasi masing-masing sebagai luaran dan
masukan, juga menyiapkan PORTD untuk masukan (baris 24):
Agar setiap terjadi interupsi Compare Match pada Timer1 dilakukan proses pada bagian tertentu di
dalam program maka kita definisikan sebuah label TIMER1_ISR:
Okey, sekarang kita aktifkan interupsi pembandingnya (baris 26) dan interupsi global-nya (baris 27),
perlu diketahui bahwa interupsi adalah sebuah proses yang menunda program yang sedang berjalan
untuk mengerjakan sesuatu yang begitu penting, kemudian setelah selesai akan kembali
mengerjakan pekerjaan yang sebelumnya ditinggalkan:
Hal. 34
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Sampai disini sekarang semua sudah siap, sudah ready! Selanjutnya adalah membuat program untuk
rutinitas jam digital sebagaimana kita rencanakan. Intinya adalah selalu menampilkan detik (baris 50)
sambil terus menerus memeriksa tombol pada PORTD (baris 32), apakah ditekan tombol RESET,
berarti mereset jam, menit dan detik (baris 33 sampai dengan 37), atau tombol JAM, artinya
ditampilkan data jam (baris 48), atau tombol MENIT, artinya ditampilkan tombol menit (baris 49).
Serta tidak lupa untuk selalu meng-update data-data detik (baris 38 sampai dengan 41), menit (baris
42 sampai dengan 45)dan jam (baris 46):
31: 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 atau SECONDS:
54: Timer1_isr:
55: Incr Seconds
56: Return
Hal. 35
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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
Rangkaian (Gambar 3.10) ini sangat sederhana, karena intinya hanya dilihat hasil luaran pada
PORTB.0 atau PB0, perhatikan catatan pada Gambar 3.10 tersebut. Jangan lupa untuk melakukan
setingan kristal pada jendela yang ditunjukkan pada Gambar 3.11, pada pilihan CKSEL Fuses dipilih
Int. RC 4 MHz.
Baiklah, seperti biasa, program diawali dengan deklarasi pustaka ATMega16 dan kristal yang
digunakan (yaitu 4 MHz, bukan 8 MHz). Kemudian dilanjutkan dengan menuliskan konstanta reload-
nya agar diperoleh penundaan 50 milidetik atau dengan kata lain, terjadi overflow (bukan Compare
Match) setiap 50 milidetik.
Hal. 36
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Hal. 37
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Tidak lupa juga mendefinisikan operasional Timer0 sebagai pewaktu dengan prescaler sebesar 1024
(baris 8):
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):
Selanjutnya program tidak melakukan apapun (baris 17 19). Jika terjadi interupsi Timer0, karena
sudah terjadi 195 kali clock atau setara dengan penundaan 50 milidetik, akan dikerjakan interupsi
yaitu melompat ke label TIMER0_ISR atau baris 23, dan seterusnya, yang diawali dengan mengisi
ulang TIMER0 dengan nilai reload (baris 24) dan PORTB.0 akan berlogika 1 dan 0 secara
bergantian, menggunakan instruksi TOGGLE.
Hal. 38
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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
Jangan lupa juga mengarahkan interupsi (overflow) Timer0 ke TIMER0_ISR (baris 12), sebagaimana
ditunjukkan pada baris 24-27:
PORTC didefinisikan sebagai luaran (baris 14), PB0 digunakan sebagai masukan tombol sehingga
DDRB.0-nya diberi logika nol (atau sebagai luaran, baris 15). PORTC selalu menampilkan isi dari
variabel COUNT, yaitu nilainya akan selalu naik setiap 5 kali penekanan tombol pada PB0 atau
sebagai masukan detak ke Timer0 atau T0.
Hal. 39
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Rangkaian yang digunakan pada latihan ini dtiunjukkan pada Gambar 3.13 menggunakan Proteus 7.4
SP3.
Program selengkapnya:
Hal. 40
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
27: Return
Rangkaian yang digunakan ditunjukkan pada Gambar 3.14. perhatikan bahwa masukan clock melalui
T1 atau PB1 sedangkan masukan aktivasi capture melalui ICP1 atau PD6.
Program selengkapnya:
Penjelasan program:
Hal. 41
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Timer1 dikonfigurasi sebagai COUNTER, dengan masukan clock aktif pada saat transisi 1 ke 0
atau FALLING (baris 6). Noise canceller diaktifkan dengan instruksi NOISE CANCEL = 1, dan
capture terjadi pada saat transisi 1 ke 0 atau RISING (baris 7);
Perhatian! Baris 6 dan 7 harus ditulis dalam satu baris!
PORTC selalu menampilkan isi register ICR1L (baris 12-14).
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 pulsa PWM
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 dengan duty 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.
Hal. 42
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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%).
Masing-masing luaran PWM tersebut memiliki pengaturan yang terpisah (masing-masing duty 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
Hal. 43
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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 dengan channel B dan A pada osiloskop.
Gambar 3.20
Hal. 44
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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).
Hal. 45
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Gambar 3.22
- Selesai Modul 3
Hal. 46
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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?
Hal. 47
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Bagaimana, sudah ketemu jawabannya? Yup, gunakan interupsi Timer, TIMER0 OVF, TIMER1 OVF
atau TIMER2 OVF.
Okey mari kita pelajari konsep interupsi ini melalui latihan atau contoh program/rangkaian berikut
ini...
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.
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:
Hal. 48
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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, dituliskan Falling. 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;
Hal. 49
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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, misalnya PIND.2;
o Misalnya BITWAIT PIND.2, SET artinya menunggu PIND bit 2 hingga berlogika
1 setelah terjadi penekanan pushbutton dengan logika 0;
On Int0 Int0_handler
On Int1 Int1_handler
Portd = 255
Portb = &B11111111 'turns off LEDs
Hal. 50
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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
Hal. 51
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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.
Hal. 52
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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 dan Pin_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
Hal. 53
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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.
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
Hal. 54
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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
Sedangkan directive (bukan instruksi tetapi perintah yang ditujukan ke compiler BASCOM AVR-nya)
yang terkait dengan komunikasi serial adalah:
$Baud
$Crystal
Hal. 55
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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 masukan BINER dan HEKSADESIMAL, 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 pada INKEY().
PRINT SPC(x)
Mencetak sekian x jumlah spasi ke port serial.
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!
Hal. 56
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Hal. 57
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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 OK atau
tekan ENTER;
Hal. 58
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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 klik OK;
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.
Hal. 59
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Penjelasan:
Mikrokontroler akan mengirimkan dua kalimat ke komputer melalui port serial (diterima
oleh Hyperterminal), sebagaimana ditunjukkan pada baris 14 dan 15, menggunakan instruksi
PRINT;
Hal. 60
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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...
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...
Hal. 61
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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)
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
Hal. 62
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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).
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;
Hal. 63
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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
Pada Gambar 6.3 ditunjukkan cotnh rangkaian antarmuka LCD dan ADC dengan ATMega16 yang bisa
digunakan untuk latihan-latihan antarmuka LCD dan ADC.
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
Hal. 64
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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:
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 dengan CLS (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!
Hasilnya ditunjukkan pada Gambar 6.4 (diambil dari rangkaian Proteus 7.4 SP3).
Hal. 65
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Gambar 6.4
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-tundaan WAITMS. Jika kalimat yang Anda tuliskan lebih dari 16 karakter apa
yang terjadi? Silahkan dicoba...
Hal. 66
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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 menggunakan LOWERLINE (baris-14) dan seterusnya.
Penggeseran dilakukan melalui instruksi SHIFTLCD LEFT (geser kiri), sebagaimana ditunjukkan pada
baris-18, sebanyak 16 kali (baris-16 dan 19).
Pendefinisian karakter pada LCD menggunkan bantuan menu Tools LCD Designer, sehingga
ditampilkan jendela LCD Designer, sebagaimana ditunjukkan pada Gambar 6.5.
Hal. 67
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Baiklah kita coba saja, buka berkas baru pada BASCOM AVR, kemudian kita siapkan program-nya
sejak awal, ketik saja bagian berikut ini...
Tempatkan kursor pada baris 11 atau 12, kemudian aktifkan LCD Designer dan buatlah gambar
pertama sebagaimana ditunjukkan pada Gambar 6.6
Kemudian klik Ok, sehingga pada editor BASCOM AVR akan dihasilkan sebuah baris seperti berikut
ini:
Hal. 68
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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).
Lanjutkan dengan karakter-karakter sebagaimana ditunjukkan pada Gambar 6.8, total ada 6 buah
karakter.
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 bergantian1.
1
Itulah sebabnya definisi karakter tanda ? diganti dengan angka 0 sampai dengan 5 (berurutan).
Hal. 69
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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...
Baiklah sekarang bagaimana dengan program berikut... karakter animasinya kita ganti, coba Anda
jalankan dengan ATMega16 dan amati hasilnya (LCD04A.BAS):
Hal. 70
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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
Hal. 71
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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.
Sedangkan STEP 1 pada baris 27, sebagaimana telah dijelaskan sebelumnya bersifat opsional.
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
Hal. 72
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Gambar 6.10
Gambar 6.11
Okey kita mulai pemrogramannya... seperti biasanya, kita awali dengan inisialisasi segala hal...
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
Hal. 73
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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 fasiltas ADC atau Analog 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.
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):
Hal. 74
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Keterangan:
Lantas apa arti dari baris-8 tersebut? Silahkan merujuk keterangan saya di atas dan itulah sebabnya
mengapa AREF dihubungkan 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).
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:
Hal. 75
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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:
Hal. 76
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Hal. 77
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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
Hal. 78
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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...
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
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 , "#.##")
Hal. 79
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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
Gambar 6.21
Program selengkapnya mirip dengan latihan 9, hanya saja pembacaan ADC menggunakan FOR..NEXT
untuk mengefisiensikan penulisan program...
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
Cursor Off
Cls
Do
For I = 0 To 3
Data_adc = Getadc(i)
Adc_convert = Data_adc
Hal. 80
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Gambar 6.22
Gambar 6.23
- Selesai Modul 6
Hal. 81
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
DS 1307 memiliki 8 buah pin dan tersedia dalam bentuk 8-pin DIP serta 8- pin SOIC. Konfigurasi
ditunjukkan pada 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.25VBAT. 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
VBAT.
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 lithium 48 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.
Hal. 82
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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.
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.
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 notacknowledge dan diakhiri dengan
sinyal stop.
Hal. 83
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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.
Hal. 84
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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 menyebabkan error? 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 adalah CONFIG DATE sebagaimana ditunjukkan pada baris 10. Instruksi ini digunakan untuk
mendefinisikan format tanggal dalam BASCOM AVR. Pada baris 10 tertulis format DMY, artinya
Hal. 85
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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 CLOCK yang 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, selain TIME$ dan DATE$ 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 adalah 0xD1 (&HD1), kita lakukan dengan dua konstanta berikut (baris 22 dan 24):
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
Hal. 86
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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:
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)
Hal. 87
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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 dengan I2CSTART (baris 53), diikuti dengan I2CWBYTE 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 RTC01.BAS
'
$regfile = "m16def.dat"
$crystal = 11059200
Hal. 88
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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
'-------------------------------------------
'-------------------------------------------
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$
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
Hal. 89
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Tambaha instruksi yang perlu diberikan adalah langsung memberikan pengaturan jam dan tanggal
masing-masing ke variabel TIME$ dan DATE$ 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 rutin SETTIME dan SETDATE. Untuk
itulah kita harus mempersiapkan kedua rutin tersebut, cara penggunaan I2C-nya sama saja, hanya
sekarang digunakan perintah I2CRBYTE untuk menuliskan data, perhatikan subrutin SETDATE 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 RTC02.BAS
'
$regfile = "m16def.dat"
Hal. 90
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
$crystal = 11059200
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
'-------------------------------------------
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
Hal. 91
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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
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.
$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
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
Hal. 92
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Jika Anda ingat, perintah LOCATE 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 dan ALAMAT 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
Hal. 93
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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 mas Anang 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
Hal. 94
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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.
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.
Hal. 95
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Hal. 96
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Kita awali, seperti biasa dengan deklarasi penting di awal program (pustaka, kristal, lcd, dan lain
sebagainya):
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 dan D_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...
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...
Hal. 97
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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.
Penjelasan atau algoritma-nya sama seperti penulisan ke eeprom, hanya saja i2cstart() 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...
Hal. 98
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Locate 1 , 1
Lcd " Demo EEPROM "
Locate 2 , 1
Lcd " AT24C64"
Wait 1
D_w = 100
Cls
Upperline
Lcd "D_w= "
Lcd D_w 'show byte on LCD
Lowerline
Lcd "D_r= "
Lcd D_r
End
Hal. 99
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
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
Hal.
100
Hak Cipta (c) 2010 pada Penulis, Agfianto Eko Putra
Penjelasan singkat:
Hal yang perlu Anda perhatikan adalah deklarasi variabel sebagaimana ditunjukkan pada
baris 12 dan 13. Penggunaan Byval untuk mengirim parameter ke dalam subrutin, jika keluar
tidak perlu dituliskan apapun atau gunakan ByRef, default jika tidak dituliskan adalah ByRef;
Juga pada masing-masing subrutin itu sendiri:
o Subrutin I2c_eeprom_tulis pada baris 42-53, dan
o Subrutin I2c_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
Hal.
101