Diktat Mikro PDF
Diktat Mikro PDF
awesome technology
CODE VISION AVR
WORKSPACE
Untuk memudahkan dalam pembuatan kode, ada beberapa window yang bisa
membantu kita seperti terlihat dibawah ini.
Code Navigator berisi nama project, file, header yang digunakan dan
list error dan warning yang terjadi jika source code dicompile.
Code Information berisi library yang digunakan,variabel definisi,Typedefs,
global dan static variable serta fungsi yang sudah dideklarasikan.
Clipboard history menampilkan riwayat copy kita, ini sangat berguna
untuk menyalin register atau intruksi yang ada pada Code Wizard AVR.
Message berisi list dan tipe error dan warning jika source code telah
dicompile.
awesome technology
MEMBUAT PROJECT BARU
Untuk memulai membuat program pertama harus membuat project dahulu contoh
kali ini adalah kita membuat tulisan yang tampil pada LCD.langkahnya sebagai
berikut.
awesome technology
4. Isi Keterangan pada kolom chip seperti dibawah
awesome technology
6. Kemudian pilih File -> Generate, Save and Exit
Klik save kemudian beri nama yang sama untuk kedua langkah
save selanjutnya.
awesome technology
9. Kode untuk menampilkan tulisan pada LCD bisa ditulis seperti ini
Kode ini ditulis didalam looping while(1) dibawah komentar //place your
code here
10. Setelah itu pilih project -> build all atau bisa dengan mengklik icon
11. Setelah di bulid all maka akan muncul keterangan seperti berikut
Tertulis No error maka kode yang ditulis sudah benar dan dapat
dijalankan.
awesome technology
12. Setelah ini lihat pada folder berikut.
awesome technology
Mendownload Program dengan PROGISP
1. Buka program progisp, lihat tanda pada Progisp bila berwarna silver maka
downloader belum terhubung kemudian slect chip yang digunakan
9
4. Cari file hex. Yang ingin di tanamkan ke mikro
10
1. Bahasa C
Berikut ini penjelasan bahasa C dan aturan penulisan program dalam Bahasa C.
Untuk seterusnya, pada buku ini akan dibahas pemrograman mikrokontroler
AVR menggunakan bahasa C saja. Berikut ini penjelasan tentang bahasa C.
//variabel glodal
/*
unsigned int i,j;
…komentar untuk beberapa
baris
void main(void) ..*/
{
//variable local Atau jika untuk satu baris saja
Char data_rx; // …komentar…
DDRA=0x00;
PORTA=0xFF;
DDRB=0xFF; Inisialisasi
PORTB=0x00;
……
……
While(1)
{
……
…… Program Utama
…… Program akan berulang terus karena syarat while (1)
}; Akan selalu menghasilkan nilai benar (true)
Penjelasan:
Preprocessor (#) : Digunakan untuk memasukan (include) text dari file lain,
mendefinisikan macro yang dapat mengurangi beban kerja pemrograman dan
meningkatkan legibility source code (mudah dibaca).
11
#define : digunakan untuk mendefinisikan macro
Contoh: #define ALFA 0xff
#define SUM(a,b) a+b
#define sensor PINA.2
#define pompa PORTB.0
Komentar
Penulisan komentar untuk beberapa baris komentar sekaligus
/*
…komentar
..*/
1.1 Identifiers
Identifier adalah nama yang diberikan pada variable, fungsi, label atau objek
lain. Identifier dapat mengandung huruf (A …Z, a…z) dan angka (0 … 9) dan
karakter ( … ). Identifiers bersifat case sensitive. Identifier dapat mencapai
maksimal 32 karakter.
1.2 Konstanta
Konstanta Integer dan long integer ditulis dalam bentuk decimal (1234), dalam
bentuk biner (0b101001), hexadecimal mempunyai awalan 0x (0xff), atau
dalam octal dengan awalan 0 (0777).
unsigned integer mempunyai akhiran U (10000U)
long integer mempunyai akhiran U (99L)
unsigned long integer mempunyai akhiran UL (99UL)
floating point mempunyai akhiran F (1.234F)
konstanta karakter harus di lingkungi oleh tanda kutip (‘a’)
12
Unsigned int 16 0 to 65535
Signed int 16 -32768 to 326767
Long int 32 -2147483648 to 2147483647
Unsigned long int 32 0 to 4294967295
Signed long unit 32 -2147483648 to 2147483647
Float 32 ±1.175e-38 to ±3.402e38
Double 32 ±1.175e-38 to ±3.402e38
1.4 Operator
Tabel 1.2 Daftar Operator Kondisi
Operator Kondisi Keterangan
< Lebih kecil
<= Lebih kecil atau sama dengan
> Lebih besar
>= Lebih besar atau sama dengan
== Sama dengan
!= Tidak sama dengan
13
Tabel 1.6 Daftar Operator Assignment
Operator Assignment Keterangan
= Untuk memasukan nilai
+= Untuk menambah nilai dari keadaan semula
-= Untuk mengurangi nilai dari keadaan semula
*= Untuk mengalikan nilai dari keadaan semula
/= Untuk melakukan pembagian terhadap
bilangan semula
%= Untuk memasukan nilai sisa bagi dari
pembagian bilangan semula
<<= Untuk memasukan shift left
>>= Untuk memasukan shift right
&= Untuk memasukan bitwise AND
^= Untuk memasukan bitwise XOR
\= Untuk memasukan bitwise OR
if(<expression>) <statement>;
Sintaks perintah if … else .. dapat dituliskan sebagai berikut:
if(<expression>) <statement>;
else <statement2>;
Jika hasil testing expression memberikan hasil tidak nol statement1 akan
dilaksanakan. Pada keadaan sebaliknya statement2 yang akan dilaksanakan.
Sebaiknya pemanfataan perintah if untuk beberapa kondisi dilakukan dengan
menggunakan blok-blok.
Percabangan switch
Perintah percabangan if … else … dapat digantikan dengan perintah switch.
Dalam pernyataan switch, sebuah variable secara berurutan diuji oleh beberapa
konstanta bilangan bulat atau konstanta karakter. Sintaks perintah switch dapat
ditulis sebagai berikut:
Switch(variable)
{
case konstanta_1: statement;
14
break;
case konstanta_2: statement;
break;
case konstanta_n: statement;
break;
default: statement;
}
For
Untuk pengulangan yang melakukan proses increment
While
Perintah while dapat melakukan looping apabila persyaratannya benar. Sintaks
perintah while dapat dituliskan sebagai berikut:
15
nama_variable = nilai_awal;
while (syarat_loop)
{
Statement_yang_akan_diulang;
nama_variable++;
}
do …while
Pemerintah while terlebih dahulu melakukan pengujian persyaratan sebelum
melakukan looping. Kadang-kadang hal ini menimbulkan kerepotan-kerepotan
yang tidak perlu, misalnya inisialisasi variable control. Salah satu solusi adalah
dengan menggunakan loop do …while.
nama_variable = nilai_awal;
do
{
statement_yang_akan_diulang;
nama_variable + +;
}
while(syarat_loop)
1.6 Array
Array adalah deretan variable yang berjenis sama dan mempunyai nama
yang sama.. setiap anggota deretan (elemen) diberi nomor yang disebut indeks,
dimulai dari indeks nol. Array diatur agar mempunyai lokasi memori yang
bersebelahan dengan alamat terkecil menunjuk elemen array pertama dan alamat
terbesar menunjukkan indeksnya. Bentuk deklarasi array adalah:
Tipe nama_array[ukuran]
int nilai[100];
nilai[1]=10;
nilai[2]=3;
1.7 Fungsi
Sebuah program yang besar dapar dipecah menjadi beberapa subprogram
yang terpisah yang melakukan fungsi tertentu. Subprogram yang seperti itu
disebut fungsi, sebagai contoh, sebuah program yang melakukan proses pengisian
data berulang kali dapat dilengkapi dengan sebuah fungsi yang bertugas untuk
melakukan proses pengisian data. Apabila program hendak melakukan proses
pengisian data, program dapat melakukan pemanggilan fungsi tersebut.
Fungsi adalah sebuah blok yang melingkupi beberapa perintah. Deklarasi fungsi
dapat dilakukan dengan cara:
16
Tipe nama_fungsi(argumen)
Parameter dalam fungsi dijelaskan sebagai berikut:
Tipe adalah nilai yang dihasilkan oleh fungsi, jika tidak dinyatakan, hasil
fungsi dianggap bertipe integer. Deklarasi tipe void dapat
dimanfaatkan untuk menghindari terjadinya nilai balik.
Argumen adalah deklarasi variable apa saja yang dibutuhkan fungsi dan bersifat
optional.
Pernyataan Return
Pernyataan return dapat menyatakan dua hal:
1. Return mengakhiri jalannya fungsi dan kembali ke program utama.
2. Mengirim nilai balik.
Fungsi dapat ditulis pada akhir program dengan membuat sebuah prototype
function di bagian awal program. Cara menulis fungsi yang seperti itu
memberikan kemudahan kepada programmer untuk memeriksa dan membaca
17
ulang sebuah program yang besar.
Contoh:
//mendeklarasikan fungsi
long func(int param_1,int param_2);
18
2. LED
LED (Light Emitting Diode) adalah salah satu jenis diode yang dapat
memancarkan cahaya ketika dialiri oleh arus listrik. Pada penggunaanyya, LED
biasanya digunakan sebagai indikator suatu peralatan. Kaki LED ada dua, yakni
kaki katoda (-) dan kaki anoda (+).
Jika LED disambungkan ke kaki mikrokontroller, maka dibutuhkan
resistor untuk membatasi arus yang masuk ke LED agar LED tidak putus. Besar
resistornya berkisar antara 300-200 ohm.
Pada mikrokontroller ATMEGA16 terdapat 32 port yang bisa berfungsi
sebagai GPIO (General Purpose Input Output). Fitur ini sangat berguna untuk
mengggunakan push button sebagai interface atau menggunakan indikator seperti
LED. Register yang mengatur hal ini adalah DDR (Data Direction Register).
Untuk menjadikan Port tersebut sebagai input, bisa kita isi register itu dengan nilai
0. Sedangkan untuk output diisi nilai 1.
Contoh:
DDRA.0=0; //set PORTA ke-0 sebagai input
DDRB.1=1; //set PORTB ke-1 sebagai output
Setelah mengatur fungsi dari tiap PORT sekarang kita bisa mengatur
keadaan tiap PORT.Keadaan tiap PORT berbeda antara input dan output.
Jika kita mengatur DDR sebagai input maka kita bisa memilih 2 keaadaan
antara tri-state dan pull-up.Keadaan tersebut bisa diatur melalui register PORT
jika diisi 0 maka masuk kategori tri state dan jika 1 maka masuk kategori pull-
up.untuk penggunaan push button diperlukan keadaan pull-up.contoh penulisan:
DDRA=0; //set semua PORTA sebagai input
PORTA.0=0;//set PORTA ke-0 dengan keadaan tri-state
PORTA.1=1;//set PORTA ke-1 dengan keadaan pull-up
Setelah itu untuk membaca keadaan logika yang terjadi pada PORT
Mikrokontroller dapat menggunakan register PIN. Isi register ini berubah-ubah
sesuai dengan masukan logika yang ada pada kaki mikrokontroller.
Jika kita mengatur DDR sebagai output maka kita bisa memilih 2
keaadaan antara keluaran low(logika 0/false) dan keluaran high(logika
1/true).Keadaan tersebut bisa diatur melalui register PORT jika diisi 0 maka
masuk kategori low state dan jika 1 maka masuk kategori high.Pengaturan ini
cocok untuk mengatur H-Bridge motor DC,pengaturan indikator LED dll.contoh
penulisan:
DDRB=0xff; //set semua PORTB sebagai output
PORTB.0=0;//set PORTA ke-0 dengan keadaan low
PORTB.1=1;//set PORTA ke-1 dengan keadaan high
19
Pada board mikrokontroller, LED disambungkan pada PORTB, semua
kaki katoda (-) disambungkan ke ground, sehingga LED aktif high. Sehingga,
setting program LED pada codewizard adalah sebagai berikut
Gambar diatas adalah source code untuk menyalakan semua LED pada
PORTB. Untuk mematikan, tinggal ganti angka ‘1’ dengan angka ‘0’. Sebenarnya
20
ada beragam cara untuk memahami pemrograman mikrokontroller menggunakan
Bahasa C. Permasalahan yang sering muncul bagi pemula adalah “dari mana
dulu??”. Nah lo..dari mana?,, apa dulu yang dikerjakan?,,nulis apa dulu?,,oke..gak
usah bingung. Mari kita bahas satu per satu.
Membuat program/source code pada dasarnya adalah untuk memecahkan
masalah. Jadi, bagi orang-orang yang gak mau ketemu banyak masalah ya mau
nggak mau harus mau mengatasi masalah-masalah. Weleh-weleh,, bahasanya
tingkat tinggi gan,. Nah, ukuran berhasilnya suatu program itu diukur dari
permasalahan yang ada terpecahkan atau tidak. Urusan panjang pendeknya
program dan bentuk program tidak dipermasalahkan. Yang penting adalah
program tersebut dapat menyelesaikan masalah yang ada.
Untuk latihan selanjutnya, coba buat latihan led-led lain ya..udah gede kok
21
Praktik 2 Blinking LED
Hal yang paling penting ketika membuat program mikrokontroller yaitu
adalah mengetahui skematik. Kearah mana Led-Led itu nyambung. Jika kita tidak
tahu skematik ya dada wassalam. Gak bisa apa-apa. Coba lihat gambar diatas,
hayoo,..LED nyambung di port apa..? Yup.. benar, di Port B. Setelah itu ayo kita
pahami rangkainnya.
Dari skematik diatas dapat kita ketahui bahwa 8 buah LED terhubung di
PORTB.0 sampai PORTB.7. Led akan menyala jika output PORT berlogika ‘1’.
Oke,, hardware dah tahu..terus..??
Langkah selanjutnya adalah kita membuat/ membayangkan/ memikirkan/
melamunkan / logika berfikir bagaimana 8 led tersebut agar tampak nyala
bergantian. Nah, logikanya dapat begini..
*Alur = Pertama, nyalakan semua led yang terhubung pada portB.
Kemudian tunda selama beberapa saat. Setelah itu, matikan seluruh led dan tunda
selama beberapa saat. Nah, nyala – tunda – mati – tunda ini diulang-ulang terus
menerus atau istilahnya looping terus.
Setelah tahu skematik dan logika, yuk lanjut coding..
22
*Alur = Nyalakan led pada PORTB.0, yang lain matikan Tunda selama 1 detik
Nyalakan led pada PORTB.1, yang lain matikan Tunda selama 1 detik
Dan seterusnya…
Wah, kok panjang bangett,, tenang tenang, kita coba dengan array
23
Masih kurang pendekkk,,,nyooh..
Nah, kalau geser ke kiri ? ya tinggal ubah aja arahnya sama nyala awalnya..
24
Mudah kan,, hehe. Nah, kalau pengen lebih cepet tinggal ganti delaynya dengan
angka yang lebih kecil.
25
3. Push Button
Push button jarene Wikipedia adalah perangkat / saklar sederhana yang
berfungsi untuk menghubungkan atau memutuskan aliran arus listrik dengan
sistem kerja tekan. System kerja disini berarti saklar akan bekerja sebagai device
penghubung atau pemutus aliran arus listrik saat tombol ditekan, saat tombol tidak
ditekan akan kembali pada kondisi normal.
26
Lah, lha kok kalau tombolnya dilepas lednya ikut-ikutan padam,,..? oke ganti
source code lagi
27
4. Buzzer
Buzzer adalah sebuah kompone elektronika yang berfungsi untuk
mengubah getaran listrik menjadi getaran suara. Berbeda dengan speaker yang
dapat memainkan beragam nada-nada, buzzer hanya bersuara “tiiiit” ketika dialiri
arus listrik. Pada modul ini, buzzer yang digunakan adalah buzzer 5v yang
disambungkan pada PORTA.5. Buzzer akan menyala jika diberi logika 1 (5v).
PORTA.5 DIGANTI
PORTA.0
28
5. SEVEN SEGMENT
Seven segment adalah salah satu perangkat output yang berguna untuk
menampilkan angka decimal. Seven segment biasanya digunakan pada jam-jam
digital, meteran elektronik serta perangkat-perangkat lain yang menampilkan
angka numeric. Ada 2 jenis seven segment, yakni Common Anoda dan Common
Cathoda. Namun, seven segment yang digunakan pada modul ini adalah Common
Anoda (Kaki + dijadikan satu).
Jadi, untuk menghidupkan setiap segment pada seven segment butuh logika low
(active low). Jangan lupa pasang jumper “7 seg” pada modul kalau ingin
menggunakan seven segment.
29
Praktik 1 Menampilkan Angka
Untuk menampilkan sebuah angka, maka kita harus tahu pemetaan seven
segment mana yang harus menyala dan harus mati. Contoh, untuk menampilkan
angka “0”.
Maka, segment yang harus menyala adalah segment A,B,C,D,E,F. Nah, pada
common anoda untuk menyalakan segment cukup memberikan logika ‘0’ (low)
dan logika ‘1’ (high) untuk padam. Sehingga untuk membuat angka 0 codingnya
adalah seperti ini.
…
…
begitu pula dengan angka2 yang lain.
30
…
…
Program pada while (1) diatas masih menggunakan sistem bilangan biner pada
penempatan PORT. Jika menggunakan hexadecimal maka source code pada
while(1) adalah
…
31
Praktik 3 Counter Up sampai 9 menggunakan Array
Biar codingan kita jadi sedikit, maka kita menggunakan array. Array
adalah suatu variable yang mempresentasikan daftar (list) atau kumpulan data
yang mempunyai tipe data sama. Dengan array, kita bisa mengatur nyala seven
segment sesuka hati kita, hanya dengan mengubah nilai di array itu, tanpa
mengubah kode utamanya. Jangan lupa panggil header delay.h.
32
Array diatas mempunyai nama “nyala” dengan jumlah indeks 10 (0 sampai 9)
dengan tipe data unsigned char.
Source code diatas menggunakan dua fungsi, yakni fungsi #define dan !.
Maksud dari define adalah mendefinisikan sesuatu dengan sesuatu. Maksudnya,
kata-kata yang susah didefinisikan dengan kata-kata yang mudah-mudah saja,
misal PIND.0 kan susah dihafal, mending diganti jadi “satu”.
Sedangkan fungsi ! digunakan untuk mengganti nilai nol (0). Jadi misal
ada coding
33
if(!nol) itu artinya if (nol==0),
if(!satu) itu artinya if (satu==0),
dan seterusnya.
sebenarnya masih bisa dipecah lagi seperti ini
jika (PIND.0==0), maka seven segment menampilkan angka “0”
jika (PIND.1==0), maka seven segment menampilkan angka “1”
Nah, “0” itu artinya nyambung ke ground, lihat lagi skematik push button. Ini nih
logikanya.
*Alur = jika PIND.0 tersambung ke ground, maka seven segmen
membentuk angka nol. Jika PIND.1 tersambung ke ground, maka seven segment
membentuk angka 1, dan seterusnya.
6. LCD
LCD paling sering dipakai untuk piranti display pada aplikasi
mikrokontroller. Semua karakter dapat kita tampilkan ke LCD. LCD yang kita
pakai adalah lcd 16x2, maksudnya lcd mempunyai 16 kolom dan 2 baris.
Setelah kita Generate, Save and Exit. Fungsi-fungsi yang digunakan untuk
menulis di lcd bisa dilihat di help
34
Praktik 1 Menampilkan karakter di lcd
Untuk menampilkan kata di lcd, maka hal pertama yang harus ditulis
adalah posisi koordinat mana tulisan itu akan muncul. Nah, seperti yang kita
ketahui, lcd dibagi menjadi 2 koordinat, yakni koordinat x dan koordinat y
(dimulai dari koordinat 0,0). Misal kita ingin menampilkan tulisan seperti ini
Untuk selanjutnya tulisan pelatihan mikro bisa diganti dengan nama masing-masing
35
Praktik 2 LCD dengan switch … case …
Switch case biasanya digunakan untuk menuliskan state-state atau
membuat suatu menu-menu. I/O yang digunakan adalah pushbutton pada PIND
dan LCD pada PORT.C. Jangan lupa, PIND diset sebagai input dan pull-up.
*Alur = Jika PIND.0 ditekan, maka lcd menampilkan “PIND.0 ditekan”.
Jika PIND.1 ditekan, maka lcd menampilkan “PIND.1 ditekan”.
36
Praktik 3 Menu lcd menggunakan metode label
Label adalah salah satu cara untuk membuat menu-menu pada
mikrokontroller. Penulisannya cukup sederhana saja, hanya menggunakan menu
dan goto…,
*Alur = Jika PIND.2 ditekan, maka di lcd menampilkan “PIND.2 ditekan”
Jika PIND.3 ditekan, maka di lcd menampikan “PIND.3 ditekan”
Cukup simple kan..hehe. Berikut source codenya
37
Praktik 4 Animasi Running teks
Latihan ini adalah latihan menggunakan dan mengubah-ubah letak tulisan
pada LCD yang dikendalikan oleh fungsi lcd_gotoxy(x,y); Maka, apabila kita
ingin membuat animasi running teks, kita cukup memanfaatkan koordinat x
dengan cara menggeser menggunakan looping “for”, Fungsi delay berfungsi untuk
menunda kerja mikrokontroller agar kita dapat melihat dengan jelas pergerakan
teks.
Build all dan masukkan file hex ke dalam board, dan lihat apa yang terjadi
pada tulisan lcd.
38
7. RTC
RTC itu merupakan IC yang gunanya untuk menyimpan waktu dan
tanggal. RTC (Real Time Clock). RTC adalah jam elektronik berupa chip yang
dapat menghitung waktu dan menyimpan data secara real time. RTC dilengkapi
dengan batere sebagai penyedia daya pada IC. RTC sangat akurat sebagai
pewaktu (timer) karena menggunakan osilator kristal.
39
Praktik 1 Membuat Jam Digital
Untuk membuat jam digital, terlebih dahulu kita setting LCD pada PORTC
dan RTC pada PORTD.6 dan 7. Jika sudah, tuliskan source code dibawah ini. Oh
iyaa, download programnya dua kali yaa,, yang tak lingkari nanti ditambah //
40
8. ADC
Analog to Digital Converter (ADC) adalah pengubah atau pengkonversi
sinyal dari sinyal Analog ke Digital, yang jadi pertanyaan adalah kenapa sinyal
analog tersebut harus di ubah ke sinyal digital? Yaitu agar sinyal analog tersebut
bisa dibaca sebagai data dan kalo sudah dalam bentuk data maka kita dapat dengan
mudah mengolah data tersebut didalam perangkat digital.Perhitungan ADC
rumusnya
41
Untuk mengetahui nilai ADC dari PORT.A tertentu dapat dilakukan
dengan memangggil fungsi read_adc();
Jika kita menginginkan data tegangan analig dari data digital yang kita
dapatkan bisa menggunakan rumus
Praktik 1 Potensiometer
Potensiometer adalah salah satu jenis resistor variable, maksudnya adalah
nilai resistansi dari potensiometer dapat diubah-ubah. Ada banyak macam
potensiometer, ada potensiometer geser, ada potensiometer linear, ada yang
logaritmik. Nah, potensiometer yang kita gunakan adalah potensiometer putar
logaritmik yang besarnya 10k ohm.
42
5
43
Dari datasheet kita dapat ketahui bagaimana cara menggunakan lm35 dan
karakteristik teganganya. Terlihat bahwa ketika suhu naik 1 derajat celcius, maka
tegangan output akan bertambah sebesar 10mV. Oke,, lanjut silahkan buka
codewizard, pilih adc yang 10 bit dan LCD terus generate save and exit, terus lihat
penjelasan rumusnya di datasheet.
Untuk mendapatkan suhu dalam derajat celcius, maak harus kita bagi dengan
factor skala 0.01. Dengan tegangan referensi 5v dan resolusi 10 bit atau 1023,
maka rumusnya menjadi
44
6 //adc=read_adc(6)
untuk ADC LDR caranya sama dengan ADC POTENSIO, Hanya Saja PIN yang digunakan
adalah PINA.7.
45