Anda di halaman 1dari 97

www.anakkendali.

com
1

WWW.ANAKKENDALI.COM 1
www.anakkendali.com
2

Daftar Isi
Daftar Isi...................................................................................................................................................... 2
Ucapan Terimakasih ................................................................................................................................. 4
Jutsu 1 ......................................................................................................................................................... 5
Siap kenal ? ................................................................................................................................................ 5
Apa itu mikrokontroller ? ...................................................................................................................... 5
Jutsu 2 ......................................................................................................................................................... 6
Yuk belajar pemograman !....................................................................................................................... 6
I. Apa itu pemograman komputer ?............................................................................................... 6
II. Bagaimana Bahasa C itu ?........................................................................................................... 7
Jutsu 3 ....................................................................................................................................................... 15
Saatnya kita mencoba!........................................................................................................................... 15
a. Codevisson AVR dan KHAZAMA ............................................................................................. 15
b. Code Wizard CVAVR .................................................................................................................. 18
c. Setting Fuse bit ........................................................................................................................... 19
d. Schematic dan Design Board ....................................................................................................... 21
Jutsu 4 ....................................................................................................................................................... 22
I/O digital!.................................................................................................................................................. 22
A. Program LED Blink ........................................................................................................................ 26
B. Program Runing LED ..................................................................................................................... 29
C. Mengakses Push Button dan LED .................................................................................................. 32
D. Mengakses Seven Segmen .............................................................................................................. 36
E. Mengakses LCD 16x2..................................................................................................................... 39
F. Mengakses Keypad 4x4 .................................................................................................................. 43
Jutsu 5 ....................................................................................................................................................... 51
ADC ............................................................................................................................................................ 51
A. Percobaan dengan Potentiometer .................................................................................................... 52
B. Mengakses Sensor LM35 ................................................................................................................ 55
Jutsu 6 ....................................................................................................................................................... 60
Timer dan Counter .................................................................................................................................. 60
1. Blink dengan Timer (tanpa delay) .................................................................................................. 60
2. Membuat Stopwatch Sederhana ...................................................................................................... 64

WWW.ANAKKENDALI.COM 2
www.anakkendali.com
3

3. Mengakses Motor DC ..................................................................................................................... 70


Jutsu 7 ....................................................................................................................................................... 74
USART....................................................................................................................................................... 74
1. Mengirim data Dari Android ke Mikrokontroller dengan BT HC-05 ............................................. 74
2. Menyalakan LED dengan Android BT HC-05 ............................................................................... 78
Jutsu 8 ....................................................................................................................................................... 83
Bonus Project Sederhana ...................................................................................................................... 83
1. Mengakses Sensor DHT 11............................................................................................................. 83
2. Mengakses Servo dan Pushbutton................................................................................................... 87
3. Membuat Jam Digital Sederhana .................................................................................................... 91
Jutsu 9 ....................................................................................................................................................... 96
Referensi .................................................................................................................................................. 96
Tentang Penulis ....................................................................................................................................... 97

WWW.ANAKKENDALI.COM 3
www.anakkendali.com
4

Ucapan Terimakasih
Alhamdulillahirobbil‘alamin, saya bersyukur kepada Allah SWT yang sampai saat
ini masih diberi kesempatan hidup, nikmat dan hidayahnya sehingga saya masih
dapat menulis E-book latihan Mikrokontroller AVR.
kemudian saya ucapkan banyak terimakasih kepada kedua orang tua, keluarga, dan
Pesantren Al-Ishlah Tajug Indramayu, karena berkat do'a dan dukungan merekalah
saya benar-benar bisa menyelesaikan E-book ini.
Tidak lupa juga untuk teman saya Salsabila Maulidah yang selama ini meluangkan
waktunya untuk mengoreksi pembuatan Ebook Latihan Mikrokontroller AVR
sehingga Ebook ini dapat di selesaikan dengan semestinya. Dan masih banyak lagi
orang orang yang berpengaruh dalam pembuatan Ebook ini dan tidak bisa saya
sebutkan Namanya satu per satu.
Semoga buku ini bisa bermanfaat dan terus mengalirkan manfaat bagi para
pembacanya.
Rasulullah SAW bersabda yang artinya :
“Barang Siapa yang Pelit Akan Ilmu Niscaya Ia akan di-Belenggu Api Neraka”
Untuk itu sekiranya kita selalu berbagi dan terus berbagi, bahkan bukan hanya ilmu
saja, melainkan apa yang kita punya jika bisa dibagikan maka berbagilah kepada
yang lain.

WWW.ANAKKENDALI.COM 4
www.anakkendali.com
5

Jutsu 1
Siap kenal ?
Ketika kita menyukai lawan jenis hal yang harus pertama kita lakukan tentu saja
mencoba untuk mengenali terlebih dahulu, tidak mungkin kita bisa mendapatkan
hatinya tanpa kenal dulu orangnya ?, begitu juga dengan apa yang akan kita pelajari
pada E-Book keren ini, hal yang harus pertama kita lakukan adalah mengenal
tentang MIKORKONTROLLER.
Apa itu mikrokontroller ?
Zaman dimana teknologi sangat canggih saat ini mikrokontroller sangat sering kita
temui dalam kehidupan sehari – hari meskipun banyak dari kita tidak menyadari atau
bahkan tidak mengetahui sama sekali tentang mikrokontroller.
Banyak alat yang berada disekitar kita dengan sistem kerjanya menggunakan alat
yang bernama mikrokontroller misalnya : Televisi, Laptop, AC, Handphone dan lain
sebagainya, jadi bisa dikatakan mikrokontroller adalah sebuah pengendali yang
dapat mengatur bagian anggotanya seperti pada otak manusia yang mengendalikan
secara penuh anggotanya seperti tangan, kaki, mulut dan sebagainya.
Mikrokontroller bisa di aplikasikan pada banyak bidang seperti robotika, otomasi
industri, akuisi data, dan lain – lain.
Keuntungan menggunkan mikrokontroller selain harganya murah juga mudah untuk
di pelajari, karena dengan menggunakan mikrokontroller rangkaian elektronika yang
begitu rumit bisa digantikan dengan hanya memprogramnya, bayangkan jika kita
membuat alat jam digital menggunakan komponen passive tanpa adanya
mikrokontroller. Maka kita akan benar – benar dalam masalah besar.
Mikrokontroller yang akan dibahas pada E-book Keren ini adalah salah satu jenis
Mikrokontroller AVR ( Advanced Versatile RISC atau Alf and Vegard’s Risc
processor ).
Dan untuk praktek pemograman , mikrokontroller yang akan kita gunakan adalah
Atmega16/32/8535. Dan saya tidak akan menuliskan tentang IC tersebut karena
sudah bisa dilihat lebih jelas pada datasheet masing – masing IC.

WWW.ANAKKENDALI.COM 5
www.anakkendali.com
6

Jutsu 2
Yuk belajar pemograman !
I. Apa itu pemograman komputer ?
Program merupakan intruksi yang diberikan kepada komputer untuk melakukan
suatu tindakan tertentu, komputer tanpa program tidak akan pernah bekerja
sedikitpun, semua kegiatan yang kita lakukan sehari – hari di depan laptop atau
handphone kita. Sebenarnya kita melakukan itu semua dengan memberi program
tertentu pada komputer atau handphone. Dari mulai update status di facebook sampai
video call bareng gebetan. Hanya saja karena sudah dibuat sedemikian rupa oleh
developer code/program sehingga kita tinggal melakukan hal-hal sederhana seperti
menekan tombol dan sebagainya.
Bahasa Pemograman dibagi menjadi dua level yaitu :
• Bahasa tingkat rendah (Low Level Language)
Contohnya : Bahasa mesin dan Bahasa assembly
Bahasa dengan tingkat rendah merupakan Bahasa yang hanya memiliki
sedikit kosa kata sehingga sangat susah dimengerti oleh manusia.

• Bahasa tingkat tinggi (High Level Language)


