Professional Documents
Culture Documents
0
Tutorial Pemrograman Mikrokontroler AVR
dengan WinAVR GCC (ATMega16/32/8535)
http://klikdisini.com/embedded
oleh
Agfianto Eko Putra (agfi68@gmail.com) dan Dhani Nugraha (dhan_t46@yahoo.com)
FREE EBOOK!!
Jika Anda merasa ebook ini bermanfaat silahkan mendistribusikan ebook ini dengan
GRATIS di website Anda atau dimana saja, selama tidak merubah isi yang ada di e-book
ini. Terima kasih…
Daftar Isi
1. Apakah Mikrokontroler itu? ...................................................................................................... 3
2. Pengetahuan Dasar Mikrokontroler AVR .................................................................................. 6
2.1. Pendahuluan ....................................................................................................................... 6
2.2. Memilih AVR “yang benar” ............................................................................................... 7
2.3. Ada apa dengan Mikrokontroler AVR ATMega16? ............................................................ 8
2.3.1. Ringkasan Fitur-fitur Mikrokontroler AVR ATMega16 ............................................... 8
2.3.2. Diagram Pin dan Diagram Blok Mikrokontroler AVR ATMega16 ............................... 9
2.3.3. Penjelasan Singkat Pin-pin pada Mikrokontroler AVR ATMega16 ............................ 10
3. Pengenalan Bahasa C untuk Mikrokontroler AVR ................................................................... 13
3.1. Struktur Penulisan Bahasa C ............................................................................................. 13
3.2. Tipe-tipe data dalam Bahasa C .......................................................................................... 14
3.3. Deklarasi Variabel dan Konstanta ..................................................................................... 14
3.4. Pernyataan ........................................................................................................................ 14
3.5. Fungsi ............................................................................................................................... 14
3.6. Pernyataan berkondisi dan Pengulangan............................................................................ 14
3.7. Operasi Logika dan Bilangan Biner .................................................................................. 15
3.8. Operasi Aritmetika............................................................................................................ 16
3.9. Pengulangan Terus-menerus atau Infinite Looping ............................................................ 16
4. Menggunakan AVR Studio dengan WinAVR GCC ................................................................. 17
5. Masukan/Luaran (I/O) pada Mikrokontroler AVR ................................................................... 22
5.1. Register DDRx ................................................................................................................. 23
5.2. Register PORTx................................................................................................................ 23
5.3. Register PINx ................................................................................................................... 24
6. Latihan Tahap-I ....................................................................................................................... 25
6.1. Percobaan-1: LED berkedip-kedip .................................................................................... 25
6.2. Percobaan-2: Membunyikan buzzer! ................................................................................. 26
6.3. Percobaan-3: Aplikasi Pushbutton untuk ON/OFF LED.................................................... 28
7. Timer/Counter pada Mikrokontroler AVR ............................................................................... 29
7.1. Percobaan-4: Menggunakan Timer1 .................................................................................. 33
7.2. Percobaan-5: Menggunakan Timer2 .................................................................................. 35
7.3. Percobaan-6: Menggunakan Timer0 .................................................................................. 37
8. Komunikasi Serial ................................................................................................................... 38
8.1. Penghasil Detak - Clock Generator ................................................................................... 40
8.2. Mengirim Data – USART Transmitter .............................................................................. 44
8.3. Menerima Data – USART Receive ................................................................................... 46
8.4. Percobaan-7: Komunikasi Serial ....................................................................................... 47
9. Setelah Ini kemana? ................................................................................................................ 49
Bonus-1: Hasil kompilasi Flowcode AVR 3.0 yang unik?! .............................................................. 51
Bonus-2: FlowCode AVR 3.0: Aplikasi I/O Sederhana ................................................................... 55
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.
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!
1
Memori yang hanya bisa dibaca saja.
2
Memori yang bisa dibaca juga bisa ditulisi.
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
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 2, agar Anda mendapatkan gambaran tentang mikrokontroler lebih jelas.
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
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
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.
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…
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.
Berikut ini saya ringkaskan berbagai macam fitur-fitur untuk Mikrokontroler AVR ATMega16 atau
Atmega16L (Mikrokontroler AVR 8-bit dengan Flash ISP 16kByte) langsung dari datasheet-nya,
maaf juga masih sebagian besar dalam Bahasa Inggris3...
3
Jika Anda bingung dengan istilah-istilah pada fitur-fitur ini silahkan merujuk ke datasheet aslinya, sehingga fokus
pada buku ini tidak melulu pada datasheet...
Pada Gambar 4 dan 5 ditunjukkan diagram pin, masing-masing, untuk Mikrokontroler AVR
ATMega16 tipe PDIP dan TQFP/MLF atau dikenal sebagai SMD.
Berikut kita jelaskan secara singkat fungsi dari masing-masing PIN pada Mikrokontroler AVR
ATMega16.
4
Resistor pull up internal berkaitan dengan rangkaian internal pada mikrokontroler AVR yang bersangkutan.
Pada Tabel 1, 2 dan 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”...
3.4. Pernyataan
Statement atau pernyataan adalah setiap operasi dalam pemrograman, harus diakhiri dengan [;] atau
[}]. Pernyataan tidak akan dieksekusi bila diawali dengan tanda [//] untuk satu baris. Lebih dari 1
baris gunakan pasangan [/*] dan [*/]. Pernyataan yang tidak dieksekusi disebut juga komentar.
Contoh:
suhu=adc/255*100; //contoh rumus perhitungan suhu
3.5. Fungsi
Function atau fungsi adalah bagian program yang dapat dipanggil oleh program utama.
Penulisan :
[tipe data hasil] [nama function]([tipe data input 1],[tipe data input 2])
{
[pernyataan_1];
[pernyataan_2];
...
}
if ( [persyaratan] ) {
for : digunakan untuk pengulangan dengan jumlah yang sudah diketahui – berapa kali diulang.
for ( [nilai awal] ; [syarat] ; [operasi nilai] )
{
[statement1];
[statement2];
...
}
while: digunakan untuk pengulangan (looping) jika dan sealama memenuhi suatu kondisi masih
dipenuhi (pengulangan selama benar
while ( [persyaratan] )
{
[statement1];
[statement2];
...
}
do while: digunakan untuk pengulangan jika dan selama memenuhi syarat tertentu, namun min 1 kali
do
{
[statement1];
[statement2];
...
}
while ([persyaratan])
Biner
AND: &
OR : |
XOR : ^
Shift right: >>
Shift left : <<
Contoh:
a = 5 * 6 + 2 / 2 – 1 hasilnya 30
a *= 5 jika nilai awal a=30, maka hasilnya 150
a += 3 jika nilai awal a=30, maka hasilnya 33
a++ jika nilai awal a=5, maka hasilnya 6
a-- jika nilai awal a=5, maka hasilnya 4, dst
Yang perlu Anda ingat, bahwa kode-kode program yang dijalankan, dalam kaidah Bahasa C, adalah
yang ada di fungsi utama atau main, seperti contoh berikut...
void main()
{
// pernyataan-pernyataan program
}
void main()
{
// pernyataan-pernyataan program
while (1); // infinite loop
{
// pernyataan2
}
}
Mengapa terjadi Infinite Looping ?? Perhatikan pada contoh tersebut, pernyataan atau instruksi
while (1) menyatakan bahwa kondisi SELALU BENAR, sehingga selalu dilakukan pengulangan
terus-menerus! Coba bedakan dengan contoh berikut...
void main()
{
// pernyataan-pernyataan program
while (index<5); // infinite loop
{
// pernyataan2
Index += 1;
}
}
Program di dalam kurung kurawa setelah instruksi while (index<5) akan dijalankan selama nilai dari
index kurang dari 5, index merupakan variabel sehingga nilainya bisa berubah. Nah, jika index lebih
dari atau sama dengan 5, maka pengulangan dihentikan.
Untuk pertama kali, Anda harus melakukan instalasi AVR Studio 4 ini ke komputer anda, jika ingin
diintegrasikan dengan WinAVR GCC, lakukan instalasi WinAVR GCC terlebih dahulu sebelum
AVR Stdui 4.0. Cara menginstalnya pun mudah layaknya anda menginstal perangkat lunak komputer
5
http://www.atmel.com
6
Unduh WinAVR GCC di
7
Pengertian simulasi disini adalah simulasi dalam tingkat register bukan simulasi dengan piranti (device). Jika Anda
menginginkan simulasi dengan rangkain dan piranti, gunakan free software lainnya yaitu VMLAB yang bisa diunduh
di http://amctools.com/download.htm (versi terbaru saat ebook ini ditulis adalah v3.15)
Tampilan yang ditunjukkan pada Gambar 8 bukan merupakan tampilan utama dari AVR Studio 4,
melainkan kotak dialog wizard yang akan menuntun kita, khususnya, membuat program baru (lihat
pada tanda panah, bahwa dialog ini diaktifkan setiap kali AVR Studio 4 dijalankan, hilangkan tanda
centang jika Anda tidak ingin mengaktifkan kotak dialog ini di awal program).
Okey, sekarang kita klik New Project, sehingga akan ditampilkan pilihan dan isian-isian yang
ditunjukkan pada Gambar 9.
Perhatikan tanda panah di Gambar 9, lakukan pilihan bahasa apa yang akan Anda gunakan, apakah
Atmel AVR Assembler atau AVR GCC? Karena kita akan belajar pemrograman mikrokontroler
AVR menggunakan Bahasa C, maka dipilih AVR GCC.
Langkah berikutnya adalah, perhatikan tanda panah di Gambar 10, mengisi Project name (atau
nama proyek), Initial file (nama file utama proyek yang bersangkutan) dan Location (tempat
menyimpan proyek Anda, klik pada tanda panah jika Anda menginginkan lokasi lainnya). Kemudian
klik Next jika sudah selesai. Kemudian ditampilkan Gambar 11.
Gambar 10. Halaman 2 kotak dialog wizard saat dipilih AVR GCC
Langkah selanjutnya adalah memilih mikrokontroler AVR yang digunakan, perhatikan tanda panah
pada Gambar 11, dan akhiri dengan klik Finish. Sehingga ditampilkan jendela utama dari AVR
Studio 4, sebagaimana ditunjukkan pada Gambar 12, dengan editor (perhatikan tanda panah pada
Gambar 12) siap digunakan untuk mengetikkan program Anda.
Okey, misalnya sekarang kita ketikkan program berikut, ketik saja dulu, ntar kita terangkan atau
berikan penjelasan tentang program ini di halaman-halaman berikutnya...
Wow! Anda sudah berhasil membuat program mikrokontroler AVR Anda yang pertama, selamat ya!
Luar biasa!
Lha terus habis gini ngapain? Oya, Anda langsung bisa mensimulasikan-nya (Ctrl+Shift+Alt+F5)
dengan AVR Studio 4 (perhatikan Gambar 13) atau men-download-kan hex-nya ke board
mikrokontroler AVR Anda8.
8
Untuk urusan mendownload program (HEX) ke mikrokontroler silahkan merujuk ke artikel saya yang terkait di ??, dan
ikuti diskusi-nya.
Okey, sampai disini pendahuluan AVR Studio 4-nya, sekarang kita mulai bahas konsep
pemrogramannya, antara lain:
Kali ini kita akan membahas tentang hal dasar berkaitan dengan konsep I/O atau masukan/luaran
pada mikrokontroler AVR:
Membaca tingkat tegangan masukan, apakah berlogika 0 (tegangan disekitar 0 volt) atau 1 (tegangan
sekitar 5 volt maksimal);
Mengeluarkan tingkat tegangan 0 (sekitar 0 volt) atau 1 (sekitar 5 volt);
Untuk keperlua tersebut, AVR memiliki beberapa register yang terkait, yaitu DDRx, PORTx dan
PINx9, berikut penjelasan masing-masing...
9
Tanda ‘x’ diganti dengan A, B, C atau D menyesuaikan dengan pin masukan/luaran yang digunakan.
Berikan logika 1 (satu) pada bit yang terkait agar dijadikan sebagai luaran atau output.
Berikan logika 0 (nol) pada bit yang terkait agar dijadikan sebagai masukan atau input.
Misal PORTA semua bit akan digunakan sebagai masukan, maka untuk mengaturnya kita gunakan
perintah...
Misalnya lagi, PORTA.0 akan dijadikan masukan sedangkan PORTA.2 sampai PORTA.7 akan
digunakan sebagai luaran, maka perintahnya...
DDRA= 0xFE;
Perhatikan 0xFE (heksa) = 0b11111110 (biner), perhatikan baik-baik konversi biner ini, setiap bit
nilai biner mewakili Pin-Pin pada PortA.
Penjelasan: Jika PIN.1 dihubungkan ke VCC (tegangan 5 Volt) melalui resistor (R), maka inilah
yang di maksud dengan pullup. Saat tidak ada tegangan dari luar, PIN.1 akan cenderung
berkondisi HIGH (logika 1). Sedangkan PIN.2 dibiarkan begitu saja sehingga kondisi logik dari
PIN.2 begitu rentan terhadap pengaruh disekitarnya. PIN.2 bisa berlogika HIGH, bisa juga
berlogika LOW, ini artinya logika PIN.2 mengambang (floating).
Kondisi floating biasanya diperlukan saat PIN sebuah mikrokontroler dihubungkan ke suatu sensor.
Karena jika di pullup, dikhawatirkan kondisi logik PIN tersebut mengganggu kondisi logik pin-pin
sensor yang bersangkutan.
DDRA=0x00;
PORTA = 0xFF;
Ini berarti seluruh pin-pin pada PORTA dijadikan sebagai masukan dan di-pullup, artinya pada
rangkaian yang terkait, jika menggunakan tombol atau pushbutton, jika tidak ditekan akan terbaca
HIGH dan jika ditekan akan terbaca LOW. Gunakan contoh rangkaian pada Gambar 15 dan
perhatikan tanda panah, pushbutton satu ujung dihubungkan ke pin yang terkait sedangkan ujung
lainnya di-GND-kan. INGAT! Ini bukan satu-satu-nya cara membuat rangkaian masukan dengan
pushbutton, tetapi ini cara yang mudah dan murah meriah... he he he...
Contoh lainnya...
DDRB= 0x00;
PORTB=0x0F;
Ini artinya seluruh pin-pin PORTB dijadikan masukan, dengan konfigurasi 0x0F (0b00001111) atau
PORTB.0 sampai PORTB.3 di-pullup, sedangkan PORTB.4 sampai PORTB.7 dikonfigurasi
floating.
Gambar 17. Penempatan LED dan Pushbutton pada AVR Trainer v2.0
10
Gambar AVR Trainer v2.0 selengkapnya ada di cover dari ebook ini!
Penjelasan:
Baris 1 – 4 merupakan deklarasi untuk definisi kristal yang digunakan, yaitu 11.0592MHz11. Pustaka
apa saja yang digunakan (baris 2 dan 3) dan alias untuk PORTB sebagai led (baris 4);
Baris 7- 10 merupakan subrutin untuk inisialisasi PORTB sebagai luaran (baris 9). Perhatikan bahwa
DDRB diberi logika 1 semua (=0xFF atau 255 desimal);
Program utama ditunjukkan pada baris 13 – 23, diawali dengan inisialisasi port (baris 15), kemudian
dilakukan pengulangan tak-hingga (baris 16);
Yang dilakukan adalah menyalakan LED, dengan cara memberikan logika 1 (baris 18), kemudian
melakukan penundaan 1 detik (baris 19), kemudian mematikan LED dengan logika 0 (baris 20) dan
diakhiri dengan penundaan 1 detik (baris 21);
Demikian seterusnya, LED akan berkedip-kedip dengan tundaan 1 detik.
11
Silahkan membaca artikel saya yang menjelaskan tentang masalah sistem clock pada mikrokontroler AVR di
http://agfi.staff.ugm.ac.id/blog/index.php/2009/12/mengenal-system-clock-pada-mikrokontroler-avr/
Penjelasan:
Penjelasan:
Baris 1 - 4 sudah jelas khan? Belum? Ya monggo, silahkan lihat dulu atau baca lagi penjelasan dari
percobaan-percobaan sebelumnya, jika sudah paham silahkan kembali lagi kesini...
Baris 6 – 8 digunakan untuk mendeklarasikan 3 macam alias, yaitu ‘tombol’, ‘satu’ dan ‘dua’. Jika
Anda perhatikan, khusus tombol didefinisikan sebagai register PIND, sebagaimana janji saya
sebelumnya register PINx saya jelaskan disini, yaitu digunakan untuk membaca masukan. Artinya
untuk memberikan luaran melalui register PORTx sedangkan untuk membaca masukan gunakan
register PINx;
Perhatikan sekarang pada rutin init_devices() yang berbeda dengan sebelumnya (baris 11 – 18):
o DDRB=255 sama seperti sebelumnya, PORTB semuanya dijadikan sebaga saluran luaran;
o PORTD.2 dan PORTD.3 digunakan sebagai saluran masukan, sehingga harus diberi logika
‘0’, caranya bagaimana? Anda bisa langsung memberikan instruksi DDRD = 0b00001100
atau DDRB = 0x0C;
Mudah bukan?
Jika sumber sinyal pemicu atau clock berasal dari internal maka Timer/Counter berfungsi sebagai
pewaktu atau timer dan jika sumber sinyal berasal dari luar maka disebut sebagai pencacah atau
counter.
Mikrokontroler ATMega16 memiliki 3 buah timer yaitu Timer0, Timer1 dan Timer2. Timer0 dan
Timer2 memiliki kapasitas 8-bit sedangkan Timer1 memiliki kapasitas 16-bit. Apa yang dimaksud
timer 8 bit dan 16 bit?
Timer 8-bit adalah pewaktu yang bisa mencacah atau menghitung hingga maksimal nilai
0xFF heksa (dalam biner = 11111111).
Timer 16-bit sama seperti timer 8-bit, hanya saja nilai maksimalnya mencapai 0xFFFF.
Pada ebook ini akan dibahas mengenai Timer1, 16-bit, dan untuk dapat menjalankan atau
menggunakan Timer1 ini, maka kita harus mempelajari terlebih dulu register-register yang berkaitan
dengan Timer1 karena di register itulah tempat pengaturan Timer/Counter1 agar bisa bekerja.
Pada Gambar 19 ditunjukkan diagram blok dari Timer1 16-bit, terlihat adanya beberapa register yang
terkait, antara lain (dari atas): TCNT1, OCR1A, OCR1B, ICR1, TCCR1A, TCCR1B dan juga
beberapa bit-bit terkait seperti: TOV1, OC1A, OC1B dan ICF1.
12
Jika ditekan bernilai logika ‘0’.
TCCR1B
TCNT1
TIMSK
TIFR
Register TCCR1B, ditunjukkan pada Gambar 20, merupakan tempat pengaturan clock yang intinya
agar Timer/Counter1 bisa bekerja, maka register TCCR1B ini jangan sampai diisi dengan 0x00
(dikosongkan).
Apa nilai praskalar itu? Timer1 (juga timer/counter lainnya) membutuhkan sumber detak atau
clock source. Biasanya sumber detak yang biasa kita pakai berasal dari XTAL. Besarnya maksimum
sama dengan XTAL yang digunakan dan minimum XTAL/1024. Nah nilai pembagi atau 1024 ini-
lah yang disebur nilai praskalar atau prescaler.
Apa yang terjadi jika semua bit di TCCR1B nol semua? Artinya bit 0, 1 dan 2 juga nol semua,
perhatikan Gambar 19, itu artinya CS12=0, CS11=0 dan CS10=0 dan itu menurut Tabel 1 “No clock
source (Timer/Counter stopped)” Timer berhenti bekerja! Atau tidak bekerja!!
Tiga bit (CS12, CS11 dan CS10) ini dulu yang kita perhatikan...
Okey! Register TCNT1 merupakan register pencacah, artinya nilai di dalamnya akan dinaikkan
setiap kali ada pemicu, bisa tepi naik atau tepi turun. Jika sumbernya dari dalam (internal)
pencacahan dilakukan pada saat tepi naik. Register ini akan mencacah naik dari 0x0000 sampai nilai
max 0xFFFF kemudian di-reset kembali lagi ke 0x0000.
Overflow (melimpah) terjadi saat kondisi dari 0xFFFF ke 0x0000, sehingga mengakibatkan bit
TOV1 pada register TIFR akan di-set (diberi logika 1). Kondisi overflow juga bisa digunakan untuk
menjalankan interrupsi.
Register TIMSK, yang ditunjukkan pada Gambar 21, merupakan register tempat pengaturan
interupsi overflow dari Timer/Counter1 yang ingin diaktifkan atau tidak. Dengan memberikan logika
1 pada bit TOIE1 (bit-2 pada TIMSK), maka interupsi Timer/Counter1 aktif dengan catatan bit
interupsi global diaktifkan (bit-7 di register Status SREG, perhatikan Gambar 22).
Sedangkan register TIFR (Timer/Counter Interrupt Flag Register), sebagaimana ditunjukkan pada
Gambar 23, digunakan sebagai indikator atau penanda apakah sudah terjadi overflow atau belum.
Pada Timer/Counter1, kondisi overflow ditandai dengan logika 1 pada bit TOV1 (bit-2) pada register
TIFR.
Persamaan untuk mencari waktu jeda yang ingin digunakan adalah berdasarkan nilai awal yang harus
dimasukkan ke dalam TCNT1, gunakan persamaan berikut:
13
Hanya saya tuliskan yang terkait saja, selengkapnya silahkan merujuk datasheet ATMega16.
Alternatif lain, Anda bisa menggunakan programnya AVR Timer yang bisa diunduh melalui website
http://www.techideas.co.nz. Langkah-langkah penggunakan program ini kita jelaskan berikut:
1. Setelah mengunduh program AVR Timer dari http://www.techideas.co.nz, langkah selanjutnya adalah
menjalankan AVRTimer1Clac.exe untuk perhitungan atau kalkulasi Timer1;
2. Lakukan pengisian beberapa nilai sebagaimana ditunjukkan pada Gambar 23, menyesuaikan dengan
kebutuhan yang telah kita tetapkan tadi:
a. Frekuensi kristal: 11,0592MHz atau ditulis 11.059.200 Hz;
b. Pilih nilai prescale sebesar 1024;
c. Isikan Timer1 Interrupts per second (berapa kali interupsi/detik) sebesar 1 kali;
d. Perhatikan hasilnya (Gambar 24).
Penjelasan:
Program ini pada dasarnya sama seperti percobaan-1, hanya saja sekarang tundaan atau jeda
menggunakan fasiltas Timer1 yang ada di ATMega16;
Cukup saya jelaskan saja subrutin delay1detik(), yang lainnya sama seperti penjelasan percobaan-
percobaan sebelumnya:
o Baris-15 merupakan pengisian register TCCR1B agar digunakan nilai prescale sebesar 1024,
artinya nilai kristal 11,0592MHz dibagi dengan 1024, sekaligus mengaktifkan Timer1;
o Baris-16 memberikan nilai awal pada TCNT1 sesuai dengan perhitungan atau kalkulasi yang
telah dilakukan sebelumnya, yaitu mengisi dengan nilai awal 54.736 (desimal) atau 0xD5D0
(heksadesimal);
o Baris-17 menunggu hingga terjadi overflow – ini merupakan proses pooling bukan interupsi;
o Jika sudah terjadi overflow atau melimpah, maka flag TOV1 di-reset (baris 18) dan Timer1
dimatikan (baris 19).
Gampang tho!?
Percobaan-5 ini sebenarnya juga mirip/sama dengan percobaan-4 (sebelumnya), hanya saja digunakan
fasilitas Timer2 untuk melakukan penundaan 1 detik;
Anda perhatikan pada 12 hingga 28:
o Terdapat ....14 subrutin yaitu delay10ms() dan ........................15;
o Mengapa kok tidak langsung dilakukan tundaan 1 detik? Mengapa harus melakukan
pengulangan ....16 kali subrutin delay10ms()? Perhatikan baris 24 – 27;
o Ingat, Timer2 merupakan timer ....17 bit, artinya dengan kemampuan seperti itu tidak bisa
dilakukan langsung tundaan 1 detik, cara paling gampang untuk mendapatkan tundaan 1 detik
atau 1.000 milidetik adalah mengulang 100 kali tundaan 10 milidetik;
o Perhatikan register TCCR2 bit 0, 1 dan 2 pada Gambar 23. Kemudian perhatikan juga Tabel
2 untuk semua kemungkinan nilai CS22, CS21 dan CS20.
o Nilai prescale yang digunakan, mengikuti Tabel 2, perhatikan pada baris 14, adalah sebesar
....18 atau nilai clock dibagi dengan nilai prescale tersebut;
o Agar terjadi penundaan sekitar 10 milidetik, maka nilai register TCNT2 (pada baris 15) diberi
nilai sebesar .....19 heksadesimal atau .......20 desimal;
o Baris 16 digunakan untuk menunggu terjadinya ......................21 pada Timer2, kemudian bit
overflow tersebut direset (baris-17).
14
Jawaban: 2 (dua)
15
Jawaban: delay1detik()
16
Jawaban: 100 (seratus)
17
Jawaban: 8 (delapan)
18
Jawaban: 1024
19
Jawaban = 94
20
Jawaban = 148 (seratus empat puluh delapan)
21
Jawaban: overflow
22
Jawaban: 0 (nol) atau 0x00
Penjelasan:
Silahkan tulis beberapa paragraf yang menjelaskan program ini – mengikuti kaidah-kaidah
yang sudah dijelaskan sebelumnya...
8. Komunikasi Serial
Komunikasi serial pada mikrokontroler AVR menggunakan fasilitas USART singkatan dari
Universal Syncronous and Asyncronous Receiver Transmitter sangat handal dan berguna dalam
berbagai aplikasi yang berhubungan antarmuka komunikasi serial dengan PC atau sesama
Copyright (c) 2010 by Agfianto Eko Putra and Dhani Nugraha - 38
mikrokontroler AVR atau bahkan mikrokontroler lain yang memiliki fasilitas komunikasi serial,
misalnya program pemantauan suhu ruangan sekaligus pengontrolan AC atau kipas menggunakan
antarmuka program PC Visual Basic atau Delphi, dan lain-lain.
Jalur komunikasi serial pada mikrokontroler AVR ATMega16/32/8515 terdapat pada pin PORTD.0
(RXD) dan PORTD.1 (TXD), perhatikan pin-pin yang terkait pada Gambar 4 dan 5. Diagram
bloknya ditunjukkan pada Gambar 28.
Pembahasan komunikasi serial USART dipisahkan menjadi 3 bagian yaitu Penghasil detak (clock
generator), Mengirim data (Data Transmit) dan Menerima data (Data Receive).
• Normal asynchronous;
• Double Speed asynchronous;
• Master synchronous, dan
• Slave synchronous.
Pada Gambar 29 ditunjukkan diagram blok logik penghasil detak yang terkait dengan beberapa
register seperti UBRR (16-bit: UBRRL dan UBRRH) dan lain-lain.
Gambar 29. Diagram blok logik penghasil detak untuk komunikasi serial
Anda bisa menghitung berapa nilai UBRR yang sesuai dengan baudrate yang diinginkan mengacu
pada osilator atau kristal yang digunakan oleh mikrokontroler menggunakan persamaan
BAUD = fclk/(16(UBRR+1))
Persamaan ini digunakan untuk Asynchronous Normal Mode, jika menggunakan mode Double
Speed Asynchronous, maka persamaan yang digunakan adalah
BAUD = fclk/(8(UBRR+1))
Informasi detil tentang clock generator ini bisa dilihat di datasheet AVR ATMega16. Anda bisa juga
memanfaatkan website http://www.wormfood.net/avrbaudcalc.php untuk menghitung secara online.
Misalkan digunakan frekuensi osilator untuk mikrokontroler sebesar 8 MHz (atau 8.000.000 Hz) dan
baudrate yang diinginkan adalah 9600, setelah dihitung menggunakan persamaan diatas diperoleh
nilai UBRR sebesar 51,083333333, kita bulatkan menjadi 51. Dengan nilai UBRR =51, maka nilai
seseungguhnya dari baudrate adalah 9615 (bukan 9600), jika dibagi dengan 9600 diperoleh 1.0016
dan karena itu error-nya adalah 0.16%. Dengan error tersebut USART masih dapat bekerja tetapi
tidak sempurna.
Anda bisa menggunakan AVR Assistant yang dibuat oleh Mike Henning (bisa Anda unduh program
tersebut di http://www.esnips.com/web/AtmelAVR), program ini juga bisa digunakan sebagai
alternatif dari AVR Timer Calculator yang telah dijelaskan sebelumnya. Tampilan awal ditunjukkan
pada Gambar 30.
• Bagian kiri digunakan untuk mengatur baudrate, sedangkan bagian kanan digunakan untuk
mengatur Timer0, 1 dan 2 (jadi satu antarmukanya);
• Contoh untuk baudrate 9600, dengan kristal 8MHz, hasil perhitungannya ditunjukkan pada
Gambar 31 kiri, sedangkan untuk kristal 7,372MHz ditunjukkan pada Gambar 31 kanan.
Perhatikan perbedaan error %-nya.
Gambar 31. Contoh penggunaan AVR Assistant v1.3 untuk dua frekuensi MPU berbeda
• Untuk contoh pengaturan Timer1 agar menunda interupsi terjadi 100 kali per detik (seperti
kasus timer yang dijelaskan sebelumnya), dengan frekuensi kristal 11,059MHz, ditunjukkan
pada Gambar 32.
Berikut adalah subrutin yang digunakan untuk menghitung nilai UBRR pada winAVR GCC
Variabel MYUBRR digunakan untuk menyimpan nilai UBRR setelah dilakukan perhitungan
sebagaimana ditunjukkan pada listing tersebut. Pemanggilannya menggunakan instruksi
initserial(MYUBRR);
23
Hasil perhitungan dari http://www.wormfood.net/avrbaudcalc.php
Saat bit TXEN diberi logika 1, artinya USART Transmitter diaktifkan, dengan demikian pin TxD
pada PORTD.1 hanya bisa digunakan untuk pengiriman data pada komunikasi serial. Lakukan
terlebih dahulu inisialisasi baudrate, mode kerja dan format data sebelum mengirimkan data-data
melalui port serial. Untuk mengatur berapa stop bit, digunakan USBS pada register UCSRC,
sedangkan mengatur lebar bit data digunakan UCSZ2 (di register UCSRB), UCSZ1 dan UCSZ0 (di
register UCSRC) mengikuti Tabel 4.
Jika Anda menggunakna mode sinkron, maka pin XCK (PORTB.0) hanya boleh digunakan untuk
mengirimkan detak atau clock transmisi.
Berikut adalah subrutin yang digunakan untuk mengaktifkan UASRT Transmitter pada winAVR
GCC.
Berikut adalah subrutin (b dan uart_putc()) yang digunakan untuk mengirimkan sebuah data
(karakter)
Penjelasan:
Pada subrutin pertama, uart_putc(), data dikirimkan dengan cara menuliskan sebuah kode
karakter ke register UDR, perhatikan Gambar 35, perhatikan baris 19;
Namun sebelum menuliskan atau mengisi register UDR, ditunggu dulu nilai bit UDRE (bit-
5) pada register UCSRA (Gambar 36) agar bernilai 1 (satu), maksudnya jika UDRE=1
berarti UDR-nya kosong dan siap mengirim data berikutnya, perhatikan baris 18;
Subrutin kedua, yaitu uart_puts() digunakan untuk mengirimkan serangkaian data (tidak
hanya satu karakter saja), perhatikan terjadinya pengulangan subtrutin uart_putc() pada baris
27 dan 28.
Berikut adalah cara yang digunakan untuk menerima data (karakter), ada di dalam program utama
(main()):
Untuk menerima data caranya mudah, yaitu dengan memeriksa apakah bit RXC (bit ke 7) pada
register UCSRA bernilai 1? Perhatikan Gambar 36 dan baris 50. Jika RXC bernilai 1 artinya UDR
Konektor komunikasi serial pada AVR Trainer Board v2.0 ditunjukkan pada Gambar 38.
Catatan:
Saran dan masukan untuk ebook ini silahkan kirim email ke agfi68@ugm.ac.id, terima kasih!
Pelatihan yang saya selenggarakan memberikan konsep dasar dan tip/trik pembuatan aplikasi
mikrokontroler AVR!
24
Waktu minimal pelatihan, Anda juga bisa menambah jumlah jam jika masih merasa kurang – tingkat lanjut!
Kekhawatiran Anda akan berakhir! Kesulitan Anda akan segera teratasi Apa yang Anda cari
akan segera ditemukan! Dapatkan PENAWARAN ISTIMEWA selama promosi!
Dapatkan informasi selengkapnya di http://klikdisini.com/jualavrbasic
Saya tersugesti, klo baca bukunya pak agfi, saya baru bisa paham... padahal saya juga uda punya
buku mikro yg lain, spt nya gak enak, klo gak baca punya pak agfi, aneh memang...
Teguh Budiman
Waduh, emang sip banget penjelasannya pak Agfi, salah satu yang saya kagumi dari pak Agfi
adalah kalo pak Agfi njelasin sesuatu pasti dengan ringkas, padat, berisi, to the point dan mudah di
mengerti.. saya juga senang baca buku-bukunya pak Agfi lho, nah.. itu adalah tanda-tanda dari
dosen, entrepreneur dan sekaligus penulis yang profesional..| salut dah buat pak Agfi.. Seandainya
sebagian besar dosen bisa aktif seperti pak Agfi, pasti Indonesia makin maju neh..
Herlambang (http://indomicron.co.cc)
Kali ini saya coba-coba menggunakan perangkat lunak Flowcode AVR versi 3.025 (tampilan awal
ditunjukkan pada Gambar 1.1) untuk melakukan kompilasi program mikrokontroler AVR hanya
dengan menggambarkan diagram alir atau flowchartnya. Apaan? Cukup pake diagram alir? Yup
betul!
Gambar 1.1
Baiklah, untuk percobaan, saya buka berkas baru dengan tampilan seperti Gambar 1.2. Tampak awal
dari diagram alir dan daftar pin dari mikrokontroler AVR ATmega32 yang saya gunakan sebagai
contoh kali ini.
Gambar 1.2
25
Pada saat ebook ini ditulis sudah tersedia versi 4.3.3.6, silahkan di-unduh di
http://www.4shared.com/file/kTQ_NYyL/Flowcode_AVR_Professional_4366.html dan jika suka silahkan dibeli.
Gambar 1.3
Justru yang saya ulas disini adalah hasil kompilasi yang aneh atau barangkali unik atau barangkali
itulah ciri khas dari Flowcode AVR? Sebagaimana ditunjukkan pada Gambar 1.5 dan Gambar 1.6.
Pada Gambar 1.5 keunikan terjadi karena inisialisasi PORTA yang seharusnya cukup sekali saja
dilakukan justru dilakukan pada tiap instruksi untuk mengirimkan nilai 0 (LED mati semua) dan 255
(LED hidup semua), perhatikan tanda panah pada Gambar 1.5. Mengapa tidak sekali saja yach?
Mungkin untuk jaga-jaga kali yaaa…??
Pada Gambar 1.6 terjadi pengulangan instruksi yang sama persis (lihat tanda panah), kenapa tidak
dibuat subrutin-nya skalian yach??
Kesimpulannya:
Enakan pake ASM atau Native C langsung untuk membuat program mikrokontroler AVR,
agar kita bisa langsung menulis kode-kode secara efisien dan efektif.
Bagaimana dengan BASCOM AVR? Boleh-boleh saja, cuman tetap harus hati-hati…
Gambar 2.1
Kemudian kita kompail dan disimulasikan hasilnya (juga) bisa dilihat pada Gambar 2.1 tersebut.
Perhatikan bahwa tidak semua masukan PORT A kita buat berlogika 1, hanya A7, A5, A3 dan A1.
Hasilnya juga tidak semua LED pada PORT B menyala, hanya sesuai dengan PORT A saja, yaitu
B7, B5, B3 dan B1. Nah sekarang pertanyaannya:
Bagaimana dengan hasil kompilasi dalam bahasa C-nya (juga dalam bahasa ASM-nya)?
Berikut saya cuplik sebagian hasil kompilasi dalam bahasa C (baris 59-96), cukup yang utama dulu,
selebihnya Anda bisa mencermati bahwa di awal program C-nya merupakan inisialisasi variabel,
pemetaan mikrokontroler dan lain-lain. Perhatikan Gambar 2.2.
Pada cuplikan listing tersebut saya sudah memberikan catatan. Bagaimana dengan Anda? Apa yang
dilakukan pada bagian inisialisasi, baris 76 dan 77? Instruksi MCUCSR = 0×00; digunakan untuk
mereset (memberikan logika 0) pada semua bit di register MCUCSR (MCU Control and Register),
perhatikan penjelasan pada Gambar 2.3. Sedangkan WDTCR = 0×10; digunakan untuk mematikan
watchdog, perhatikan penjelasan register WDTCR (Watchdog Control Register) di Gambar 2.4.
Langkah ini dilakukan oleh Flowcode AVR, menurut saya, untuk keamanan atau play safe saja.
Karena kemungkinan kompailer C yang digunakan tidak mematikan watchdog secara otomatis (ada
beberapa kompailer yang bisa melakukan-nya secara otomatis selama tidak secara eksplisit
dinyatakan penggunaan watchdog).
Listing program selebihnya adalah sesuai dengan yang diharapkan, baca masukan seperti pada baris
85, namun sebelumnya ada inisialisasi PORT A sebagai masukan, mengapa tidak langsung aja
DDRA = 0×00? Kok harus di-AND-kan segala dengan 0, khan hasilnya sama saja logika-0 khan?
Aneh? Kemudian dilanjutkan dengan mengirimkan isi variabel dari pembacaan PORT A ke PORTB,
lihat baris 91, yang sebelumnya (juga) diawali dengan inisialisasi PORT B sebagai luaran (nah kalo
ini caranya langsung).
Gambar 2.4
Gambar 2.5
Hasil kompilasi kedalam Bahasa C saya tunjukkan satu persatu. Pada bagian pertama, sebagaimana
ditunjukkan pada Gambar 3.2, merupakan deklarasi fungsi-fungsi makro untuk menangani LCD
(baris 66 - 74). Terdapat 9 macam fungsi makro LCD dan hanya 3 yang akan digunakan dalam
program, yaitu:
26
Lihat pembahasan Bonus-1
27
Lihat pembahasan Bonus-1 dan Bonus-2
Gambar 3.1
Gambar 3.2
Untuk fungsi FCD_LCDDisplay0_Start() listing programnya ditunjukkan pada Gambar 3.3. Apa
yang dilakukan oleh fungsi ini adalah melakukan inisialisasi tampilan LCD dengan antarmuka 4 bit
data (Flowcode 3 AVR hanya menyediakan antarmuka 4-bit data LCD walaupun bisa juga
digunakan rangkaian antarmuka 8-bit data LCD). Rangkaian yang digunakan menggunakan
pemetaan PORT dan pin LCD sebagai berikut:
Gambar 3.3
Gambar 3.4
Gambar 3.5
Nah program utama ditunjukkan pada Gambar 3.6. Diawali dengan inisialisasi register MCUCSR
dan WDTCR pada baris 373 dan 374 (baca artikel saya sebelumnya28). Kemudian dilanjutkan
dengan melakukan inisialisasi LCD (baris 381) menggunakan fungsi FCD_LCDDisplay0_Start().
Diikuti dengan menampilkan string “Halo Flowcode3 (baris 386, angka 14 merupakan jumlah
karakter pada string yang bersangkutan), menempatkan kursor pada baris kedua kolom pertama
(baris 391), menampilkan string “by ATMega32 (baris 396) dan diakhiri dengan infinite-loop atau
kalang-takhingga (baris 399).
Jika Anda perhatikan baik-baik pada ketiga fungsi tersebut, maka bisa Anda temukan pemanggilan
fungsi lain yaitu LCD_2360334_RawSend(char nIn, char nMask), yang digunakan untuk
mengirimkan satu karakter. Pendefinisian fungsi ini ada di dalam fungsi
FCD_LCDDisplay0_GetDefines().
28
Lihat pembahasan Bonus-2
29
Klik http://www.4shared.com/file/HVLCKV_0/serial_lcd01.html
Silahkan membuat kerangka diagram alir menggunakan acuan Gambar 4.1. Pada blok Calculation
masih kita kosongkan…
Okey, langkah selanjutnya lakukan klik-ganda pada blok Calculation, sehingga dimunculkan kotak
dialog yang ditunjukkan pada Gambar 4.2.
Ganti nama “Calculation” (pada Display Name) menjadi “Total Sapi” (tanpa tanda petik). Kemudian
lanjutkan menuliskan persamaan untuk menghitung total sapi sebagai berikut: TOTAL = TOTAL +
SAPI (pada bagian isian Calculations). Perhatikan Gambar 4.3.
30
Pada saat ebook ini ditulis sudah tersedia versi 4.3.3.6, silahkan di-unduh di
http://www.4shared.com/file/kTQ_NYyL/Flowcode_AVR_Professional_4366.html
Gambar 4.2
Sensor detektor sapi disimulasikan menggunakan tombol tekan atau pushbutton yang dipasang pada
PORTA.0. Jika tombol ditekan maka akan menghasilkan nilai 1 yang kemudian disimpan ke dalam
variabel SAPI. Dengan demikian, penekanan tombol pada PORTA.0 akan menambah nilai TOTAL
sebesar 1. Jika tidak ditekan, ya artinya nilai pada variabel SAPI tetap 0 (nol) dan tidak merubah
nilai dari TOTAL, demikian seterusnya.
Gambar 4.3
Gambar 4.4
Sekarang kita lanjutkan dengan mendefinisikan variabel-variabel yang terkait tersebut. Variabel yang
akan kita definisikan adalah TOTAL dan SAPI. Penggunaan kedua variabel ini sudah saya jelaskan
sebelumnya, jika belum paham silahkan ditengok lagi, nanti baru kembali lagi kesini…
Klik pada tombol Add New Variable… sehingga dimunculkan kotak dialog Create sebagaimana
ditunjukkan pada Gambar 4.5. Ketik “SAPI” (tanpa tanda petik) pada isian Name of New Variable
Gambar 4.5
Gambar 4.6
Klik Close, kemudian kembali lagi ke kotak dialog Calculations dan akhiri dengan klik Ok. Hasil
dari diagram alir sampai tahap ini ditunjukkan pada Gambar 4.7.
Sekarang saatnya mengatur pengulangan (loop). Klik pada blok Loop sehingga ditampilkan kotak
dialog seperti pada Gambar 4.8.
Gambar 4.8
Perhatikan juga pilihan Test the loop at, yaitu Start dan End. Apakah pengujian dilakukan di awal
pengulangan (Start) atau diakhir (End)? Hal ini tentu saja berpengaruh terhadap jumlah
pengulangan yang terjadi.
Isian Loop Count merupakan bentuk pengulangan yang pasti, berapa kali dilakukan pengulangan,
Anda bisa mengisikan angka yang sesuai dengan kepentingan program.
Sementara ini biarkan isian seperti itu, klik saja Cancel untuk membatalkan.
Okey, kita lanjutkan dengan klik ganda pada blok Input, sehingga ditampilkan Gambar 4.9
(perhatikan 3 tanda panah-nya).
Gambar 4.9
Ubah Display name (panah teratas) menjadi “Cek sensornya”. Klik tombol Variables… (sebelah
kanan panah tengah), klik pada variabel SAPI dan klik tombol Use Variable. Perhatikan isian Port
yang sudah terisi dengan PORT A dan ini sudah sesuai dengan program kita, so akhiri dengan klik
Ok.
Langkah selanjutnya adalah menentukan luaran melalui PORT B. Klik ganda pada blok Output.
Mirip dengan cara menentukan masukan sebagaimana sudah saya jelaskan. Klik tombol Variables,
pilih variabel TOTAL dengan cara yang sama seperti sebelumnya. Ganti isian Port menjadi PORT
B. Hasil akhir dari diagram alir ditunjukkan pada Gambar 4.10.
Berikutnya adalah menambahkan tampilan LED pada Flowcode AVR untuk kepentingan simulasi.
Klik pada ikon LED (ada di sebelah kiri atas gambar LED berjejer miring). Maka pada Flowcode
AVR akan ditampilkan kotak LED, perhatikan (panah pada) Gambar 4.11.
Untuk menghubungkan LED ini dengan PORT B, klik pada panah kebawah di LED dan pilih
Component Connections…, sehingga ditampilkan kotak dialog seperti Gambar 4.12. Gantilah
PORT A pada kotak dialog Component Connections.. tersebut dengan PORT B, bit 0 sampai
dengan 7 untuk masing-masing LED.
Sekarang tambahkan pushbutton pada Flowcode AVR dengan klik ikon Switch (di sebelah kanan
ikon LED yang telah Anda klik sebelumnya). Perhatikan Gambar 4.13.
Gambar 4.12
Kita atur Properties dari switch ini dengan klik tanda panah kebawah dan pilih Properties, sehingga
ditampilkan Gambar 4.14. Jumlah pushbutton cuman 1, ganti angka pada Number of switch menjadi
1 (perhatikan tanda panah yang terkait). Lanjutkan dengan klik pada Tab Switch label dan ketik
seperti pada Gambar 4.15.
Okey, tugas membuat program sudah selesai, hasil akhir dari tampilan Flowcode AVR ditunjukkan
pada Gambar 4.16.
Selanjutnya sudah bisa dilakukan simulasi. Klik Run (tanda panah pada Gambar 4.16) dan nikmati
hasilnya! Kenapa? Wow pencacahan dilakukan dengan sangat cepat, ketikan kli pada pushbutton
LED pada PORT B berubah secara cepat (sekali)! Bagaimana mengatasinya?
Sisipkan tundaan di dalam flowchart sebagaimana ditunjukkan pada Gambar 4.17. Kemudian
jalankan lagi simulasinya…
Listing program utama (main()) dalam Bahasa C ditunjukkan pada Gambar 4.18
Terima kasih...!
Gambar 4.15
Gambar 4.17
Rangkaian yang digunakan ditunjukkan pada Gambar 5.1, sengaja LED disusun secara CA atau
common Anoda, sehingga untuk menyalakan LED harus dikirimkan logika ‘0 .
Untuk kompilasi digunakan AVR Studio versi 4.0 (silahkan unduh GRATIS dari
http://www.atmel.com). Program kita awali dengan beberapa macam deklarasi, keterangan sengaja
saya masukkan dalam listing program untuk memudahkan pembelajaran langsung dari listingnya,
perhatikan instruksi yang diawali dengan ‘.’ merupakan directive dari AVR Studio, bukan instruksi
assembly mikrokontroler AVR:
;------------------------------------------
;animasi LED berjalan dalam bahasa Assembly
;untuk mikrokontroler Atmel AVR ATMega32
;frekuensi kristal 7.3728MHz
;http://agfi.staff.ugm.ac.id
;------------------------------------------
.nolist ;bagian ini
.include "m32def.inc" ;tidak perlu ditampilkan dalam
.list ;berkas list
Ingat berkas “m32def.inc” kita sertakan (directive .include) karena akan digunakan pustaka
ATMega32 dalam program kita, tetapi tidak perlu disertakan dalam hasil berkas LIST-nya (hasil
kompilasi program) menggunakan directive .nolist dan .list.
Variabel LED digunakan untuk menyimpan data yang akan dikeluarkan melalui PORTA, awalnya
diisi 0b01111111, artinya LED-0 akan dinyalakan terlebih dahulu. Variabel TEMP digunakan
variabel alias untuk R16 (register-16), Anda boleh menggunakan nama alias apa saja, misalnya, tahu,
brokoli, wortel dan lain sebagainya (emang buat sayur yach? he he he)…
Program diawali dengan mendeklarasikan segmen kode (.cseg) dan dimulai alamat0×0000 (.org) -
ini paling logis kita siapkan di alamat tersebut, silahkan saja kalo mo diganti dengan alamat
lain asalkan tidak konflik dengan kepentingan lainnya dalam program. Ragu-ragu? Ya sudah ikuti
saja pake alamat 0×0000, aman dech…!
Jika Anda lupa atau tidak melakukan inisialisasi stack, ada kemungkinan besar akan terjadi
kemacetan pada program, artinya program seakan-akan stuck. Jika Anda menggunakan simulator
semacam Proteus (yang pernah saya coba menggunakan Proteus 7.6 SP4), program akan berjalan
tanpa kesalahan, namun ketika dicobakan ke rangkaian sesungguhnya program akan berhenti (stuck).
Saran saya, ada baiknya tidak terlalu mengandalkan simulator mikrokontroler semacam Proteus,
usahakan untuk mencoba di dunia nyata, di rangkaian sesungguhnya. Berikut cuplikan program
untuk menginisialisasi stack di akhir ruang RAM (RAMEND).
Karena STACK pada ATMega32 ukuran 16bit atau 2byte, maka pengisian SP dilakukan dua kali
untuk SP Low atau SPL dan SP High atau SPH. Fungsi Low() dan High()masing-masing digunakan
untuk mendapatka bagian LOW atau HIGH dari variabelRAMEND yang suda tersimpan dalam
“m32def.inc”. Pengisian register pada AVR tidak bisa dilakukan langsung, dalam hal ini melalui
variabel TEMP baru kemudian dipindahkan ke SPL dan SPH. Hal ini berlaku juga untuk penjelasan
terkait berikut ini…
Berikutnya, karena kita menggunakan mikrokontroler AVR, sudah wajib kita menentukan sebuah
PORT sebagai masukan atau luaran, jika masing-masing bit pada register DDRx diberi nilai ‘1
artinya sebagai luaran (jika ‘0 sebagai masukan). Karena digunakan PORTA maka digunakan
register DDRA (penulisan ke DDRA (out ddra,temp) tidak bisa langsung, sehingga digunakan
variabel TEMP (ldi temp,0b01111111)):
Data disimpan terlebih dahulu di variabel TEMP (ldi temp,led), kemudian baru dikeluarkan ke
PORTA (out porta,temp), tidak bisa langsung dikirim ke PORTA. Untuk menggeser dan memutar bit
pada variabel TEMP digunakan instruksi ROR (Rotate Right Using Carry), karena melewati Carry
sedangkan Carry biasanya isinya ‘0 , maka harus diberi ‘1 dulu dengan instruksi SEC. Pengulangan
dilakukan dengan melompat kembali ke label ‘putar’ menggunakan rjmp putar.
Bagian akhir dari program adalah subrutin penundaan sekitar 0.25detik (lihat pada listing program
lengkap). Kok bisa ya? Ya pake saja program AVR Delay Loop Generator, sebagaimana screen
shoot-nya ditunjukkan pada Gambar 5.2, silahkan unduh gratis di-sini31.
Memang menggunakan pengulangan register, penundaan 0.25 detik tidak akan akurat, tetapi
lumayan buat melakukan penundaan sesaat. Jika Anda ingin akurat, gunakan fasilitas Timer/Counter
pada mikrokontroler AVR yang bersangkutan.
Gambar 5.2
31
http://www.electronics-lab.com/downloads/cnt/fclick.php?fid=23
; =============================
; delay loop generator
; 1843200 cycles:
; untuk frek 7.3728MHz
; penundaan 0.25 detik
; -----------------------------
; delaying 1843182 cycles:
tunda:
ldi R17, $12
WGLOOP0: ldi R18, $A1
WGLOOP1: ldi R19, $D3
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
Sedangkan dalam Bahasa C Native (menggunakan AVR Studio 4 dan GCC) ditunjukkan lengkap
sebagai berikut:
//========================================
// animasi LED di PORTA
//=========================================
#include
#include //pustaka DELAY untuk frek 1MHz
#define PORTLED PORTB //penentuan alias untuk PORTB
#define DDRLED DDRB //penentuan alias untuk DDRB
Silahkan Anda cermati perbedaan penulisan menggunakan Assembly dan Native C (gcc), untuk
urusan penundaah digunakan fungsi _delay_ms() yang sudah didefinisikan di berkas “delay.h” dan
berlaku untuk frekuensi operasional 1MHz. Sedangkan inisialisasi PORT sama seperti pada
Assembly. Yang mungkin Anda pertanyakan adalah pengganti perintah ROR yaitu menggunakan
instruksi “temp=(temp<<7)|(temp>>1);“, untuk ROL tinggal Anda ganti dengan
“temp=(temp<<1)|(temp>>7);” dan “unsigned char temp=0×80;” menjadi “unsigned
char temp=0×01;“.
Demikian penjelasan singkat saya tentang aplikasi animasi LED berjalan menggunakan bahasa
assembly dan C untuk mikrokontroler AVR ATMega32. Semoga bermanfaat dan sukses selalu untuk
Anda!
Rangkaian yang kita gunakan mirip dengan animasi LED, hanya saja sekarang kita tambahkan 2
buah pushbutton yang dihubungkan ke PORTD.0 dan PORTD.1, perhatikan Gambar 1.
Selanjutnya kita buat programnya dengan diagram alir yang ditunjukkan pada Gambar 6.2.
Gambar 6.2
;=======================================================================
;program aplikasi pushbutton dan animasi LED
;http://agfi.staff.ugm.ac.id
;=======================================================================
.nolist
.include "m32def.inc"
.list
;-----------inisialisasi port--------------------------------------------
---
ldi temp,0b11111111 ;inisialisasi untuk pin di
out ddrb,temp ;PORTB sebagai luaran semua
clr temp ;inisialisasi untuk pin di
out ddrd,temp ;PORTD sebagai masukan semua
ser temp ;inisialisasi untuk pin di
out portd,temp ;PORTD agar aktif semua internal pull-
up-nya
ldi temp,led ;persiapan data untuk animasi LED
kanan:
out portb,temp ;keluarkan melalui PORTB
sbis pind,0 ;cek apakah pind,0 HIGH
rjmp kiri ;YA! lompat ke label kiri
rcall tunda ;TIDAK!
ror temp ;putar satu bit ke kanan
rjmp kanan ;lagi!
kiri:
out portb,temp ;keluarkan melalui OPRTB
sbis pind,1 ;cek apakah pind,1 HIGH
rjmp kanan ;YA! lompat ke label kanan
rcall tunda ;TIDAK!
rol temp ;putar satu bit ke kiri
; =============================
; delay loop generator
; 2000000 cycles:
; -----------------------------
; delaying 1999998 cycles:
tunda:
ldi R17, $12
WGLOOP0: ldi R18, $BC
WGLOOP1: ldi R19, $C4
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; -----------------------------
; delaying 2 cycles:
nop
nop
ret
; =============================
.exit ;akhir program
Penjelasan:
Untuk penjelasan tentang inisialisasi stack dan rutin tundaan silahkan lihat artikel bonus-5;
Perhatikan blok inisialisasi PORT, untuk menentukan apakah suatu PORT digunakan
sebagai luaran atau masukan digunakan register DDRx, dengan x diisi A, B, C atau D
menyesuaikan dengan penggunaan port yang digunakan. Dalam kasus ini
digunakan DDRB dan DDRD, masing-masing untuk PORTB danPORTD. Logika ‘1 untuk
luaran, logika ‘0 untuk masukan.
Sekali lagi penulisan ke DDRx tidak bisa dilakukan langsung, artinya Anda tidak bisa
memberikan instruksi, misalnya, ‘out ddrd,0b00000000 yang mengakibatkan adanya
kesalahan saat kompilasi. Gak percaya? Ya silahkan dicoba sendiri…
Selanjutnya label ‘KANAN‘ dan ‘KIRI‘ digunakan untuk melakukan animasi LED sesuai
dengan pushbutton yang ditekan. Pada label KANAN, diawali dengan mengeluarkan data
TEMP ke PORTB, kemudian diikuti dengan instruksi SBISyang merupakan instruksi “Skip
if Bit in I/O Register is Set“, artinya abaikan instruksi berikutnya jika bit yang diperiksa
bernilai HIGH atau berlogika ‘1 . Karena yang diperiksa adalah PORTD.0, dan
konfigurasinya adalah aktif rendah (ditekan berarti HIGH), sehingga jika tidak ditekan
(dalam kondisi 1 atau SET), maka instruksi RJMP KIRI akan diabaikan, dan program
melanjutkan ke penundaan sesaat (RCALL TUNDA), melakukan rotasi bit ke kanan pada
TEMP (ROR TEMP) dan mengulang lagi (RJMP KANAN).
Hal di atas berlaku juga untuk label KIRI, demikian seterusnya.
Pelatihan yang saya selenggarakan memberikan konsep dasar dan tip/trik pembuatan aplikasi
mikrokontroler AVR!
Pak Agfi, salut buat jiwa “technopreneur” yang kuat dan inovatif. Saya bisa lihat di tulisan -
tulisan Bapak. Btw, saya sendiri juga sedang belajar untuk mengembangkan bidang
otomasi, esp. PLC dan SCADA
Handy (http://learnautomation.wordpress.com/)
btw,,saya sudah mempunyai buku mikon mas dah lama bgt,, thanx atas bukunya
mas,,saya jadi bisa memahami mikon,,saya juga sudah bisa membuat alat yg berbasis
mikon,,khususnya at89sxx
Ruby
32
Waktu minimal pelatihan, Anda juga bisa menambah jumlah jam jika masih merasa kurang – tingkat lanjut!
Program mikrokontroler disimpan ke dalam Flash PEROM-nya AT89, sekaligus bisa juga dihapus,
keunggulan ini dapat dimanfaatkan sebagai sarana belajar mikrokontroler, karena tidak memerlukan
memori program luar seperti EPROM maupun EEPROM, yang membutuhkan peralatan pengisian
dan penghapusan yang merepotkan. Sehingga pada bagian terakhir dibahas secara singkat pembuatan
alat untuk mengisi (sekaligus menghapus) program dari mikrokontroler AT89 menggunakan
Pemrogram Easy Downloader 2.2, selain itu buku ini dilengkapi dengan CDROM yang berisi
dokumentasi lengkap Pemrogram Easy Downloader 2.2 dan program pendukung untuk kompilasi
dan informasi lainnya.
Anda bisa mendownload daftar isi33 dan/atau contoh bab34 yang ada di buku ini… monggo…
http://www.gavamedia.net/products-page/microcontroller-robotika-dan-plc/belajar-mikrokontroler-
at-89c515255-teori-dan-aplikasi-edisi-2/
33
http://www.esnips.com/doc/e2fdc2b1-84e6-4a54-a7dd-6b311894e1a4/isi_mcs51
34
http://www.esnips.com/doc/cef364e2-6759-462f-9303-4b99c62f7db0/mcs51_03
Pada Bab 3 dibahas tentang ZEN Programmable Relay secara garis besar, fitur-fitur yang dimiliki,
area memori hingga catatan khusus untuk pengguna PLC Omron Sysmac jika ingin menggunakan
ZEN Programmable Relay. Kemudian di Bab 4 dijelaskan konsep-konsep pemrograman diagram
tangga ditinjau dari PLC Omron Sysmac.
Pada Bab 5 dijelaskan tentang perangkat lunak yang digunakan dalampemrograman PLC, baik
Syswin v3.4, ZEN Support Software v3.0 (serta simulatornya) dan PLC Simulator v1.0 karya Tang
Tung Yan yang bisa digunakan untuk belajar pemrograman diagram tangga tanpa harus memiliki
PLC Sysmac yang harganya mahal.
Aplikasi untuk masing-masing PLC, Sysmac dan ZEN Programmable Relay dibahas pada Bab 6 dan
Bab 7. Khusus untuk PLC Sysmac, saya membagi dua macam aplikasi, yaitu dasar dan lanjut,
sedangkan pada ZEN dikelompokkan berdasar fungsi-fungsi yang ada pada ZEN tersebut.
Anda bisa mendownload daftar isi35 dan/atau contoh bab36 yang ada di buku ini… monggo…
http://www.gavamedia.net/products-page/microcontroller-robotika-dan-plc/plc-konsep-
pemrograman-dan-aplikasi/
35
http://www.esnips.com/doc/c7a08a88-3662-4f33-b6d9-7f44d81f572f/isi_plc
36
http://www.esnips.com/doc/d2484bf8-0d3d-4234-a2e3-dab82aafa8e7/plc06
Anda bisa mendownload daftar isi37 dan/atau contoh bab38 serta bonus39 yang ada di buku ini…
monggo…
http://www.gavamedia.net/products-page/komputer-dan-teknologi-informasi/penapis-aktif-
elektronika-teori-dan-praktek/
37
http://www.esnips.com/doc/d5dd6e60-4940-4d7b-b58d-dec153ba4ca7/isi_tap
38
http://www.esnips.com/doc/ddd17fc3-cc8f-4eff-b131-b838d9003e7f/tapis04
39
http://www.esnips.com/doc/4808c7b5-55f0-4838-a6e7-f0b3551b9c02/filters
Pada Bab 4 dibicarakan secara singkat instruksi-instruksi pada prosesor 80×86 yang meliputi
instruksi untuk transfer data, aritmetika, manipulasi bit, transfer kontrol, string, interupsi dan kontrol
prosesor. Bab 5 diulas berbagai macam interupsi Prosesor 8086 dan cara penggunaannya. Bab 6
dibahas tentang cara membuat dan menggunakan prosedur dan makro dibicarakan pada bab ini.
Selain itu program Emu8086 dilengkapi fungsi-fungsi siap pakai yang memudahkan dalam
pembuatan program Bahasa Assembly.
Sedangkan pada Bab 7, jika Anda suka dengan elektronika, maka dijelaskan bahwa dengan Bahasa
Assembly-pun Anda bisa melakukan pengamatan dan pengendalian perangkat keras di luar komputer
(yang biasa juga dikenal sebagai Teknik Antarmuka PC), tentunya bisa disimulasikan dengan piranti
semu (virtual devices) yang telah disediakan oleh Emu8086.
Program EMU8086 bisa diunduh disini40 sedangkan listing program dalam buku bisa
diunduh disini41. Anda bisa mendownload daftar isi42 dan/atau contoh bab43 yang ada di buku ini…
monggo…
http://www.gavamedia.net/products-page/komputer-dan-teknologi-informasi/belajar-bahasa-
assembly-dengan-emu-8086/
40
http://www.4shared.com/network/search.jsp?searchmode=2&searchName=emu8086
41
http://www.esnips.com/doc/72832fb6-3e0f-485a-a403-720c02e34c06/program
42
http://agfi.staff.ugm.ac.id/pdf/daftar_isi_asm.pdf
43
http://agfi.staff.ugm.ac.id/pdf/sampel_asm03.pdf
Buku ini juga dilengkapi dengan CDROM yang isinya perangkat lunak MOBOTSIM v1.0 edisi
evaluasi serta berbagai macam informasi yang berkaitan dengan robotika terutama mobot atau
Mobile Robot serta bonus-bonus lainnya khusus untuk para pembaca.
Anda bisa mendownload daftar isi44 dan/atau contoh bab45 yang ada di buku ini… monggo…
http://www.gavamedia.net/products-page/microcontroller-robotika-dan-plc/pengendalian-mobile-
robot-mobot-dengan-mobotsim-v1-0/
44
http://www.esnips.com/doc/cec2661a-0c49-4e83-8bb5-f1840871a0a5/isi_mobot
45
http://www.esnips.com/doc/ebb66bc3-823e-4606-b124-3b4157b63185/mobot02
Buku ini COCOK untuk Anda maupun HADIAH dari untuk keluarga maupun sahabat-
sahabat dekat Anda
Buku ini mengungkap renungan-renungan perjalanan hidup seorang dosen Elektronika &
Instrumentasi (ELINS), AGFIANTO EKO PUTRA, yang banyak di-share kepada kolega maupun
mahasiswa2-nya, sehingga banyak di antara mereka mulai memandang kehidupan ini menjadi lebih
optimis dan bersemangat, serta memiliki tujuan-tujuan yang mulia, Insya Allah Anda-pun juga bisa
mengalaminya...
Waduh, emang sip banget penjelasannya pak Agfi, salah satu yang saya kagumi dari pak Agfi
adalah kalo pak Agfi njelasin sesuatu pasti dengan ringkas, padat, berisi, to the point dan
mudah di mengerti.. saya juga senang baca buku-bukunya pak Agfi lho, nah.. itu adalah tanda-
tanda dari dosen, entrepreneur dan sekaligus penulis yang profesional..| salut dah buat pak
Agfi.. Seandainya sebagian besar dosen bisa aktif seperti pak Agfi, pasti Indonesia makin maju
neh..
Herlambang (http://indomicron.co.cc/)
Pak Agfi, salut buat jiwa “technopreneur” yang kuat dan inovatif. Saya bisa lihat di tulisan -
tulisan Bapak. Btw, saya sendiri juga sedang belajar untuk mengembangkan bidang otomasi,
esp. PLC dan SCADA
Handy (http://learnautomation.wordpress.com/)