Bab ini akan membahas pemrograman dasar mikrokontroler AVR dalam bahasa C. Belajar
mikrokontroler apapun lebih bagus jika dimulai dengan bahasa assembly karena akan lebih mudah
memahami sifat dan cara penggunaan register dasar dari sebuah mikrokontroler. Hal ini dikarenakan
mikrokontroler / mikroprosesor hanya mengenal bahasa mesin (yang biasanya dalam format HEX
atau BIN) saja, yang mana bahasa mesin tersebut adalah hasil proses assembling dari bahasa assembly
(yang biasanya dalam format ASM).
Untuk pembuatan program dalam skala besar (misalnya program mikrokontroler untuk
control unit sebuah DVD player, dsb) pemrogram akan mengalami kesulitan jika menggunakan
bahasa pemrograman tingkat rendah seperti bahasa assembly AVR. Karena itu kemudian
dikembangkan sebuah Kompiler yang dapat menerjemahkan bahasa pemrograman tingkat tinggi
(misalnya bahasa C, Pascal, dsb) ke bahasa assembly-nya AVR, sehingga pemrogram dapat membuat
perangkat lunak untuk mikrokontroler AVR menggunakan bahasa tingkat tinggi.
Salah satu compiler terkenal dan mudah digunakan untuk menerjemahkan bahasa C ke bahasa
assembly AVR adalah Code Vision AVR. Dalam mempelajari bahasa C untuk AVR, untuk tiap sub-
babnya sebelumnya akan dibahas terlebih dahulu bahasa C secara umum (maksudnya bahasa C
standar yang untuk PC). Bahasa C cukup universal tidak seperti bahasa assembly, sehingga untuk
mempelajari tipe membahas mikrokontroler keluarga yag lain, bahasa C yang digunakan tidak jauh
berbeda cara penulisan dan pemakaiannya, sehingga pembaca tidak akan mengalami kesulitan yang
berarti.
main( )
{
statemen-statemen;
}
fungsi_fungsi_Lain( )
{
statemen-statemen;
}
Program di atas adalah program bahasa C untuk komputer (PC). Berikut adalah contoh
program bahasa C sederhana untuk mikrokontroler AVR (dengan Code Vision AVR) :
Kode Program Keterangan
#include <mega8535.h> //file pustaka
#include <stdio.h>
#include <reg51.h> //tempat mendeklarasikan variabel
global (jika ada)
//fungsi utama
void main(void)
{ //contoh variabel lokal simpan
char simpan; //statemen-statemen
PORTA=0xFF;
simpan=PORTC;
}
Jika program tersebut dikompilasi ke bentuk hex atau biner dan dimasukkan ke FLASH
PEROM AVR, mikrokontroler akan mengeluarkan nilai FFh (=11111111b) di port A, dan akan
mengambil nilai yang ada di port C serta menyimpannya di variabel simpan.
1.4. Tipe Data Dalam Bahasa C Untuk AVR
Di dalam bahasa pemrograman komputer, data yang digunakan umumnya dibedakan menjadi
data nilai numerik (bilangan) dan data nilai karakter (huruf dan kata). Nilai numerik dibedakan lagi
menjadi nilai numerik integer (bilangan bulat) dan nilai numerik pecahan. Nilai numerik pecahan
dapat dibedakan lagi menjadi nilai numerik pecahan ketepatan tunggal (32 bit) dan nilai numerik
pecahan ketepatan ganda (64 bit). Bahasa pemrograman komputer membedakan data ke dalam
beberapa tipe data ini untuk tujuan supaya operasi data menjadi efisien dan efektif.
Bahasa C menyediakan lima macam tipe data dasar, yaitu tipe data integer (nilai numerik
bulat yang dideklarasikan dengan int), floating point (nilai numerik pecahan ketepatan tunggal yang
dideklarasikan dengan float), double precision (nilai numerik pecahan ketepatan ganda yang
dideklarasikan dengan double), karakter (dideklarasikan dengan char) dan kosong (dideklarasikan
dengan void). Selanjutnya int, float, double, dan char dapat dikombinasikan dengan perintah
pengubah (modifier) signed, unsigned, long, dan short. Hasil dari kombinasi tipe data ini dapat dilihat
di tabel berikut :
4
Tabel 1. Tipe Data AVR
Beberapa tipe data akan dijelaskan dengan lebih detail sebagai berikut.
1.4.1. Tipe Data bit
Tipe data ini digunakan untuk mendeklarasikan variabel 1 bit.
Kode Program Keterangan
bit ftek_uksw; Variabel bernama ftek_uksw
ftek_uksw=1; bertipe data bit, variasi nilai hanya
delay_ms(100); 0 atau 1
ftek_uksw=0;
1.5. Variabel
Variabel adalah suatu pengenal yang digunakan untuk mewakili suatu nilai tertentu di dalam
proses program. Variabel juga didefinisikan sebagai suatu pemesanan tempat di memori RAM untuk
menyimpan suatu nilai tertentu. Misalnya ungkapan int x=3, x adalah nama variabel yang memesan
sebuah tempat di RAM sebesar 16 bit untuk menyimpan nilai bilangan bulat 3. Nilai variabel tersebut
dapat diubah-ubah sewaktu-waktu.
Semua variabel-variabel yang akan digunakan di program C harus dideklarasikan terlebih
dahulu, begitu juga untuk AVR. Bentuk umum dari mendeklarasikan variabel dapat ditulis sebagai
berikut ini :
tipe nama_nama_variabel;
Tipe adalah tipe data dari variabel yang dikehendaki. Nama_nama variabel adalah satu atau
lebih dari nama variabel yang dikehendaki dengan tipe tersebut. Setiap pendeklarasian variabel harus
6
diakhiri dengan ;. Berikut adalah beberapa contoh untuk mendeklarasikan variabel :
char simpan;
Berarti mendeklarasikan variabel yang bernama simpan, yang mana variabel tersebut
mempunyai tipe data char (=variabel tersebut akan dipakai untuk menyimpan data 8 bit).
Variabel ini otomatis akan disimpan di bagian RAM yang masih kosong.
int X,Y,Nilai;
Berarti mendeklarasikan variabel-variabel yang bernama X, Y, dan Nilai, yang mana
variabel-variabel tersebut mempunyai tipe data integer (variabel tersebut akan dipakai
untuk menyimpan bilangan bulat selebar maksimal 16 bit). Variabel ini otomatis akan
disimpan di bagian RAM yang masih kosong.
bit nilai_biner;
Berarti mendeklarasikan variabel yang bernama nilai_biner, yang mana variabel tersebut
mempunyai tipe data bit. Variabel ini otomatis akan disimpan di bagian bit addressable
yang masih kosong.
1.6. Operator
Penulisan program yang berisi instruksi-instruksi mengandung operator dan operand.
Operand adalah variabel atau konstanta yang merupakan bagian pernyataan sedangkan operator
adalah suatu simbol yang menyatakan suatu operasi akan dilakukan oleh operand tersebut. Contoh
dalam operasi matematika :
x = y + z;
Ada 3 buah operand dalam pernyataan diatas yaitu : x, y dan z dan dua buah operator yaitu = (sama
dengan) dan + (penjumlahan). Operator dalam bahasa C dibagi menjadi tiga kelompok yaitu :
1. Unary : operator yang beroperasi pada satu operand, misal : a
2. Binary : operator yang beroperasi pada dua operand, misal : a-b
3. Ternary : operator yang beroperasi pada tiga atau lebih operand, misal : (a-b)*c
Operator *, / dan % memiliki prioritas yang lebih tinggi bila dibanding operator + dan -.
7
1.6.2. Operator Pembanding
Operator pembanding adalah beberapa operator yang digunakan untuk membandingkan 2
buah data. Hasil operasinya bukan berupa nilai tetapi hanya nilai true (1) atau false (0).
Contoh :
a = 0x55;
b = 0x23;
a&b=?
a = 0x55 = 0 1 0 1 0 1 0 1
b = 0x20 = 0 0 1 0 0 0 1 1 &
a&b= 0x01 = 0 0 0 0 0 0 0 1
b<<1=?
Sebelum digeser:
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
0 0 1 0 0 0 1 1
8
1.7. Percabangan
Semua contoh program di atas berjalan secara berurutan, artinya proses satu statemen ke
statemen berikutnya dilakukan secara urut sesuai dengan urutannya. Akan tetapi untuk program yang
cukup komplek, proses yang ada tidak selalu berurutan, karena hampir setiap program yang komplek
mengandung suatu percabangan. Percabangan-percabangan dalam program tersebut antara lain terjadi
melalui penyeleksian kondisi (melalui syarat-syarat tertentu). Meskipun demikian ada pula
percabangan dalam program yang dilakukan tanpa adanya penyeleksian kondisi.
Untuk percabangan bersyarat (conditional branch), di dalam bahasa C dapat dipergunakan
statemen if.
1.7.1. Statemen If
Struktur If Bentuk dari struktur if adalah sebagai berikut :
if (ungkapan)
{
statemen1;
statemen2;
.. .. .. ..
}
contoh :
Kode Program Keterangan
#include <stdio.h> //file pustaka
main() //fungsi utama
{
int nilai; //variabel lokal
printf(Berapa nilai anda :);
scanf(%i,&nilai);
if(nilai>80)
{ //statemen if, menyeleksi jika isi dari
printf(Selamat Anda Lulus \n); variabel nilai lebih dari 60 maka
printf(Tapi jangan cepat-cepat nikah..Hehe..); lakukan pernyataan didalam tanda
} {}
}
10
Bentuk if di atas adalah bentuk if untuk bahasa C di PC, berikut adalah contoh bentuk if
untuk bahasa C di AVR:
for(Awal;Akhir;Peningkatan) statemen;
Awal adalah suatu ungkapan yang memberikan nilai awal suatu variabel untuk perulangannya
(misalnya x=0 atau i=1). Variabel dalam ungkapan tsb dijadikan penghitung untuk banyaknya
perulangan yang akan dilakukan.
Akhir adalah ungkapan yang memberikan nilai maksimal pada variabel yang harus dipenuhi
supaya perulangan masih dapat terus dilakukan (misalnya x<=20, berarti statemen yang diulang akan
terus dilakukan selama nilai x lebih kecil atau sama dengan 20. Contoh lain misalnya i<=10, berarti
statemen yang diulang akan terus dilakukan selama nilai i lebih kecil atau sama dengan 10).
Peningkatan adalah suatu ungkapan yang mengubah nilai variabel penghitung perulangan
setiap kali perulangan dilakukan (misalnya x++ menunjukkan nilai x bertambah satu setiap
perulangan dilakukan, atau misalnya i-- menunjukkan nilai i berkurang satu setiap perulangan
dilakukan).
Contoh :
Kode Program Keterangan
#include <stdio.h> //file pustaka
main() //fungsi utama
{
int x; //variabel lokal x bertipe integer
13
for(x=1;x<=5;x++) printf(Pemrograman Bahasa C \n); //untuk nilai awal x=1 diperiksa
} apakah <=5?, jika ya maka
tingkatkan nilai x=x+1, dan
cetak kalimat. Kemudian loop
ke statemen ini lagi periksa
apakah x<=5,jika belum maka
ulang cetak kalimat, jika sudah
hentikan.
Penjelasan :
Perulangan dari while akan terus dikerjakan bila kondisinya masih benar. Dalam hal ini
kondisinya adalah bila nilai x masih kurang dari 5, berarti kondisi di dalam while masih terpenuhi dan
perulangan akan selesai setelah nilai x lebih besar atau sama dengan 5. Tampak pada program di atas
bahwa perulangan dilakukan sebanyak 5 kali, karena sewaktu program dijalankan terjadi 5 kali kondisi
dimana nilai x masih kurang dari 5, yaitu sewaktu nilai x=0,x=1,x=2,x=3, dan x=4. Perulangan akan
berhenti otomatis sewaktu nilai x=5. Bentuk while di atas adalah bentuk while untuk bahasa C di PC,
berikut adalah contoh bentuk while untuk bahasa C di AVR:
Contoh 1:
Kode Program Keterangan
#include <stdio.h> //file pustaka
#include <mega8535.h>
void delay(void);
main( )
{
PORTB=0x00;
DDRB=0xFF;
Kode Program
#include <stdio.h>
#include <mega8535.h>
main()
{
bit tombol_1
bit tombol_2
PORTB=0x00;
DDRB=0x00;
PORTA=0x00;
DDRA=0xFF;
while(1)
{
tombol_1=PORTB.2
tombol_2=PORTB.4
if(tombol_1==1) PORTA.7=0;
if(tombol_2==1) PORTA.3=1;
}
}
Bentuk lain dari pernyataan while adalah do-while. Pernyataan ini mempunyai bentuk dasar
sebagai berikut :
16
do
{
Statemen-statemen;
............
}
while (ekspresi)
Program yang kita buat dikelompokkan menjadi sebuah project yang nantinya
diletakkan pada Project Workspace. berikut adalah tampilan GUI dari Code Vision.
Selanjutnya agar dapat membuat project baru kita memilih File-New, sehingga muncul
tampilan sebagai berikut
pilih project dan tekan OK selanjutnya akan muncul pilihan untuk menggunakan Code
Wizard atau tidak, nah disinilah letak ketangguhan Code Vision yang sebenarnya, pilih YES
18
pada bagian Chip pilihlah yang sesuai dengan IC yang anda gunakan, pastikan juga kecepatan
clocknya juga sesuai, jika sudah klik tab Ports sehingga muncul tampilan sebagai berikut
AVR dilengkapi dengan internal buffer, tab ports ini berguna untuk menentukan arah data,
apakah data masuk ke mikro atau keluar dari mikro, hal ini berbeda dengan MCS51 dimana
programmer dapat langsung saja menentukan kapan port berfungsi sebagai input dan kapan
sebagai output, pada AVR hal harus dilakukan dengan merubah nilai register DDR., setelah
menentukan konfigurasi port yang akan kita pakai selanjutnya kita dapat menentukan
konfigurasi yang lain semisal UART, SPI, ADC sampai LCD, kita coba mulai dulu dari
UART, jika kalian klik tab USART akan muncul pilihan sebagai berikut
19
dari contoh konfigurasi diatas saya memilih konfigurasi UART hanya dapat menerima data
saja 9600bps dengan format 810, serta interrupt Rx(mirip RI pada MCS51) juga ON, jadi data
tersebut saya proses di ISR, dengan panjang buffer 32 Byte, singkatnya dengan Code Vision
kalian tidak direpotkan dengan urusan inisialisasi sehingga cukup mudah bukan? Selanjutnya
kalian dapat juga mengaktifkan fitur ADC yang dimiliki oleh AVR klik saja tab ADC
sehingga muncul pilihan sebagai berikut.
pilih clock yang paling cepat, kecepatan clock disini tergantung konfigurasi kristal yang
kalian masukan pada tab Chip. Mungkin diantara semua fitur fitur AVR fitur ini dan fitur SPI
lah yang paling menarik, selanjutnya jika kita masih kurang fitur kalian dapat mencoba fitur
SPI hardware, SPI ini digunakan untuk berkomunikasi dengan IC lain yang mensupport SPI
semisal SEEPROM, RTC, LCD dsb. Dengan SPI hardware programmer tidak direpotkan
untuk membuat protocol SPI sendiri, selain itu karena fitur ini diintegrasikan secara hardware
menjadikan MCU menjadi tidak terbebani pada saat proses pengiriman data maupun
penerimaan data via SPI.
20
mode pengiriman data dapat kalian tentukan sendiri, tergantung dari IC apa yang akan kalian
ajak berkomunikasi via SPI, dalam contoh diatas saya mengkonfigurasi SPI hardware dengan
AVR sebagai Master Device, Mode 0(baca keterangan di datasheet AVR), dengan frekuensi
SCK sekitar 5Mhz. ketika semua konfigurasi dirasa sudah mencukupi pilihlah File-[Generate,
Save and Exit].
anda akan dihadapkan pada pilihan untuk men-save project file, code file pilihlah semuanya
di-direktori yang sama agar memudahkan jika kita ingin mengedit atau memindah project.
Selanjutnya pada IDE akan muncul Editor sebagai berikut, isi teks pada editor
merupakan hasil code generate dari code wizard. Coba kalian cari dimana void main pada
sourcecode kalian, didalam void main kalian akan menemukan inisialisasi dari code wizard
yang sudah kalian konfigurasi sebelumnya, jangan ubah apapun pada bagian inisialisasi
tersebut jika kalian sudah yakin akan kemampuan code wizard. Nantinya di sinilah kalian
mengetikkan program kalian.
Berhenti dan ketiklah didalam main program anda
21
variable bmp adalah array hasil konversi dari file bmp, kalian dapat menggenerate array ini
dari program bmp2array, nanti akan saya bagikan pada saat praktikum. Pastikan juga library
pcf8833.h dan pcf8833.lib(nanti dikasi pada waktu praktikum) sudah terletak pada direktori
workspace.
pilih Setting-Programmer
contreng Program the Chip, jangan mengubah settingan yang lain kalo tidak ingin kenapa-
napa tekan OK(buat yang pake resolusi 1024x768 kebawah geser window ke atas sampai
tombol OK kelihatan). Lalu tekan SHIFT+F9 sehingga muncul windows sebagai berikut.
23
pilih Program the chip untuk memulai memprogram AVR, pastikan kabel ISP sudah
menancap pada tempatnya.