Contohnya : Bahasa C C++ Basic Pascal dan sebagainya.
Bahasa dengan tingkat tinggi sudah memiliki cukup banyak kosa kata, dan
hamper mendekati Bahasa manusia sehingga dapat dipahami dengan mudah
oleh manusia.

Mikrokontroller AVR dapat diprogram degan Bahasa tingkat tinggi maupun rendah,
kita dapat menggunakan AVR studio untuk memprogram dengan Bahasa tingkat
rendah assembly adapun untuk Bahasa tingkat tinggi, kita dapat menggunakan
CVAVR (CodeVission AVR) dengan bahasa C atau BASCOM AVR dengan Bahasa
Basic. Dan pada praktek pemograman di E-Book Keren ini kita menggunakan
CVAVR (CodeVission AVR).

WWW.ANAKKENDALI.COM 6
www.anakkendali.com
7

II. Bagaimana Bahasa C itu ?


Pemograman Bahasa C merupakan salah satu Bahasa tingkat tinggi, meskipun saya
sendiri mengelompokan Bahasa C ini adalah termasuk Bahasa tingkat menengah :v
Karena dibanding Bahasa lainya, Bahasa C lebih mendekati Bahasa Assembly.
Berikut adalah contoh program sederhana yang menggunakan Bahasa C pada
mikrokontroller AVR
Pada bagian #include adalah
#include <mega32.h> sebagai header program yang
#include <delay.h> mana code ini akan
memanggil file lain

#define Input PINB.1 // mengelamatkan Input pada PINB.1

// menempatkan variable disini ! // komentar untuk satu baris,

Unsigned int i; // variable i /*


Komentar dengan dibatasi
Void setup (void) */
{
PORTB = 0xFF; Untuk menginialisasi, dalam contoh
DDRB = 0x00; ini, kita menjadikan PORTB sebagai
PORTA = 0xFF; masukan dan PORTA sebagai keluaran
DDRA = 0xFF;

while(1)
{
if (Input == 0){
PORTA = 0x00; Program utama, dimana program
} akan di eksekusi atau dijalankan
else{ berulang ulang,
PORTB = 0xFF;
}
}
}

WWW.ANAKKENDALI.COM 7
www.anakkendali.com
8

a. Indentifier
Identifier merupakan sebuah nama yang diberikan pada variable, fungsi, atau
yang lainya, misalnya kita akan memberikan nama fungsi baca_sensor maka
kita bisa menuliskan pada prgramnya

Void baca_sensor ()

Dan identifier dapat mengandung angka, huruf dan karakter, dengan


maksimal penggunaan sampai 32 karakter.

b. Tipe Data

Berikut adalah table tipe data yang dilengkapi dengan ukuran bit dan daerah
nilai yang dapat ditampung pada tiap tipe data:

Ukuran
Tipe data Range
(Bit)
0,1 (tipe data bit pada Bahasa C adalah Boolean artinya
bit 1
dia hanya memiliki dua nilai yaitu true atau false
char 8 -128 sampai 127
unsigned char 8 0 sampai 255
signed char 8 -128 sampai 127
int 16 -32768 sampai 32767
short int 16 -32768 sampai 32767
unsigned int 16 0 sampai 65535
signed int 16 -32768 sampai 32767
long int 32 -2147483648 sampai 2147483647
unsigned long int 32 0 sampai 4294967295
signed long int 32 -2147483658 sampai 2147483657
float 32 ± 3.4e ± 38 (~7 digits)

double 32 ± 1.7e ± 308 (~15 digits)

WWW.ANAKKENDALI.COM 8
www.anakkendali.com
9

c. Operator
Operator pada pemograman sebenarnya sama saja dengan operator yang kita
pelajari pada ilmu matematika dan berikut adalah daftar table dari operator
pemograman

1. Operator Kondisi
Operator Kondisi Keterangan
< Lebih kecil dari ….
<= Lebih kecil atau sama dengan dari ….
> Lebih besar dari ….
>= Lebih besar atau sama dengan dari ….
== Sama dengan ….
!= Tidak sama dengan ….

2. Operator Aritmatika
Operator Aritmatika Keterangan
+ Penjumlahan
- Pengurangan
* Perkalian
/ Pembagian
% Sisa bagi (modulo)

3. Operator Logika
Operator Logika Keterangan
! Boolean NOT
&& Boolean AND
|| Boolean OR

4. Operator Bitwise
Operator Bitwise Keterangan
~ Komplement Bitwise
& Bitwise AND
| Bitwise OR
^ Bitwise Exclusive
>> Shift ke kanan
<< Shift ke kiri

WWW.ANAKKENDALI.COM 9
www.anakkendali.com
10

5. Operator Assigment
Operator Assigment Keterangan Contoh
= Untuk memasukan nilai A = 10
+= Menambahkan nilai dari nilai sebelumnya A += B  A=A+B
-= Mengurangi nilai dari nilai sebelumnya A-=B  A=A-B
*= Mengalikan nilai dari nilai sebelumnya A*=B  A=A*B

/= Membagi nilai dari nilai sebelumnya A/=B  A=A : B


%= Memasukan nilai sisa bagi pada nilai sebelumnya A%=B  A= A%B
<<= Memasukan shift kiri A<<=B  A=A<<B
>>= Memasukan shift kanan A>>=B  A=A>>B
&= Memasukan bitwise AND A&=B  A=A&B
^= Memasukan bitwise XOR A^=B  A=A^B
\= Memasukan bitwise OR A\=B  A=A\B

d. Kontrol Percabangan
Pada Bahasa pemograman terdapat perintah percabangan yang berfungsi
untuk melakukan suatu tindakan pada keadaan tertentu.
perintah percabangan pada pemograman juga sangat logis dan selaras dengan
kehidupan kita contohnya seperti keadaan berikut.
Bila kita bertemu anjing lalu ia mengejar, kita pasti akan lari, bila kita lapar
kita harus makan.

Dalam bahasa pemograman kita bisa menggunakan percabangan untuk


melakukan suatu perintah dengan keadaan tertentu.

Percabangan if … else
pada Bahasa pemograman C kita dapat melakukan sebuah percabangan
dengan menggunkan fungsi dari perintah if …. else contohnya seperti ini :
jika Sensor laser terdeteksi
lampu hijau nyala
jika salah dan keadaan Sensor Inframerah terdeteksi
lampu merah nyala

kita dapat menuliskan program Bahasa C untuk keadaan diatas seperti berikut:

WWW.ANAKKENDALI.COM 10
www.anakkendali.com
11

if (laser == 0){
Led_hijau = 1;}
else if (infrared == 1){
Led_merah = 1;}

Selain dari pada if….else perintah percabangan lainya yaitu switch….case


Pada perintah switch…case kita hanya bisa menggunakanya apabila variable
statement itu bernilai sudah pasti sedangkan pada if….else kita dapat
menggunakan lebih kecil, lebih besar maupun sama dengan namun perintah
percabangan dengan switch….case bisa lebih baik dari pada if…else jika kita
bisa menempatkanya dengan tepat. Contoh percabangan yang menggunakan
switch…case sebagai berikut :

{
switch (input_angka)

case 1: led_nyala;
break;
case 0: led_mati;
break;
}

e. Kontrol Perulangan
Perulangan atau juga disebut sebagai lopping adalah dimana kita membuat
program dan program itu dijalankan secara berulang – ulang atau terus
menerus. Ada tiga fungsi perintah looping yaitu, for…, while…, dan
do…while.
for…
untuk pengulangan menggunakan for kita dapat melakukan dua proses yaitu
penambahan atau pengurangan

WWW.ANAKKENDALI.COM 11
www.anakkendali.com
12

contoh untuk penggunaan for.. dengan proses penambahan sebagai berikut:


for (int i=0; int <= 10; i++){
program_yang akan diulang;
}
Program diatas akan diulang selama nilai variable i bertambah sampai
pada batasnya yaitu 10, dengan selisih bertambahnya i = 1

contoh untuk penggunaan for.. dengan proses pengurangan sebagai berikut :


for (int i=10; int <= 0; i--){
program_yang akan diulang;
}
Program diatas akan diulang selama nilai variable i berkurang dari 10
sampai 0, dengan selisih berkurangnya i = 1

while
perulangan pada fungsi perintah while akan di eksekusi bila keadaan nya
true atau benar, jadi selama statement itu benar maka program akan terus
menerus di ulang dan dijalankan contohnya seperti ini, “selama tombol
ditekan maka led akan berkedip dengan pewaktuan 1 detik”
maka apabila tombol itu ditekan akan menghasilkan led yang bekedip secara
terus menerus, dan bisa di hentikan jika kita memiliki kondisi lain, pada kasus
ini tombol tidak ditekan.
Untuk contoh programnya sebagai berikut :

While (PINA.0 == 1){


Led = 1;
Delay_ms(1000);
Led = 0;
Delay_ms(1000);}

WWW.ANAKKENDALI.COM 12
www.anakkendali.com
13

do….while.
fungsi perulangan selanjutnya adalah do…while, jika pada while terlebih
dahulu melakukan pengujian persyaratan lalu kemudian mengeksekusi
program untuk perulangan tapi pada fungsi do….while kita akan melakukan
perulangan apabila kondisi nya benar. Contohnya seperti ini:
led akan berkedip mengulang terus menerus apabila kondisi hitung kurang
dari 100 contoh programnya seperti berikut:

hitung = 0;
do {
led =1;
delay_ms(100);
led =1;
delay_ms(100);
}
While (hitung <100);

f. Array
Array adalah kumpulan variable yang nama dan tipe datanya sama. Setiap
anggota dari kumpulan variable itu memeiliki nomer yang disebut index, pada
Bahasa C indexnya dimulai dari 0 (nol). Berikut adalah contoh deklarasi
variable yang menggunakan Array

char nilai [100];


in tangka [50];

int output[10] = {0xFF,0x01,0x0C,0x04};

kita bisa memanggil variable itu pada fungsi looping atau program utama
contohnya seperti ini:

PORTB = output[1];
Maka akan sama dengan PORTB=0x01;

WWW.ANAKKENDALI.COM 13
www.anakkendali.com
14

g. Fungsi
Ketika kita membuat program yang besar, fungsi akan sangat membantu
peranannya sehingga kita dapat mempersingkat program yang kita buat,
fungsi juga disebut subrutin yang terpisah untuk melakukan perintah tertentu
yang kemudian bisa dipanggil ke program utama (program loop).
Contohnya kita akan mengakses motor DC yang mana kita membutuhkan satu
Pin untuk keluaran digital dan satu Pin lainya untuk keluaran PWM, jika kita
menggunakan program biasa maka saat kita ingin merubah arah dan
kecepatanya akan sangat merepotkan dan memakan banyak program namun
dengan menggunakan fungsi kita dapat mengatur sehingga program yang kita
buat lebih sedikit dan mudah untuk di edit . Contohnya seperti ini :

PORTD.3=1;
OCR1B = 500;
delay_ms(100):

dari contoh diatas kita perlu merubah logika pada PORTD.3 untuk mengatur
arahnya dan mengatur nilai OCR1B untuk nilai PWM nya, dengan
penggunaan fungsi/subrutin kita bisa memperpendek program itu, contoh
programnya seperti berikut ;

void motor(int kec){


if (kec>=0){
PORTD.3 = 0;
OCR1B = kec;}
else if (kec<0){
PORTD.3 = 1;
OCR1B = kec+255;}
}

Dengan program diatas kita bisa mengatur arah dan kecepatan hanya dengan
menentukan memanggil fungsi motor pada program utama (loop) dengan
cara seperti ini :
motor(200);
delay_ms(1000);
motor(0);
delay_ms(200);

WWW.ANAKKENDALI.COM 14
www.anakkendali.com
15

Jutsu 3
Saatnya kita mencoba!
a. Codevisson AVR dan KHAZAMA
Banyak aplikasi editor dan compiler yang bisa digunakan untuk memprogram
mikrokontoller AVR salah satunya yaitu Codevission AVR atau biasa disebut
CVAVR, karena di dalam E-book keren ini kita akan belajar memprogram
mikrokontroller ATMEGA menggunakan CVAVR. Selain CVAVR software yang
dibutuhkan untuk memprogram Mikrokontroller AVR yaitu KHZAMA AVR.
Untuk software Codevission AVR bisa didownload disini!
Sedangkan untuk software KHAZAMA AVR nya bisa Donwload disini!
Selanjutnya kita install terlebih dahulu software CVAVR dan KHAZAMA AVR.
Berikut adalah langkah – langkah untuk menginstal CVAVR

1. Jalankan file instalernya sampai terbuka jendela seperti berikut

2. kemudian akan tampil jendela seperti dibawah, klik next !

WWW.ANAKKENDALI.COM 15
www.anakkendali.com
16

3. selanjutnya tampil jendela serperti ini, centang pada I accept the agreement
kemudian Next !

4. masukan passwordnya dari file pass.txt yang ada di dalam folder Rar

5. kemudian buatlah nama dan organisasi seperti pada gambar berikut !

WWW.ANAKKENDALI.COM 16
www.anakkendali.com
17

6. klik next lalu tunggu sampai proses instalasi berhasil

7. Jangan dibuka dulu aplikasinya, jika terlanjur dibuka tutup kembali, lalu pada
folder Crack pindahkan dua file yang bernama “crack” dan “cvavr2” ke
tempat instalasi, biasanya di directory C kemudian jika sudah di copy silahkan
buka file crack nya lalu pilih yes, dan selsai, sekarang kita bisa menggunakan
software CVAVR nya dengan membuka file cvavr2

Untuk cara install KHAZAMA AVR sama seperti menginstal aplikasi pada
biasanya, tinggal jalankan aplikasinya yang sudah didownload tadi lalu
tunggu sampai proses instalasi berhasil.

WWW.ANAKKENDALI.COM 17
www.anakkendali.com
18

b. Code Wizard CVAVR


pada software CVAVR kita bisa memanfaatkan salah satu fitur nya yaitu Code
Wizard yang mana fungsi nya untuk membantu kita membuat program,
seperti contohnya untuk mengialisasi IO digital kita harus membuat program
mengakses register nya dengan bantuan Code Wizard ini kita dapat dengan
mudah mengatur register IO tersebut. Berikut adalah contoh penggunaan code
wizard untuk memilih jenis IC yang digunakan

Gambar diatas merupakan tampilan code wizard dimana kita memilih chip jenis
ATMEGA32 dengan Frekuensi clock 16Mhz.
Bisa kita lihat pada gambar tersebut terdapat banyak fitur yang bisa kita gunakan
seperti, I2c, LCD, Timer, ADC dan sebagainya.
Oke cukup itu penjelasan pada Sub bab tentang Software Codevission AVR dan
Khazama AVR, selanjutnya kita akan melangkah untuk memprogram pada
Hardware Mikrokontroller jenis ATMEGA32.
Ingat ! jangan karena E-book keren ini membahas Atmega32 sedangkan yang kita
punya Atmega16/8/328/8535 berangapan bahwa cara memprogramnya berbeda!
Memang karakteristik masing-masing IC berbeda tapi cara memprogramnya sama.
tinggal pengaturanya yang berbeda seperti contohnya. Jika kita mau menggunakan
Atmega16 maka pengaturan Chip pada Code Wizard harus disesuaikan dengan
Atmega16 juga. Untuk itu membaca datasheet sangat diperlukan bagi kita yang
sedang belajar dan bahkan untuk para professional sekalipun.

WWW.ANAKKENDALI.COM 18
www.anakkendali.com
19

c. Setting Fuse bit


Jika kita menggunakan Sistem Minimum Mikrokontroller Atmega sendiri maka
fuse bit harus kita setting daulu, jika fuse bit tidak di atur maka IC tidak akan bisa di
gunakan atau mungkin dalam kasus lain IC tidak akan bekerja dengan semestinya
terutama dalam hal pewaktuan
Berikut adalah cara setting Fuse bit untuk IC Atmega16/32 :

1. buka terlebih dahulu software KHAZAMA AVR nya kemudian pada


pemilihan IC pilih ATMEGA32/16

2. kemudian klik Command kemudian pilih Fuse and Lock bits

WWW.ANAKKENDALI.COM 19
www.anakkendali.com
20

3. kemudian akan tampil jendela seperti gambar diatas, setelah itu klik Read All

4. Aturlah Fuse bit nya seperti pada gambar diatas ini, jangan sampai salah
karena kesalahan mengatur fuse bit menyebabkan IC mikrokontroller tidak
bisa lagi diprogram kemudian silahkan klik Write All

http://www.anakkendali.com/2018/02/cara-mengatur-fuse-bit-dengan-khazama-
avr.html

WWW.ANAKKENDALI.COM 20
www.anakkendali.com
21

d. Schematic dan Design Board


Berikut adalah gambar Schematic rangkaian modul latihan Mikrokontroller AVR
dan Layout PCB yang di Design menggunakan Software EAGLE

Figure 1 Schematic Modul Latihan Mikrokontroller

WWW.ANAKKENDALI.COM 21
www.anakkendali.com
22

Jutsu 4
I/O digital!
Sebelum kita mencoba membuat program alangkah lebih baiknya kita mempelajari
system bilangan, namun karena ini bukanlah E-book khusus tentang Teknik Digital
atau Sistem bilangan jadi saya hanya akan membahas tiga bilangan saja yaitu :
Biner, Desimal, dan Hexadesimal.
Karena tiga bilangan tersebut yang sering saya gunakan untuk mengakses
mikrokontroller AVR. Baiklah berikut adalah penjelasan masing masing dari system
bilangan tersebut.
1. Biner
Bilangan biner merupakan bilangan Boolean yang hanya memiliki 2 nilai
yaitu 0 dan satu, untuk mengkonversi nilai biner ke bilangan Desimal caranya
seperti berikut :
Missal :
Binernya = 0101  Desimalnya = 5

Cara menghitungnya bisa dilihat angka biner dari yang sebelah kanan, biner
yang paling kanan itu adalah nilai pada bit 0 kemudian selanjutnya nilai pada
bit 1 sebelahnya lagi nilai pada bit 2 dan yang paling kiri nilai pada bit 3 dan
seterusnya jika ada.

Dari kanan ke kiri :


1 = (1)x2^0 = 1
0 = (0)x2^1 = 0
1 = (1)x2^2 = 4
1 = (0)x2^3 = 0
Jadi jika dijumlahkan maka = 1+0+4+0 == 5 (Desimal)
Sedangkan untuk mengkonversi dari bilangan Biner ke Bilangan Hexadesimal
penjalasanya sebagai berikut:
Bilangan Hexadesimal memiliki nilai sampa 15 untuk 10 =A, 11=B, 12=C,
13=D, 14=E, 15=F

WWW.ANAKKENDALI.COM 22
www.anakkendali.com
23

Jadi untuk menghitungnya. empat bit dari bilangan biner mewakili satu
bilangan Hexadesimal. Contohnya seperti ini :
Biner = 11000011
Maka kita bisa memecahnya menjadi dua masing-masing empat bit
{1100}  12 (desimalnya) dan untuk Hexadesimalnya = C
{0011}  3 (desimalnya) dan untuk Hexadesimalnya = 3
2. Desimal
Bilangan desimal merupakan bilangan yang sehari hari kita gunakan, baik
dalam menghitung uang ataupun menghitung matematika. Bilangan desimal
memiliki sebanyak 10 angka dari mulai 0 sampai 9.
Untuk mengkonversikan bilangan Desimal menjadi Biner seperti berikut :
Contoh desimal = 14

14:2 = 7 sisa 0
7:2 = 3 sisa 1
3:2 = 1 sisa 1
1:2 = 0 sisa 1

Maka bilangan biner nya = 1110

Untuk merubah dari Desimal ke Hexadesimal paling mudah jika sudah


merubah ke Biner, sebelumnya kita pelajari bahwa empat bilangan biner
mewakili satu bilangan Hexadesimal maka :
Desimal (14) = biner (1110) = Hexadesimal (E)

3. Hexadesimal
Bilangan Hexadesimal Memiliki 15 angka yaitu dari 0 sampai F untuk 10 =A,
11=B, 12=C, 13=D, 14=E, 15=F
Untuk mengkonversi dari Hexadesimal ke Biner yaitu sebagai berikut:
Contoh Hexadesimal = F4
Karena satu nilai Hexadesimal mewakili empat biner maka untuk F = biner
(1111) dan untuk 4 = biner (0100)
Sehingga untuk merubah ke Desimalnya menjadi mudah seperti berikut :
Hexadesimal(F4) = Biner(11110100) = Desimal(244)

WWW.ANAKKENDALI.COM 23
www.anakkendali.com
24

Figure 2 http://www.circuitstoday.com/atmega32-avr-microcontroller-an-introduction

Figure 3 Modul Latihan Mikrokontroller AVR

IC ATMEGA32 memiliki empat port yang terdiri dari delapan pin untuk setiap port-
nya dimulai dari 0 sampai 7, ke empat port itu adalah PORTA, PORTB, PORTC dan
PORTD

WWW.ANAKKENDALI.COM 24
www.anakkendali.com
25

Untuk PORTA bisa digunakan sebagai tempat untuk masukan tegangan Analog
yang disebut ADC namun PORTA juga tetap bisa difungsikan sebagai digital.
Berikut adalah penjelasan bagaimana menggunakan port digital pada
mirkokontroller AVR.
Sebelumnya kita sudah mempelajari konversi bilangan tentunya akan membuat kita
memahami materi kali ini,
Pada Mikrokontroller AVR memiliki register DDR yang berfungsi untuk untuk
menginialisasi port, jika register DDR diberikan logika 1 maka port itu akan menjadi
mode OUPUT dan jika DDR itu diberikan logika 0 maka akan menjadikan port itu
mode INPUT. Misalnya kita ingin menjadikan Port C sebagai OUTPUT maka
perintah yang harus diberikan
DDRC = 0xFF;
FF merupakan bilangan hexadecimal yang bila dibinerkan akan menjadi
(1 1 1 1 1 1 1 1) sehingga untuk semua pin pada PORTC akan menjadi mode
OUTPUT.
jika kita memberikan perintah seperti ini
DDRC = 0x00
Maka 00 Hexadesimal jika dibinerkan menjadi ( 0 0 0 0 0 0 0 0) sehingga semua pin
pada PORTC akan menjadi mode INPUT.
Karakter x pada DDRC=0x00 merupakan tanda bahwa bilangan yang kita gunakan
adalah Hexadesimal sedangkan untuk Biner kita menggunakan karakter b contohnya
DDRC = 0b00000000; atau juga
DDRC = 0b11111111;
Lalu bagaimana jika kita ingin menentukan pin tertentu untuk OUTPUT dan INPUT
misalnya pada Port C bit 0 sampai 3 adalah OUTPUT dan 4 sampai 7 adalah INPUT
?
Silahkan cari tau sendiri jawabanya !
Untuk fungsi perintah PORT sendiri digunakan untuk menentukan Keluaran
logikanya apakah 1 atau 0 contoh programnya seperti berikut
PORTC = 0xFF;

WWW.ANAKKENDALI.COM 25
www.anakkendali.com
26

Artinya semua Port C akan mengeluarkan logika 1 dan juga sebaliknya untuk.
Untuk memahami materi IO Digital kita akan melakukan perocbaan pada modul
latihan mikrokontroller Atmega32
• Buka software CVAVR yang sudah terinstal di PC pilih New – Project – Yes
untuk menggunakan CodeWizard
• Atur code wizard Seperti pada gambar dibawah ini :

Figure 4 CodeWizard IO 1

Figure 5 CodeWizard IO 2

A. Program LED Blink


Tulislah Program seperti berikut
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.

WWW.ANAKKENDALI.COM 26
www.anakkendali.com
27

http://www.hpinfotech.com

Project :
Version :
Date : 1/24/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>
// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=1 State2=1 State1=1 State0=1
PORTB=0x0F;
DDRB=0x0F;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

WWW.ANAKKENDALI.COM 27
www.anakkendali.com
28

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

WWW.ANAKKENDALI.COM 28
www.anakkendali.com
29

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

while (1)
{
// Place your code here
PORTB=0xF0;
delay_ms(1000);
PORTB=0xFF;
delay_ms(1000);
}
}

B. Program Runing LED


Berikut adalah program running LED :
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 1/24/2018

WWW.ANAKKENDALI.COM 29
www.anakkendali.com
30

Author : Chaerul Anam


Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>
// Declare your global variables here
int data = 1;
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=1 State2=1 State1=1 State0=1
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x0F;
DDRB=0x0F;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF

WWW.ANAKKENDALI.COM 30
www.anakkendali.com
31

// OC0 output: Disconnected


TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// USART disabled

WWW.ANAKKENDALI.COM 31
www.anakkendali.com
32

UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;
data = 0xFF;
delay_ms(10);
while (1)
{
// Place your code here
if (data <0){
data = 0xFF; // kemballikan ke keadaan semula
}
PORTB = data;
data <<=1; // melakukan geser kiri 1 bit
delay_ms(100);
}
}

C. Mengakses Push Button dan LED


Berikut adalah program untuk mengakses Push Button dan LED :
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 1/24/2018
Author : Chaerul Anam
Company : Sixty Light

WWW.ANAKKENDALI.COM 32
www.anakkendali.com
33

Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>

// Declare your global variables here


int a=0,b=0,c=0,d=0;
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=1 State2=1 State1=1 State0=1
PORTB=0xFF;
DDRB=0x0F;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected

WWW.ANAKKENDALI.COM 33
www.anakkendali.com
34

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

WWW.ANAKKENDALI.COM 34
www.anakkendali.com
35

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;
while (1)
{
// Place your code here
if ((PINB.7==0)&&(a==1)){
delay_ms(10);
PORTB.0 =0;
a=0;
}
else if ((PINB.7==0)&&(a==0)){
delay_ms(10);
PORTB.0=1;
a=1;}

if ((PINB.6==0)&&(b==1)){
delay_ms(10);
PORTB.1 =0;
b=0;
}
else if ((PINB.6==0)&&(b==0)){
delay_ms(10);
PORTB.1=1;
b=1;}

if ((PINB.5==0)&&(c==1)){
delay_ms(10);
PORTB.2 =0;
c=0;
}
else if ((PINB.5==0)&&(c==0)){
delay_ms(10);
PORTB.2=1;
c=1;}

WWW.ANAKKENDALI.COM 35
www.anakkendali.com
36

if ((PINB.4==0)&&(d==1)){
delay_ms(10);
PORTB.3 =0;
d=0;
}
else if ((PINB.4==0)&&(d==0)){
delay_ms(10);
PORTB.3=1;
d=1;}
}
}

D. Mengakses Seven Segmen


seven segmen di module latihan mikrokontroller
http://www.anakkendali.com/ kaki VCC 7 Segmen terhubung ke PORTA.3
sampai PORTA.6
dan untuk kaki a sampai g terhubung ke PORTC.0 sampai PORTC.7 tapi
PORTC.3 tidak terhubung. Berikut adalah program untuk mengakses Seven
Segment :
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 1/24/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>
// Declare your global variables here

WWW.ANAKKENDALI.COM 36
www.anakkendali.com
37

char i[10]={0x88, 0xF9, 0x4C, 0x68, 0x39, 0x2A, 0x0A, 0xF8, 0x08, 0x28};
int j;

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=Out Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=1 State5=1 State4=1 State3=1 State2=T State1=T State0=T
PORTA=0x78;
DDRA=0x78;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=Out Func1=Out Func0=Out
// State7=1 State6=1 State5=1 State4=1 State3=T State2=1 State1=1 State0=1
PORTC=0xF7;
DDRC=0xF7;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off

WWW.ANAKKENDALI.COM 37
www.anakkendali.com
38

// Input Capture Interrupt: Off


// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled

WWW.ANAKKENDALI.COM 38
www.anakkendali.com
39

SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

while (1)
{
// Place your code here
PORTA = 0xBF;
PORTC = i[0];
delay_ms(1);
PORTA = 0xDF;
PORTC = i[1];
delay_ms(1);
PORTA = 0xEF;
PORTC = i[2];
delay_ms(1);
PORTA = 0xF7;
PORTC = i[3];
delay_ms(1);
}
}

E. Mengakses LCD 16x2


Kita bisa mengakses modul lcd dengan menggunakan bantuan library yang
sudah tersedia dari software CVAVR nya, kita tinggal mengaktifkan nya
melalui CodeWizard.
Berikut adalah contoh program untuk mengakses LCD 16x2 :

WWW.ANAKKENDALI.COM 39
www.anakkendali.com
40

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 1/26/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>
// Alphanumeric LCD functions
#include <alcd.h>

// Declare your global variables here


int j,i;
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization

WWW.ANAKKENDALI.COM 40
www.anakkendali.com
41

// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;

WWW.ANAKKENDALI.COM 41
www.anakkendali.com
42

ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization


// Connections are specified in the

WWW.ANAKKENDALI.COM 42
www.anakkendali.com
43

// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:


// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
{
// Place your code here
for (j=1; j>=0; j--){
for (i=16; i>=0; i--){
lcd_clear();
lcd_gotoxy(i,j);
lcd_putsf("www.kendalielektro.com");
delay_ms(1000);

}
}
}
}

http://www.anakkendali.com/2018/02/cara-mengakses-lcd-16x2-cvavr.html

F. Mengakses Keypad 4x4


Keypad 4x4 bisa digunakan sebagai alat memasukan pin atau password
misalnya untuk kunci pintu atau untuk kunci brangkas dan lain sebagainya.
keypad yang akan kita gunakan terdapat 16 buah tombol dimana untuk
mengaksesnya kita juga masih menggunakan IO digital untuk lebih jelasnya
lihat skema keypad didalamnya.

WWW.ANAKKENDALI.COM 43
www.anakkendali.com
44

Pada percobaan dengan modul latihan mikrokontroller AVR Anak Kendali


saya menghubungkan Keypad 4x4 ke PORTB untuk programnya sebagai
berikut :
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 1/27/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>

// Alphanumeric LCD functions


#include <alcd.h>

unsigned char keypad();


unsigned char key;
// Declare your global variables here

char keypad()
{

PORTB=0xEF;
if (PINB.3 == 0) return ('D');
if (PINB.2 == 0) return ('7');
if (PINB.1 == 0) return ('4');
if (PINB.0 == 0) return ('1');
// ---------------------------
PORTB=0xDF;
if (PINB.3 == 0) return ('*');
if (PINB.2 == 0) return ('8');
if (PINB.1 == 0) return ('5');

WWW.ANAKKENDALI.COM 44
www.anakkendali.com
45

if (PINB.0 == 0) return ('2');


// ---------------------------
PORTB=0xBF;
if (PINB.3 == 0) return ('0');
if (PINB.2 == 0) return ('9');
if (PINB.1 == 0) return ('6');
if (PINB.0 == 0) return ('3');
// ---------------------------
PORTB=0x7F;
if (PINB.3 == 0) return ('#');
if (PINB.2 == 0) return ('C');
if (PINB.1 == 0) return ('B');
if (PINB.0 == 0) return ('A');
// ---------------------------
}

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0xBF;
DDRB=0xF0;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF

WWW.ANAKKENDALI.COM 45
www.anakkendali.com
46

// OC0 output: Disconnected


TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// USART disabled

WWW.ANAKKENDALI.COM 46
www.anakkendali.com
47

UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization


// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
{
// Place your code here
key = keypad();

if(key == '1')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad 1");
}
if(key == '2')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad 2");
}

WWW.ANAKKENDALI.COM 47
www.anakkendali.com
48

if(key == '3')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad 3");
}
if(key == '4')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad 4");
}
if(key == '5')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad 5");
}
if(key == '6')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad 6");
}
if(key == '7')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad 7");
}
if(key == '8')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad 8");
}
if(key == '9')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad 9");
}
if(key == '0')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad 0");
}
if(key == '*')
{

WWW.ANAKKENDALI.COM 48
www.anakkendali.com
49

lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad *");
}
if(key == '#')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad #");
}
if(key == 'A')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad A");
}
if(key == 'B')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad B");
}
if(key == 'C')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad C");
}
if(key == 'D')
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf ("Keypad D");
}
}
}

WWW.ANAKKENDALI.COM 49
www.anakkendali.com
50

http://www.anakkendali.com/2018/02/cara-mengakses-keypad-cvavr.html

WWW.ANAKKENDALI.COM 50
www.anakkendali.com
51

Jutsu 5
ADC
ADC (Analog to Digital Converter) merupakan salah satu fitur yang sudah tersedia
pada mikrokontroller Atmega dan terdapat 8 chanel dengan resolusi 10 bit, namun
juga kita dapat mengaturnya menjadi 8 bit. Pada E-BOOK keren ini saya tidak akan
menjelaskan tentang Register yang digunakan untuk mengatur ADC karena kita bisa
membaca lebih detail nya di setiap datasheet IC Atmega-nya.
Namun saya akan menjelaskan bagaimana perhitungan untuk ADC. Sebelumnya
kita ketahui bahwa Tegangan Analog merupakan bagian dari Sinyal Kontinyu yang
pada setiap waktu memiliki potensi untuk nilai yang berbeda, beda dengan Digital
yang hanya mempunyai dua nilai yaitu 0 dan 1 atau HIGH dan LOW.
Untuk contohnya sebagai berikut:
Analog : lampu jalan dapat diatur cahayanya dari mulai mati, redup, agak terang,
terang, dan terang sekali
Digital : lampu merah hanya dapat diatur nyala dan mati secara bergantian dengan
waktu tertentu tanpa peduli terang, redup nya.

Dari penjelasan diatas kita bisa memahami jika diberikan tegangan referensi 5V
maka tegangan analog bisa membaca nila mulai dari 0V sampai 5V secara kontinyu
berturut – turut sedangkan digital hanya bisa membaca 0V atau 5V.
Karena mikrokontroller beroperasi pada system digital maka ketika suatu device
misalkan Sensor menghasilkan keluaran Analog dan akan dimasukan ke
Mikrokontroller maka perlu adanya ADC.

Saya akan memberikan sebuah kasus misalnya.


Sebuah sensor cahaya di akses dengan mikrokontroller saat sensor mengenai cahaya
biru output yang dihasilkan sebesar 4.5V untuk tegangan referensi mikrokontroller
tersebut 5V dan menggunakan resolusi 10bit maka berapa nilai ADC tersebut?.
Untuk menghitung nilai ADC rumusnya sebagai berikut

𝑇𝑒𝑔𝑎𝑛𝑔𝑎𝑛 𝑅𝑒𝑓𝑒𝑟𝑒𝑛𝑠𝑖
𝐴𝐷𝐶 =
𝑅𝑒𝑠𝑜𝑙𝑢𝑠𝑖 𝐵𝑖𝑡 − 1

WWW.ANAKKENDALI.COM 51
www.anakkendali.com
52

Jadi untuk kasus di atas kita dapat menyelesaikanya dengan menghitung sebagai
berikut :
4.5
𝐴𝐷𝐶 = 𝑥 1023
5

A. Percobaan dengan Potentiometer


Percobaan pertama untuk ADC kita akan mencoba menggunakan
potentiometer sebagai Input tegangan Analognya berikut adalah program
untuk mengakses ADC :
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 2/7/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>
#include <alcd.h>
#include <stdlib.h>

#define ADC_VREF_TYPE 0x00

// Read the AD conversion result


unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion

WWW.ANAKKENDALI.COM 52
www.anakkendali.com
53

ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here


char buff [10];
float vin;
int val;

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

WWW.ANAKKENDALI.COM 53
www.anakkendali.com
54

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off

WWW.ANAKKENDALI.COM 54
www.anakkendali.com
55

ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization


// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
{
// Place your code here
val = read_adc(0);

vin = ((float)val*0.0048); // 0,0048 didapat dari 5v/1024


lcd_gotoxy(0,0);
lcd_putsf("Tegangan: ");
lcd_gotoxy(10,0);
ftoa(vin,3,buff);
lcd_puts(buff);
lcd_putsf("V");
delay_ms(1000);
}
}

B. Mengakses Sensor LM35

WWW.ANAKKENDALI.COM 55
www.anakkendali.com
56

Dari sini kita mencari tau tentang karakteristik sensor LM35, sesuai
datasheet LM35 ketika perubahan 1 derajat maka tegangannya berubah
10mV sehingga :

1 C = 10mV / 4,883mV
1C = 2.0479

Berikut adalah program-nya :


/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 2/7/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>
#include <alcd.h>
#include <stdlib.h>

#define ADC_VREF_TYPE 0x40

// Read the AD conversion result


unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete

WWW.ANAKKENDALI.COM 56
www.anakkendali.com
57

while ((ADCSRA & 0x10)==0);


ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here


float suhu_c;
char temp [10];
int suhu;

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock

WWW.ANAKKENDALI.COM 57
www.anakkendali.com
58

// Clock value: Timer1 Stopped


// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

WWW.ANAKKENDALI.COM 58
www.anakkendali.com
59

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization


// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
{
// Place your code here
suhu=read_adc(0x00);
suhu_c=(float)suhu*500/1023;
lcd_gotoxy(0,0);
lcd_putsf("Temperatur: ");
ftoa(suhu_c,3,temp);
lcd_gotoxy(0,1);
lcd_puts(temp);
lcd_gotoxy(8,1);
lcd_putchar(0xDF);
lcd_gotoxy(9,1);
lcd_putsf("C");
delay_ms(200);
}
}

WWW.ANAKKENDALI.COM 59
www.anakkendali.com
60

Jutsu 6
Timer dan Counter
Pada mikrokontroller atmega32/atmega16/atmega8/atmega32 tersedia fungsi untuk
menggunakan timer dan counter, biasanya counter digunakan untuk pencacahan, dan
timer untuk pewaktuan, pada modul latihan mikrokontroller ini kita menggunkanan
crystal dengan frequensi clock sebesar 16Mhz. Sehingga kita dapat menggunakan
pewaktuan sampai 16 juta per detik setiap melakukan intruksi program.
Karena menggunakan clock eksternal sehingga kita perlu melakukan pengaturan
fusebit yang sudah dijelaskan pada bab di atas, saya tidak akan menjelaskan setiap
register dari timer/counter karena kita bisa langsung membacanya di setiap datasheet
IC Atmega.

Baiklah selanjutnya kita akan mencoba program untuk mengakses timer/counter


pada mikrokontroller AVR.

1. Blink dengan Timer (tanpa delay)


untuk mengakses timer yang kita gunakan adalah menentukan nilai untuk TCNT,
karena fungsi TCNT untuk menyimpan nilai timer yang kita inginkan, berikut
adalah cara menghitungnya

TCNT = (1 + FFFFh)-((timer * freq clock)/N)

pada timer0 karena 8bit nilai maksimumnya 256 sedangkan untuk timer1 16 bit
jadi maksimalnya 65535

TCNT = nilai timer (dalam Hexadesimal)


Fclock = clock yang digunkanan
Ttimer = waktu yang diingkan
FFFFh = maksimum timer

contoh jika kita ingin waktu 1 detik dengan menggunakan timer 16 bit dengan
frekuensi clock 16.000.000 Hz dan prescaler 1024 maka
TCNT = (1+FFFFh)-(1 * 16000000)/1024
TCNT = 65535 - 15625
TCNT = C2F6

WWW.ANAKKENDALI.COM 60
www.anakkendali.com
61

Contoh programnya sebagai berikut :


/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 2/20/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>
bit tim;
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer1 value
TCNT1H=0xC2;
TCNT1L=0xF7;
// Place your code here
if (tim == 1)
{
PORTB.1 = 1;

WWW.ANAKKENDALI.COM 61
www.anakkendali.com
62

tim=0;
}else
if (tim == 0)
{
PORTB.1 = 0;
tim=1;
}
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x02;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization

WWW.ANAKKENDALI.COM 62
www.anakkendali.com
63

// Clock source: System Clock


// Clock value: 16000.000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xC2;
TCNT1L=0xF7;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x04;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

WWW.ANAKKENDALI.COM 63
www.anakkendali.com
64

SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts


#asm("sei")
tim=0;
while (1)
{
// Place your code here

}
}

2. Membuat Stopwatch Sederhana


dengan fitur counter pada mikrokontroller kita dapat membuat program
stopwatch sederhana sebagai berikut.
Sebelumnya aktifkan dulu fungsi lcd 16x2 untuk menampilkan datanya
menggunakan codewizard kemudian tambahkan settingan timer seperti
berikut

WWW.ANAKKENDALI.COM 64
www.anakkendali.com
65

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 2/20/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>
#include <stdio.h>
// Alphanumeric LCD functions
#include <alcd.h>
#include <delay.h>
unsigned char index=0, count, detik=0, menit=0, jam=0;
char buff [16];

// Timer 0 overflow interrupt service routine


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{

WWW.ANAKKENDALI.COM 65
www.anakkendali.com
66

// Reinitialize Timer 0 value


TCNT0=0xFA;
count++;
// Place your code here
}

void waktu(){

if (count>100)
{
detik++;
count=0;
}

if (detik>=60)
{
menit++;
detik=0;

if(menit>=60)
{
jam++;
menit=0;

}
}

void tombol()
{
waktu();
if ((PINB.7 == 1)&& (PINB.6==1)&&(PINB.5==1)&& (index==0)){
TIMSK=0x00;
count=0;
detik=0;
menit=0;
jam=0;
}
if (PINB.7 == 0 && (index==0 || index == 2))
{
index=1;
TIMSK=0x01;
}

if(PINB.6 == 0 && index==1)


{
index=2;
TIMSK=0x00;
}

WWW.ANAKKENDALI.COM 66
www.anakkendali.com
67

if ((PINB.5== 0 && index==1)||(PINB.5== 0 && index==2))


{
TIMSK=0x00;
index=0;
count=0;
detik=0;
menit=0;
jam=0;
}
}

void tampil_lcd()
{
tombol();
lcd_clear();
lcd_gotoxy(0,0);
sprintf(buff,"Timer %d:%d:%d:%d", jam,menit,detik,count);
lcd_puts(buff);

if (index == 0)
{
lcd_gotoxy(0,1);
lcd_putsf("START RESET");
}

if (index == 1)
{
lcd_gotoxy(0,1);
lcd_putsf("START");
}

if (index == 2)
{
lcd_gotoxy(0,1);
lcd_putsf("STOP");
}
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

WWW.ANAKKENDALI.COM 67
www.anakkendali.com
68

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x07;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 16000.000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x01;
TCNT0=0x8A;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

WWW.ANAKKENDALI.COM 68
www.anakkendali.com
69

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x01;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization


// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4

WWW.ANAKKENDALI.COM 69
www.anakkendali.com
70

// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);

// Global enable interrupts


#asm("sei")

while (1)
{
// Place your code here

tampil_lcd();

}
}

3. Mengakses Motor DC
mengakses motor DC membutuhkan fungsi PWM untuk menentukan
kecepatan motor dan fungsi IO digital untuk mengatur arahnya. PWM salah
satu dari fungsi Timer, pada rangkaian modul latihan mikrokontroller ini
menggunakan timer1 yang memiliki 2 register OCR pada PORTD.4 dan
PORTD.5 sehingga dapat digunakan untuk dua buah motor DC.
Berikut adalah program untuk mengakses motor DC
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 2/20/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

WWW.ANAKKENDALI.COM 70
www.anakkendali.com
71

#include <mega32.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=Out Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=0 State5=0 State4=0 State3=0 State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x78;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000.000 kHz
// Mode: Fast PWM top=0x00FF
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off

WWW.ANAKKENDALI.COM 71
www.anakkendali.com
72

// Input Capture on Falling Edge


// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

WWW.ANAKKENDALI.COM 72
www.anakkendali.com
73

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

while (1)
{
// Place your code here
// motor A
PORTD.3 = 0;
OCR1A = 255; // rubah dari 0-5

//motor B
PORTD.6 = 0;
OCR1B = 255; // rubah dari 0 - 5
}
}

WWW.ANAKKENDALI.COM 73
www.anakkendali.com
74

Jutsu 7
USART
USART atau lebih dikenal dengan komunikasi serial berfungsi untuk melakukan
interaksi dari satu device ke device yang lain misalnya Komputer ke Komputer,
Mikrokontroller ke Komputer, Mikrokontroller ke Mikrokontroller dan sebagainya.
Pada modul latihan mikrokontroller AVR ini menggunakan IC Atmega 32 yang
memiliki fungsi USART dengan pin TX sebagai pengirim dan RX sebagai penerima
yang terdapat pada PORTD.0 dan PORTD.1
Pada Ebook keren latihan Mikrokontroller tidak menjelaskan setiap register USART
pada IC Atmega karena sudah tersedia di setiap masing-masing datasheet IC
mikrokontroller nya.
Kemudian kita akan mencoba untuk komunikasi serial dengan cara menghubungkan
mikrokontroller dengan modul Bluetooth.

1. Mengirim data Dari Android ke Mikrokontroller dengan BT HC-05


Berikut adalah program untuk mengirimkan data dari android kemudian
ditampilkan pada LCD 16x2

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :

WWW.ANAKKENDALI.COM 74
www.anakkendali.com
75

Version :
Date : 2/22/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>

// Alphanumeric LCD functions


#include <alcd.h>
#include <delay.h>
// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here


char buff[10], data;

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization

WWW.ANAKKENDALI.COM 75
www.anakkendali.com
76

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In


// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off

WWW.ANAKKENDALI.COM 76
www.anakkendali.com
77

// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization


// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 8
lcd_init(8);

WWW.ANAKKENDALI.COM 77
www.anakkendali.com
78

while (1)
{
// Place your code here

data = getchar();
lcd_clear();
sprintf(buff, "%3c",data);
lcd_gotoxy(0,0);
lcd_puts(buff);
delay_ms(100);
}
}

2. Menyalakan LED dengan Android BT HC-05


Silahkan download aplikasi android yang mana saja untuk mengirimkan data
ke mikrokontroller menggunakan bluetooth
Berikut adalah program untuk menyalakan LED dengan Android
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 2/22/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>

// Alphanumeric LCD functions


#include <alcd.h>
#include <delay.h>
// Standard Input/Output functions
#include <stdio.h>

WWW.ANAKKENDALI.COM 78
www.anakkendali.com
79

// Declare your global variables here


char buff[10], data;

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x0F;
DDRB=0x0F;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off

WWW.ANAKKENDALI.COM 79
www.anakkendali.com
80

// Input Capture Interrupt: Off


// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

WWW.ANAKKENDALI.COM 80
www.anakkendali.com
81

SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization


// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 8
lcd_init(8);

while (1)
{
// Place your code here

data = getchar();
if (data == '1'){
PORTB.0 =0;
}
else if (data == '2'){
PORTB.1=0;
}
else if (data == '3'){
PORTB.2=0;
}
else if (data == '4'){
PORTB.3=0;
}
else {
PORTB=0xFF;
}
}
}

WWW.ANAKKENDALI.COM 81
www.anakkendali.com
82

WWW.ANAKKENDALI.COM 82
www.anakkendali.com
83

Jutsu 8
Bonus Project Sederhana
1. Mengakses Sensor DHT 11
Sensor DHT 11 merupakan sensor yang sering digunakan untuk mengukur
suhu dan kelembaban, keluaran dari sensor ini berupa sinyal digital.
Berikut adalah program untuk mengakses Sensor DHT11
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 2/6/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
// Alphanumeric LCD functions
#include <alcd.h>

// Declare your global variables here


#define PIN_DHT11 0
char buff[10];
uint8_t c=0, I_RH, D_RH, I_TEMP, D_TEMP, CheckSum;
int i;
void Req()
{
DDRA |= (1<<PIN_DHT11);

WWW.ANAKKENDALI.COM 83
www.anakkendali.com
84

PORTA &= ~(1<<PIN_DHT11);


delay_ms(20);
PORTA |= (1<<PIN_DHT11);
}

void Resp()
{
DDRA &= ~(1<<PIN_DHT11);
while(PINA & (1<<PIN_DHT11));
while((PINA & (1<<PIN_DHT11))==0);
while(PINA & (1<<PIN_DHT11));
}

uint8_t receive_data()
{
for (i=0; i<8; i++){
while ((PINA & (1<<PIN_DHT11))== 0);
delay_us(30);
if (PINA & (1<<PIN_DHT11))
c=(c<<1)|(0x01);

else
c=(c<<1);

while(PINA & (1<<PIN_DHT11));


}
return c;
}
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

WWW.ANAKKENDALI.COM 84
www.anakkendali.com
85

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off

WWW.ANAKKENDALI.COM 85
www.anakkendali.com
86

// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization


// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16

lcd_init(16);

while (1)
{
// Place your code here

Req();
Resp();

WWW.ANAKKENDALI.COM 86
www.anakkendali.com
87

I_RH = receive_data();
D_RH=receive_data();
I_TEMP=receive_data();
D_TEMP=receive_data();
CheckSum =receive_data();
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Humidity : ");
lcd_gotoxy(0,1);
lcd_putsf("Temp : ");

if ((I_RH + D_RH + I_TEMP + D_TEMP) != CheckSum){


lcd_gotoxy (0,0);
lcd_putsf("error");
}

else {
itoa(I_RH,buff);
lcd_gotoxy(11,0);
lcd_puts(buff);
lcd_putsf(".");

itoa(D_RH,buff);
lcd_puts(buff);
lcd_putsf("%");

itoa(I_TEMP,buff);
lcd_gotoxy(6,1);
lcd_puts(buff);
lcd_putsf(".");

itoa(D_TEMP,buff);
lcd_puts(buff);
lcd_putchar(0xDF);
lcd_putsf("C ");

itoa(CheckSum,buff);
lcd_puts(buff);
lcd_putsf(" ");
}
delay_ms(1000);
}
}

2. Mengakses Servo dan Pushbutton


Berikut adalah program untuk mengakses Servo yang dikontrol dengan
menggunakan Pushbutton. Lihat gambar berikut :

WWW.ANAKKENDALI.COM 87
www.anakkendali.com
88

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 2/23/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

Chip type : ATmega32


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>
// Declare your global variables here

void _90_derajat(){
PORTA.0 = 1;
delay_us(1500);
PORTA.0 = 0;

WWW.ANAKKENDALI.COM 88
www.anakkendali.com
89

delay_ms(20);
}

void _0_derajat(){
PORTA.0 = 1;
delay_us(500);
PORTA.0 = 0;
delay_ms(20);
}

void _180_derajat(){
PORTA.0 = 1;
delay_us(3000);
PORTA.0 = 0;
delay_ms(20);
}

void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTA=0x00;
DDRA=0x01;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected

WWW.ANAKKENDALI.COM 89
www.anakkendali.com
90

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

WWW.ANAKKENDALI.COM 90
www.anakkendali.com
91

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

while (1)
{
// Place your code here
if (PINB.7 == 0){
_180_derajat();
}
else if (PINB.6 == 0){
_90_derajat();
}
else if (PINB.5 == 0){
_0_derajat();
}
}
}
3. Membuat Jam Digital Sederhana
Berikut adalah program untuk membuat jam digital sederhana menggunakan
timer
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 1/12/2018
Author : Chaerul Anam
Company : Sixty Light
Comments:

WWW.ANAKKENDALI.COM 91
www.anakkendali.com
92

Chip type : ATmega16


Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 256
*****************************************************/

#include <mega16.h>

// Alphanumeric LCD functions


#include <alcd.h>
#include <stdlib.h>
#include <delay.h>

unsigned int hitung=0, detik=0, menit=0, jam=0;


unsigned char tdetik[10], tmenit[10], tjam[10];
// Timer2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
// Place your code here
TCNT2 =0; // ketika compare di set kembali ke awal
if (++hitung == 13333){

if (++detik == 60){
detik=0;
lcd_clear();

if (++menit == 60){
menit=0;
lcd_clear();

if (++jam == 24){
jam = 0;
lcd_clear();
}
}
}
hitung=0;
itoa(detik,tdetik); // integer to ascii
itoa(menit,tmenit);
itoa(jam,tjam);

lcd_gotoxy(9,0);
lcd_putsf (":");
lcd_gotoxy(10,0);
lcd_puts(tdetik);
lcd_gotoxy(6,0);

WWW.ANAKKENDALI.COM 92
www.anakkendali.com
93

lcd_putsf(":");
lcd_gotoxy(7,0);
lcd_puts(tmenit);
lcd_gotoxy(4,0);
lcd_puts(tjam);
lcd_gotoxy(0,1);
lcd_putsf("= Jam Digital =");
}
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

WWW.ANAKKENDALI.COM 93
www.anakkendali.com
94

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 2000.000 kHz
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x02;
TCNT2=0x00;
OCR2=0x96;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x80;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off

WWW.ANAKKENDALI.COM 94
www.anakkendali.com
95

ACSR=0x00;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization


// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);

// Global enable interrupts


#asm("sei")

while (1)
{
// Place your code here

};
}

WWW.ANAKKENDALI.COM 95
www.anakkendali.com
96

Jutsu 9
Referensi

1. W. Ardi, Mikrokontroler AVR ATmega8/32/16/8535 dan Pemrogramannya dengan


Bahasa C pada WinAVR, Penerbit INFORMATIKA Bandung, 2008.
2. http://www.electronicwings.com/
3. http://www.anakkendali.com/

WWW.ANAKKENDALI.COM 96
www.anakkendali.com
97

Tentang Penulis
Chaerul Anam adalah nama berharga yang diberikan Seorang kakek tepat pada
tanggal 1 Desember 1996 di sebuah desa terpencil bagian Indramayu Selatan, sejak
kecil hidup saya sudah jauh dari kedua orang tua karena harus menjalani kehidupan
di Pondok Pesantren Al-Ishlah Tajug Indramayu untuk menimba ilmu selama 6
tahun atau setara dengan tingkat SMP dan SMA. setelah tamat dari pondok pesantren
saya melanjutkan studi ke jenjang perguruan tinggi swasta Universitas Islam
Indonesia Yogyakarta mengambil Jurusan Teknik Elektro. Alasan saya menulis
Ebook ini karena ada Pepatah mengatakan :

“ ‫ قيد صيودك بالحبال الواثقة‬,‫ والكتابة قيده‬,‫العلم صيد‬ ”


Artinya : ilmu adalah buruan dan tulisan adalah talinya, maka ikatlah buruanmu
dengan tali yang kuat
terlebih lagi Rasulullah SAW pernah bersabda :

“‫” رخي الناس انفعهم للناس‬


Artinya : Sebaik-baiknya manusia ialah yang bermanfaat bagi manusia yang lainya
Dan juga ada motivasi dari kata kata berikut yang membuat saya selalu ingin
mengamalkan apa yang saya punya

“‫”العلم بال عمل كالشجر بال ثمر‬


Artinya : Ilmu yang tidak di amalkan bagaikan pohon tidak berbuah
Silahkan hubungi saya di
Wa : 0895400089651 Email : chaerulanam1412@gmail.com
FB : https://web.facebook.com/coe.uciha Blog : http://www.anakkendali.com/

WWW.ANAKKENDALI.COM 97

Anda mungkin juga menyukai