Pelatihan ATMEGA8535 CVAVR
Pelatihan ATMEGA8535 CVAVR
Pelatihan ATMEGA8535 CVAVR
VCC
VCC
POWER
R1 D0
1 2 S1
1 RESET C3 VCC U4
2 470 10u
LED
J1 31 39 DATA0
RST EA/VPP P0.0/AD0 38 DATA1
C
9 P0.1/AD1 37 DATA2
PELATIHAN
R2 D3 RST P0.2/AD2 36 DATA3
4K7 P0 1 P0.3/AD3 35 DATA4
1N4002 P1 2 P1.0 P0.4/AD4 34 DATA5
P2 3 P1.1 P0.5/AD5 33 DATA6
A
P3 4 P1.2 P0.6/AD6 32 DATA7
P4 5 P1.3 P0.7/AD7
HEADER 5 P5 6 P1.4 21 ADD8
P6 7 P1.5 P2.0/A8 22 ADD9
P7 P1.6 P2.1/A9 ADD10
MIKROKONTROLER
8 23
1 P1.7 P2.2/A10 24 ADD11
2 INT0 12 P2.3/A11 25 ADD12
3 INT1 13 P3.2/INTO P2.4/A12 26 ADD13
4 GND TIM0 14 P3.3/INT1 P2.5/A13 27 ADD14
P1 5 TIM1 15 P3.4/TO P2.6/A14 28 ADD15
1 P3.5/T1 P2.7/A15
U6 JP4
6 8 11 T1 11
2 RX1 13 R2IN T1IN 12 R1 10 P3.1/TXD 30 ALE
R1IN R1OUT P3.0/RXD ALE/PROG
ATMEGA8535
7 7 10 29 PSEN
3 TX1 14 T2OUT T2IN 9 19 PSEN 17 RD
8 T1OUT R2OUT XTAL1 P3.7/RD 16 WR
X1
4 1uF 16V
1 4 1uF 16V 18 P3.6/WR
9 C+ C2+ XTAL2
5 + C4 + C5 12MHz
AT89C51
3 5
SERIAL COM C1- C2-
1uF 16V 2 6 1uF 16V
V+ V- C9 30p 30p
+ C8 MAX232 + C6 C7
www.umy.ac.id www.iswantodosen.blogspot.com
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
i
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
PENGENALAN BAHASA C
1. PENDAHULUAN
PDP-11 yang menggunakan sistem opersi UNIX C adalah bahasa yang standar, artinya
suatu program yang ditulis dengan bahasa C tertentu akan dapat dikonversi dengan
bahasa C yang lain dengan sedikit modifikasi. Standar bahasa C yang asli adalah standar
dari UNIX. Patokan dari standar UNIX ini diambil dari buku yang ditulis oleh Brian
oleh Prentice-Hall tahun 1978. Deskripsi C dari Kerninghan dan Ritchie ini kemudian
Program Bahasa C tidak mengenal aturan penulisan di kolom tertentu, jadi bisa
#include <mega8535.h>
#include <delay.h>
main ()
{
}
-1-
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Program dalam bahasa C selalu berbentuk fungsi seperti ditunjukkan dalam main
(). Program yang dijalankan berada di dalam tubuh program yang dimulai dengan tanda
kurung buka { dan diakhiri dengan tanda kurung tutup }. Semua yang tertulis di dalam
suatu nilai yang akan digunakan dalam fungsi tersebut. Dalam fungsi main diatas tidak
ada argumen, sehingga tak ada data dalam (). Dalam tubuh fungsi antara tanda { dan
tanda } ada sejumlah pernyataan yang merupakan perintah yang harus dikerjakan oleh
dengan tanda titik koma (;). Baris tersebut meminta kompiler untuk menyertakan file
yang namanya ada di antara tanda <> dalam proses kompilasi. File-file ini (ber-
ekstensi .h) berisi deklarasi fungsi ataupun variable. File ini disebut header. File ini
directive). Pengarah praprosesor ini dipakai untuk membaca file yang di antaranya
berisi deklarasi fungsi dan definisi konstanta. Beberapa file judul disediakan dalam C.
File-file ini mempunyai ciri yaitu namanya diakhiri dengan ekstensi .h. Misalnya pada
program #include <stdio.h> menyatakan pada kompiler agar membaca file bernama
#include namafile
dilakukan pada direktori khusus, yaitu direktori file include. Sedangkan bentuk kedua
(#include namafile) menyatakan bahwa pencarian file dilakukan pertama kali pada
-2-
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
direktori aktif tempat program sumber dan seandainya tidak ditemukan pencarian akan
dilanjutkan pada direktori lainnya yang sesuai dengan perintah pada sistem operasi.
3. TIPE DATA
Tipe data merupakan bagian program yang paling penting karena tipe data
mempengaruhi setiap instruksi yang akan dilaksanakan oleh computer. Misalnya saja 5
dibagi 2 bisa saja menghasilkan hasil yang berbeda tergantung tipe datanya. Jika 5 dan 2
bertipe integer maka akan menghasilkan nilai 2, namun jika keduanya bertipe float
maka akan menghasilkan nilai 2.5000000. Pemilihan tipe data yang tepat akan membuat
4. KONSTANTA
Konstanta merupakan suatu nilai yang tidak dapat diubah selama proses program
dahulu di awal program. Konstanta dapat bernilai integer, pecahan, karakter dan string.
-3-
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
5. VARIABLE
Variabel adalah suatu pengenal (identifier) yang digunakan untuk mewakili suatu
nilai tertentu di dalam proses program. Berbeda dengan konstanta yang nilainya selalu
tetap, nilai dari suatu variable bisa diubah-ubah sesuai kebutuhan. Nama dari suatu
variable dapat ditentukan sendiri oleh pemrogram dengan aturan sebagai berikut :
Terdiri dari gabungan huruf dan angka dengan karakter pertama harus berupa huruf.
Bahasa C bersifat case-sensitive artinya huruf besar dan kecil dianggap berbeda.
Yang termasuk symbol khusus yang tidak diperbolehkan antara lain : $, ?, %, #, !, &,
*, (, ), -, +, = dsb
6. DEKLARASI
Deklarasi diperlukan bila kita akan menggunakan pengenal (identifier) dalam program.
Contoh :
Contohnya :
-4-
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Fungsi merupakan bagian yang terpisah dari program dan dapat diaktifkan atau
dipanggil di manapun di dalam program. Fungsi dalam bahasa C ada yang sudah
disediakan sebagai fungsi pustaka seperti printf(), scanf(), getch() dan untuk
Fungsi yang perlu dideklarasikan terlebih dahulu adalah fungsi yang dibuat oleh
Tipe_fungsi nama_fungsi(parameter_fungsi);
Contohnya :
7. OPERATOR
Operator penugasan (Assignment operator) dalam bahasa C berupa tanda sama dengan
(=).
.* : untuk perkalian
/ : untuk pembagian
+ : untuk penjumlahan
- : untuk pengurangan
-5-
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
7.2.1. PERKALIAN
#include <mega8535.h>
#include <delay.h>
void main()
{
int bil1;
int bil2;
DDRB=0xFF;
PORTB=0xFF;
bil1=4;
bil2=2;
PORTB=bil1*bil2;
}
7.2.2. PEMBAGIAN
#include <mega8535.h>
#include <delay.h>
void main()
{
int bil1;
int bil2;
DDRB=0xFF;
PORTB=0xFF;
bil1=10;
bil2=2;
PORTB=bil1/bil2;
}
7.2.3. MODULUS
#include <mega8535.h>
#include <delay.h>
void main()
{
int bil1;
int bil2;
DDRB=0xFF;
PORTB=0xFF;
bil1=13;
-6-
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
bil2=2;
PORTB=bil1%bil2;
}
7.2.4. PENJUMLAHAN
#include <mega8535.h>
#include <delay.h>
void main()
{
int bil1;
int bil2;
DDRB=0xFF;
PORTB=0xFF;
bil1=0x30;
bil2=0x20;
PORTB=bil1+bil2;
}
7.2.5. PENGURANGAN
#include <mega8535.h>
#include <delay.h>
void main()
{
int bil1;
int bil2;
DDRB=0xFF;
PORTB=0xFF;
bil1=0x30;
bil2=0x20;
PORTB=bil1-bil2;
}
operand /sebuah nilai atau variable. Operasi majemuk seperti pada tabel dibawah ini:
-7-
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
maka operator logika digunakan untuk membandingkan logika hasil dari operator-
operator hubungan.
|| : Logika OR (ATAU)
Operasi AND akan bernilai benar jika dua ekspresi bernilai benar. Operasi OR akan
bernilai benar jika dan hanya jika salah satu ekspresinya bernilai benar. Sedangkan
operasi NOT menghasilkan nilai benar jika ekspresinya bernilai salah, dan akan bernilai
#include <mega8535.h>
#include <delay.h>
void main()
{
char in1;
char in2;
DDRB=0xFF;
PORTB=0xFF;
in1=0xf0;
-8-
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
in2=0x40;
if((in1==0xf0) && (in2==0x40))
{PORTB = 0x2A;}
}
Operator bitwise digunakan untuk memanipulasi bit-bit dari nilai data yang ada di
memori.
| : Bitwise OR
~ : Bitwise NOT
Operasi geser kiri merupakan operasi yang akan menggeser bit-bit kekiri
sehingga bit 0 akan berpindah ke bit 1 kemudian bit 1 akan berpindah ke bit 2 dan
seterusnya. Operasi geser kiri membutuhkan dua buah operan disebelah kiri tanda <<
merupakan nilai yang akan digeser sedangkan disebelah kanannya merupakan jumlah
bit penggerseran.
Contohnya :
Datanya = 0x03 << 2 ; // 0x03 digeser kekiri 2 bit hasilnya ditampung di datanya
a << = 1 // Isi variabel A digeser ke kiri 1 bit hasilnya
// kembali disimpan di A
-9-
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
#include <mega8535.h>
#include <delay.h>
void main()
{
char a, led;
DDRB=0xFF;
PORTB=0xFF;
led=0x01;
for (a=0;a<8;a++)
{
PORTB=led;
led=led <<1;
}
}
Operasi geser kiri merupakan operasi yang akan menggeser bit-bit kekanan
sehingga bit 7 akan berpindah ke bit 6 kemudian bit 6 akan berpindah ke bit 5 dan
seterusnya. Operasi geser kanan membutuhkan dua buah operan disebelah kiri tanda <<
merupakan nilai yang akan digeser sedangkan disebelah kanannya merupakan jumlah
bit penggerseran.
Contohnya :
Datanya = 0x03 >> 2 ; // 0x03 digeser kekiri 2 bit hasilnya ditampung di datanya
a >> = 1 // Isi variabel A digeser ke kiri 1 bit hasilnya
// kembali disimpan di A
#include <mega8535.h>
#include <delay.h>
void main()
{
char a, led;
DDRB=0xFF;
PORTB=0xFF;
led=0x01;
for (a=0;a<8;a++)
{
PORTB=led;
led=led <<1;
}
}
- 10 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Operasi bitwise AND akan melakukan operasi AND pada masing-masing bit, sehingga
Contohnya :
#include <mega8535.h>
#include <delay.h>
void main()
{
char a=0x03;
char b=0x31;
DDRB=0xFF;
PORTB=0xFF;
PORTB= a & b ;
}
Operasi bitwise OR akan melakukan operasi OR pada masing-masing bit, sehingga bit 0
Contohnya :
#include <mega8535.h>
#include <delay.h>
void main()
{
char a=0x03;
char b=0x31;
DDRB=0xFF;
PORTB=0xFF;
PORTB= a | b ;
}
- 11 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Operasi bitwise XOR akan melakukan operasi XOR pada masing-masing bit, sehingga
Contohnya :
#include <mega8535.h>
#include <delay.h>
void main()
{
char a=0x02;
char b=0xFA;
DDRB=0xFF;
PORTB=0xFF;
PORTB=a ^ b ;
}
Operasi bitwise XOR akan melakukan operasi XOR pada masing-masing bit, sehingga
#include <mega8535.h>
#include <delay.h>
void main()
{
char a= 0x31;
DDRB=0xFF;
PORTB=0xFF;
PORTB= ~a;
}
- 12 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
#include <mega8535.h>
#include <delay.h>
union kint
{
unsigned char a[2];
unsigned int b;
};
void main()
{
union kint tmp;
volatile unsigned char i=0x37;
volatile unsigned int j=0x9973;
DDRA=0xFF;
DDRB=0xFF;
DDRD=0xFF;
PORTA=i;
tmp.b=j;
PORTD= tmp.a[1];
PORTB=tmp.a[0];
i= ((i<<4) | (i>>4)); //pertukaran nibble
j= ((j<<8) | (j>>8)); //pertukaran byte
PORTA=i; //I dikeluarkan ke Port 1
tmp.b=j;
PORTB=tmp.a[0];
PORTD=tmp.a[1];
}
Untuk mendapatkan bit yang paling berbobot (MSB) untuk tipe long, short, int, dan
- 13 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
#include <mega8535.h>
#include <delay.h>
void main()
{
volatile unsigned char gint=0xaa;
volatile unsigned char hob;
unsigned a;
DDRB=0xFF;
for(a=0;a<8;a++)
{
hob=(gint>>7) &1;
PORTB=hob;
gint=((gint<<1)|(gint>>7));
}
Operator Unary merupakan operator yang hanya membutuhkan satu operand saja.
- 14 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Contohnya :
n=0
Jum = 2 * ++n;
Jum = 2 * n++;
#include <mega8535.h>
#include <delay.h>
void main()
{
int a;
DDRB=0xFF;
for(a=0;a<20;a++)
PORTB=a;
}
Operator majemuk terdiri dari dua operator yang digunakan untuk menyingkat
8. KOMENTAR PROGRAM
suatu program (untuk keperluan dokumentasi program). Dengan kata lain, komentar
- 15 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
menggunakan tanda // untuk komentar yang hanya terdiri dari satu baris. Komentar
Contoh pertama :
Dibelakang tanda // tak akan diproses dalam kompilasi. Tanda ini hanya untuk satu baris
kalimat.
Contoh kedua :
Bentuk ini berguna kalau pernyataannya berupa kalimat yang panjang sampai beberapa
baris.
9. PENYELEKSIAN KONDISI
Penyeleksian kondisi dapat diibaratkan sebagai katup atau kran yang mengatur jalannya
air. Bila katup terbuka maka air akan mengalir dan sebaliknya bila katup tertutup air
tidak akan mengalir atau akan mengalir melalui tempat lain. Fungsi penyeleksian
kondisi penting artinya dalam penyusunan bahasa C, terutama untuk program yang
kompleks.
Struktur if dibentuk dari pernyataan if dan sering digunakan untuk menyeleksi suatu
kondisi tunggal. Bila proses yang diseleksi terpenuhi atau bernilai benar, maka
- 16 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
if(kondisi)
pernyataan;
#include <mega8535.h>
#include <delay.h>
void main()
{
char inp1;
DDRA=0xFF;
DDRB=0xFF;
inp1=PORTB;
if(inp1==0x40)
{PORTA = 0x20;}
}
Dalam struktur kondisi if.....else minimal terdapat dua pernyataan. Jika kondisi yang
diperiksa bernilai benar atau terpenuhi maka pernyataan pertama yang dilaksanakan dan
jika kondisi yang diperiksa bernilai salah maka pernyataan yang kedua yang
if(kondisi)
pernyataan-1
else
pernyataan-2
Contoh
IF
if (angka = fo) /* bila angka sama dengan fo */
{ /*kerjakan berikut ini */
for (k = 0; k<4 ; k++)
{
i=tabel1(k);
PORTA = i; // pernyataan dalam blok ini bisa kosong
tunda50(100); // berarti tidak ada yang dikerjakan
}
}
else //bila tidak sama kerjakan berikut ini
{
for (k = 0; k<4 ; k++)
{
i=tabel2(k); // pernyataan dalam blok ini bisa kosong
- 17 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
#include <mega8535.h>
#include <delay.h>
void main()
{
char inp1;
DDRA=0xFF;
DDRB=0xFF;
inp1=PORTB;
if(inp1==0x01)
{PORTA = 0x20;}
else
{PORTA=0x80;}
}
kemungkinan yang terjadi cukup banyak. Struktur ini akan melaksanakan salah satu dari
beberapa pernyataan case tergantung nilai kondisi yang ada di dalam switch.
Selanjutnya proses diteruskan hingga ditemukan pernyataan break. Jika tidak ada nilai
pada case yang sesuai dengan nilai kondisi, maka proses akan diteruskan kepada
- 18 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
SWITCH . CASE
switch(fo)
{
case 1:
for (k = 0; k<4 ; k++)
{
i=tabel1(k);
PORTA = i;
tunda(100);
}
break;
case 2:
for (k = 0; k<4 ; k++)
{
i=tabel2(k);
PORTA = i;
tunda(100);
}
break;
#include <mega8535.h>
#include <delay.h>
void main()
{
char a;
DDRA=0xFF;
DDRB=0xFF;
a=PORTA;
switch(a)
{
case 0: PORTB=5;break;
case 1: PORTB=10;break;
case 2: PORTB=15;break;
case 3: PORTB=20;break;
case 4: PORTB=40;break;
case 5: PORTB=60;break;
default: PORTB=0;break;
}
}
10. PERULANGAN
Dalam bahasa C tersedia suatu fasilitas yang digunakan untuk melakukan proses
yang berulangulang sebanyak keinginan kita. Misalnya saja, bila kita ingin menginput
- 19 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
dan mencetak bilangan dari 1 sampai 100 bahkan 1000, tentunya kita akan merasa
kesulitan. Namun dengan struktur perulangan proses, kita tidak perlu menuliskan
perintah sampai 100 atau 1000 kali, cukup dengan beberapa perintah saja. Struktur
Perulangan ini banyak digunakan bila jumlah perulangannya belum diketahui. Proses
perulangan akan terus berlanjut selama kondisinya bernilai benar (true) dan akan
While (ekspresi)
{
Pernyataan_1
Pernyataan_2
}
Contoh Program 1 :
while (!TF0);
{
TF0 = 0;
TR0 = 0;
}
#include <mega8535.h>
#include <delay.h>
void main()
{
char a=10;
DDRA=0xFF;
while(a>=0)
{
PORTA=a;
a--;
}
}
- 20 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Pada dasarnya struktur perulangan do....while sama saja dengan struktur while,
hanya saja pada proses perulangan dengan while, seleksi berada di while yang letaknya
di atas sementara pada perulangan do....while, seleksi while berada di bawah batas
Do
{
Pernyataan_1
Pernyataan_2
}
While (ekspresi)
#include <mega8535.h>
#include <delay.h>
void main()
{
char a=10;
DDRA=0xFF;
do
{
PORTA=a;
a--;
} while(a>=0);
}
Struktur perulangan for biasa digunakan untuk mengulang suatu proses yang
telah diketahui jumlah perulangannya. Dari segi penulisannya, struktur perulangan for
tampaknya lebih efisien karena susunannya lebih simpel dan sederhana. Bentuk umum
- 21 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Keterangan:
syarat : ekspresi relasi yang menyatakan kondisi untuk keluar dari perulangan.
Contoh
#include <mega8535.h>
#include <delay.h>
void main()
{
char a;
DDRA=0xFF;
for(a=10;a>=0;a--)
PORTA=a;
}
Array merupakan kumpulan dari nilai-nilai data yang bertipe sama dalam urutan
tertentu yang menggunakan nama yang sama. Letak atau posisi dari elemen array
ditunjukkan oleh suatu index. Dilihat dari dimensinya array dapat dibagi menjadi Array
Setiap elemen array dapat diakses melalui indeks. Indeks array secara default
[Tipe_array][ nama_array][elemen1];
- 22 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Array dua dimensi merupakan array yang terdiri dari m buah baris dan n buah
[Tipe_array][nama_array][elemen1][elemen2];
Array multi-dimensi merupakan array yang mempunyai ukuran lebih dari dua.
Bentuk pendeklarasian array sama saja dengan array dimensi satu maupun array
[tipe_array][nama_array][elemen1][elemen2][elemenN];
12. FUNGSI
mengerjakan suatu tugas tertentu dan letaknya terpisah dari program yang
minimal terdapat satu fungsi yaitu fungsi main(). Fungsi banyak diterapkan dalam
yaitu program akan memiliki struktur yang jelas (mempunyai readability yang tinggi)
Sebelum digunakan fungsi harus didefinisikan terlebih dahulu. Bentuk definisi fungsi
adalah:
- 23 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Contoh:
1 2 3 4
Keterangan:
1. tipe data nilai balik fungsi
2. merupakan nama fungsi
3. tipe argumen
4. nama argumen
#include <mega8535.h>
#include <delay.h>
int jumlah(int bil1,int bil2)
{
return(bil1+bil2);
}
void main()
{
DDRA=0xFF;
PORTA=jumlah(20,50);
}
untuk program yang komplek atau besar. Untuk mengatasi hal tersebut maka fungsi
dapat dideklarasikan sebelum digunakan, terletak sebelum fungsi main. Deklarasi fungsi
- 24 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
dikenal dengan prototype fungsi. Cara mendeklarasikan fungsi sama dengan header
#include <mega8535.h>
#include <delay.h>
int jumlah(int bil1,int bil2);
void main()
{
DDRA=0xFF;
PORTA=jumlah(20,50);
}
int jumlah(int bil1,int bil2)
{
return(bil1+bil2);
}
variabel ini hanya dikenal fungsi tersebut. Setelah keluar dari fungsi ini maka variabel
ini akan hilang. Variabel global adalah variabel yang dideklarasikan di luar fungsi,
#include <mega8535.h>
#include <delay.h>
int jumlah(int bil1,int bil2);
int data1;
void main()
{
int data1;
DDRA=0xFF;
data1=jumlah(20,50);
PORTA = data1;
}
int jumlah(int bil1,int bil2)
{
return(bil1+bil2);
}
- 25 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Kata kunci extern dan static digunakan untuk menyatakan sifat dari variabel atau
fungsi. Suatu variabel atau fungsi yang didepannya ditambah dengan kata kunci extern
maka artinya variabel atau fungsi tersebut didefinisikan di luar file tersebut. Variabel
global atau fungsi yang didepannya ditambah kata kunci static mempunyai arti bahwa
variabel global atau fungsi tersebut bersifat pivate bagi file tersebut, sehingga tidak
dapat diakses dari file yang lain. Kata kunci static yang ditambahkan didepan variabel
lokal (variabel di dalam suatu fungsi) artinya variabel tersebut dialokasikan pada
memori statik. Nilai yang tersimpan dalam variabel statik tidak hilang walaupun sudah
Fungsi yang tidak mempunyai nilai balik menggunakan kata kunci void
sedangkan fungsi yang tidak mempunyai argumen, setelah nama fungsi dalam kurung
Contoh:
void tunda(void)
{
for(i = 0; i < 10 ; i++);
}
atau
void tunda()
{
for(i=0;i<10;i++);
{}
}
/* fungsi tunda_panjang */
void tunda_panjang(int n)
{
int i;
for (i=0; i<n;i++)
tunda();
- 26 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Nilai balik dinyatakan delam pernyataan return. Tipe nilai balik dapat berupa
Contoh:
#include <mega8535.h>
#include <delay.h>
void Tambahv(int A)
{
A=A+1;
}
void main()
{
int B;
DDRA=0xFF;
B=4;
Tambahv(B);
PORTA=B;
}
- 27 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
#include <mega8535.h>
#include <delay.h>
void Tambahp(int *A)
{
*A=*A+1;
}
void main()
{
int B;
DDRA=0xFF;
B=4;
Tambahp(&B);
PORTA=B;
}
13. STRUKTUR
Struktur merupakan sekelompok data (variabel) yang mempunyai tipe yang sama
Struct nama_struktur
{
deklarasi variabel;
}
Contoh:
Struct kar_sensor
{
unsigned char impedan;
unsigned char koefi_suhu;
unsigned char gain;
}
- 28 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
atau
typedef struct
{
deklarasi variabel
} nama_struktur;
Contoh:
Typedef struct
{
unsigned char impedan;
unsigned char koefi_suhu;
unsigned char gain;
}
Pada deklarasi struktur belum ada pengalokasian memori, oleh karena itu agar
Bentuk 1:
Struct nama_struktur nama_variabel;
Contoh:
Struct kar_sensor sem_suhu;
Bentuk 2:
Nama_struktur nama_variabel
Contoh:
Kar_sensor sen_suhu;
13.3. MENGAKSES ANGGOTA STRUKTUR
Untuk mengakses anggota struktur dapat dilakukan dengan cara sebagai berikut:
Contoh:
Sen_suhu.impedansi = 0x5;
Sen_suhu.kofi_suhu = 0x01;
Sen_suhu.gain = 0x04;
- 29 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
#include <mega8535.h>
#include <delay.h>
struct kar_sensor
{
unsigned char impedan;
unsigned char koefi_suhu;
unsigned char gain;
};
void main()
{
struct kar_sensor sen_suhu;
DDRA=0xFF;
DDRB=0xFF;
DDRD=0xFF;
sen_suhu.impedan=0x5;
sen_suhu.koefi_suhu=0x01;
sen_suhu.gain=0x04;
PORTA=sen_suhu.impedan;
PORTB=sen_suhu.koefi_suhu;
PORTD=sen_suhu.gain;
}
Contoh:
Mengakses larik ke 0:
Dbase_sensor [0].impedan=0x5;
Dbase_sensor [0].koefi_suhu=0x01;
Dbase_sensor [0].gain=0x04;
Mengakses larik ke 1:
Dbase_sensor [1].impedan=0x6;
Dbase_sensor [1].koefi_suhu=0x05;
Dbase_sensor [1].gain=0x02;
#include <mega8535.h>
#include <delay.h>
- 30 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
struct kar_sensor
{
unsigned char impedan;
unsigned char koefi_suhu;
unsigned char gain;
};
void main()
{
struct kar_sensor sen_suhu[2];
DDRA=0xFF;
DDRB=0xFF;
DDRD=0xFF;
sen_suhu[0].impedan=0x5;
sen_suhu[0].koefi_suhu=0x01;
sen_suhu[0].gain=0x4;
PORTA=sen_suhu[0].impedan;
PORTB=sen_suhu[0].koefi_suhu;
PORTD=sen_suhu[0].gain;
}
Anggota struktur dapat diberi nilai ketika pendefinisian variabel struktur seperti
Contoh:
#include <mega8535.h>
#include <delay.h>
struct kar_sensor
{
unsigned char impedan;
unsigned char koefi_suhu;
unsigned char gain;
};
void main()
- 31 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
{
struct kar_sensor
sen_suhu[2]={{0x05,0x01,0x04},{0x7,0x02,0x01}};
DDRA=0xFF;
DDRB=0xFF;
DDRD=0xFF;
PORTA=sen_suhu[0].impedan;
PORTB=sen_suhu[0].koefi_suhu;
PORTD=sen_suhu[0].gain;
}
Untuk mengakses data anggota dilakukan dengan cara seperti berikut ini:
Dbase_sensor = &base;
Dbase_sensor > impedan = 0x05;
Dbase_sensor > koefi_suhu = 0x02;
Dbase_sensor > gain = 0x03;
P1 = Dbase_sensor > impedan
P2 = Dbase_sensor > koefi_suhu;
P3 = Dbase_sensor > gain
mencegah pelewatan data anggota struktur yang banyak, karena hanya parameter
tertentu saja yang akan dilewatkan. Melewatkan pointer struktur ke fungsi dapat juga
- 32 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
}
P1 = Dbase_sensor > impedan
P2 = Dbase_sensor > koefi_suhu;
P3 = Dbase_sensor > gain
14. POINTER
Pointer (variabel penunjuk) adalah suatu variabel yang berisi alamat memori
dari suatu variabel lain. Alamat ini merupakan lokasi dari obyek lain (biasanya variabel
lain) di dalam memori. Contoh, jika sebuah variabel berisi alamat dari variabel lain,
Operator &
. Operator *
Seperti halnya variabel yang lain, variabel pointer juga harus dideklarasikan terlebih
Bentuk Umum :
Tipe_data *nama_pointer;
Tipe data pointer mendefinisikan tipe dari obyek yang ditunjuk oleh pointer. Secara
teknis, tipe apapun dari pointer dapat menunjukkan lokasi (dimanapun) dalam memori.
- 33 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Bahkan operasi pointer dapat dilaksanakan relatif terhadap tipe dasar apapun yang
ditunjuk. Contoh, ketika kita mendeklarasikan pointer dengan tipe int*, kompiler akan
bukan (sebuah pointer int* selalu menganggap bahwa ia menunjuk ke sebuah obyek
sebuah pointer, pastikan tipenya sesuai dengan tipe obyek yang akan ditunjuk.
Contoh :
char *ptr;
data char *ptr;
Sdcc juga mendukung deklarasi pointer yang mengarahkan fisik pointer ke kelas
memori tertentu.
Contoh:
- 34 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
karena itu perlu untuk diinisialisasi agar pointer menunjuk ke alamat tertentu sesuai
dengan kebutuhan.
int *ptrku;
ptrku= (int *) 0x8000;
atau
int *ptrku=(int *) 0x8000;
CVAVR juga mendukung penyisipan instruksi dalam bahasa asembli. Instruksi asembli
dituliskan diantara kata kunci #asm dan #endasm seperti berikut ini:
- 35 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Void tunda()
{
#asm
mov r0, #20
00001$: djnz r0, 00001$
#endasm;
}
#include <mega8535.h>
#include <delay.h>
void tunda()
{
#asm
mov r0, #0x0f5
01$: mov r1, #0x0ff
02$: mov r2, #0
djnz r1, 02$
djnz r0, 01$
#endasm;
}
void main()
{
char a;
char k; DDRA=0xFF;
DDRB=0xFF;
while(1)
{
a=0x03;
for (k=0;k<9;k++)
{
PORTB=a;
tunda();
a=a<<1;
}
}
}
Label pada instruksi assembli berupa anggka nnnnn$ dengan nnnnn berupa
angka di bawah 100. label pada instruksi assembli hanya dikenal oleh instruksi
assembli, bahasa C tidak mengenal label pada penyisipan assembli dan juga sebaliknya.
Contoh:
- 36 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Void conto()
{
/*Pernyataan C*/
#asm
; beberapa instruksi asembli
ljmp 00003$
#endasm;
/*Pernyataan C*/
clabel: /*instruksi assembli tidak mengenal*/
#asm
00003$: ; hanya dapat dikenal oleh assembli
#endasm;
}
- 37 -
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB I
APLIKASI OUTPUT
1.1. RANGKAIAN LAMPU LED
pada Gambar 3.1. yang perlu diperhatikan adalah konfigurasi rangkaian LED yaitu
Common Anode (CA) artinya untuk menghidupkan LED pada Port B, port B harus
U1
VCC 1 40
2 PB0(XCK/T0) PA0(ADC0) 39
3 PB1(T1) PA1(ADC1) 38
4 PB2(INT2/AIN0) PA2(ADC2) 37
5 PB3(OC0/AIN1) PA3(ADC3) 36
R1 6 PB4(SS) PA4(ADC4) 35
7 PB5(MOSI) PA5(ADC5) 34
8 PB6[MISO) PA6(ADC6) 33
9 PB7[SCK) PA7(ADC7) 32
C1 22pF RST VCC 10 RESET AREF 31 VCC
VCC AGND
1
11 30 VCC
C3 100nF 12 GND AVCC 29 PC0 2 1
SW1 13 XTAL2 PC7(TOSC2) 28 PC1 2 1
X1 14 XTAL1 PC6(TOSC1) 27 PC2 2 1
15 PD0(RXD) PC5 26 PC3 2 1
16 PD1(TXD) PC4 25 PC4 2 1
2
mikrokontroller, maka sekarang saatnya Anda membuat program yang digunakan untuk
//-------------------------------------------------------
//Program LED Menyala
//-------------------------------------------------------
#include <mega8535.h>
1
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
#include <delay.h>
void main(void)
{
char a; a=0x000;
DDRC=0xFF;
while(1)
{
PORTC = a;
}
}
Pada program Program LED Menyala, di perlukan deklarasi register dan delay untuk
akan masuk ke dalam program utama. Di dalam program utama, terdapat variabel
karakter yang berfungsi untuk menyimpan data angka 0x000. Data 0x00 digunakan
untuk menyalakan LED karena LED di pasang common anoda Data tersebut akan di
dalam variabel a yang dideklarasikan sebagai char. Data tersebut dikeluarkan dengan
mikrokontroller akan mengeluarkan data yang di simpan oleh variabel karakter secara
terus menerus.
sekarang saatnya Anda membuat program kedua yang digunakan untuk menghidupkan
LED berkedip.
2
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
//-------------------------------------------------------
//Program Bab 3.2. LED Berkedip
//-------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
void main(void)
{
char a; char b;
a=0x000; b=0x0FF;
DDRB=0xFF;
while(1)
{
PORTB= a;
delay_ms(500);
PORTB= b;
delay_ms(500);
}
}
untuk menyimpan data 00 dan FF. Data tersebut akan di keluarkan oleh mikrokontroller
maka sekarang saatnya Anda membuat program ketiga yang digunakan untuk
//-------------------------------------------------------
//Program Bab 3.3. LED Flip-Flop
3
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
//-------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
void main(void)
{
char a; char b;
a=0x00f; b=0x0f0;
DDRB=0xFF;
while(1)
{
PORTB= a;
delay_ms(500);
PORTB= b;
delay_ms(500);
}
}
akan mendeklarasikan waktu 1 sekon. Waktu tersebut berfungsi untuk waktu tunda.
menyimpan data 0x00F dan 0x0F0. Data tersebut akan di keluarkan oleh
maka sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan
LED berjalan kanan. Program LED berjalan kekanan ini dijalankan pada hardware
nyala led berlogika tinggi atau logika 1. jika menggunakan logika rendah maka LED
bukan menyala tetapi akan mati. Program LED berjalan kekanan menggunakan operasi
4
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
geser kanan. Operasi geser kiri akan menggeser bit-bit kekanan sehingga bit 0 akan
//------------------------------------------------------
//Program Bab 3.4. LED Berjalan Kekanan
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
void main(void)
{
volatile unsigned char a=0x01;
DDRB=0xFF;
while(1)
{
a=((a>>7) | (a<<1));
delay_ms(1000);
PORTB=a;
}
}
program utama, terdapat variabel karakter yang berfungsi untuk menyimpan data 0x01.
kemudian mikrokontroller menjalankan operasi geser kanan. Diantara operasi geser kiri
dan mengeluarkan data di PORTB tersebut terdapat waktu tunda kurang lebih 1 sekon.
Didalam program utama terdapat pernyataan while(1). Pernyataan itu berfungsi untuk
5
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
kekanan, maka sekarang saatnya Anda membuat program yang digunakan untuk
operasi geser kiri. Operasi geser kiri akan menggeser bit-bit kekanan sehingga bit 7
akan berpindah ke bit 6 dan bit 6 akan berpindah ke bit 5 dan seterusnya.
//------------------------------------------------------
//Program Bab 3.5. LED berjalan ke kiri
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
void main(void)
{
volatile unsigned char a=0x01;
DDRB=0xFF;
while(1)
{
a=((a<<7) | (a>>1));
delay_ms(500);
PORTB=a;
}
}
program utama, terdapat variabel karakter yang berfungsi untuk menyimpan data 0x01.
kemudian mikrokontroller menjalankan operasi geser kekiri. Diantara operasi geser kiri
6
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
dan mengeluarkan data di PORTB tersebut terdapat waktu tunda kurang lebih 1 sekon.
Didalam program utama terdapat pernyataan while(1). Pernyataan itu berfungsi untuk
menyala kekiri, maka sekarang saatnya Anda membuat program ketuga yang digunakan
untuk menghidupkan LED bolak balik. Program LED bolak balik menggunakan operasi
//------------------------------------------------------
//Program Bab 3.6. LED ping-pong
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
void jalankiri(unsigned int n)
{
unsigned char i=0, a=0x01;
DDRB=0xFF;
PORTB = 0;
while(n)
{
for(i=0;i<7;i++)
{
a=((a>>7) | (a<<1));
delay_ms(100);
PORTB=a;
}
n--;
}
}
void jalankanan(unsigned int n)
{
unsigned char i=0, a=0x80;
DDRB=0xFF;
PORTB = 0;
while(n)
{
7
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
for(i=0;i<7;i++)
{
a=((a<<7) | (a>>1));
delay_ms(100);
PORTB=a;
}
n--;
}
}
void main(void)
{
while(1)
{
iswanto:
jalankiri(1);
jalankanan(1);
goto iswanto;
}
}
Pada program menyalakan LED dari kiri ke kanan di perlukan deklarasi register
program akan mendeklarasikan waktu kurang lebih 1 sekon. Waktu tersebut berfungsi
program utama, terdapat variabel karakter yang berfungsi untuk menyimpan data 0x01.
kemudian mikrokontroller menjalankan operasi geser kanan. Diantara operasi geser kiri
dan mengeluarkan data di port 0 tersebut terdapat waktu tunda kurang lebih 1 sekon.
Didalam program utama terdapat pernyataan while(1). Pernyataan itu berfungsi untuk
8
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB II
APLIKASI INPUT
2.1. PENDAHULUAN
Agar tombol tersebut dapat memberi input pada mikrokontroller, maka terlebih
dahulu tombol ini harus disusun dalam sebuah rangkaian di mana terdapat perbedaan
kondisi pada pin-pinnya antara kondisi tidak ada penekanan tombol, penekanan tombol
1, 2, 3 dan seterusnya. Kondisi tidak adanya penekanan tombol diatur dengan adanya
Pada saat tombol tidak ditekan, maka arus akan mengalir dari VCC melalui
PORT
Sedangkan saat tombol ditekan, maka baris dan kolom akan terhubung ke ground
sehingga kondisi pada baris dan kolom tersebut akan menjadi low.
penekanan tombol yang terhubung pada port keluaran mikrokontroller yang hasilnya
10
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
VCC
U4
1 40 2 1
VCC 2 PB0(XCK/T0) PA0(ADC0) 39 2 1
3 PB1(T1) PA1(ADC1) 38 2 1
4 PB2(INT2/AIN0) PA2(ADC2) 37 2 1
5 PB3(OC0/AIN1) PA3(ADC3) 36 2 1
6 PB4(SS) PA4(ADC4) 35 2 1
R1 7 PB5(MOSI) PA5(ADC5) 34 2 1
8 PB6[MISO) PA6(ADC6) 33 2 1
9 PB7[SCK) PA7(ADC7) 32
VCC 10 RESET AREF 31
C1 22pF 11 VCC AGND 30
GND AVCC VCC
1
12 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28
SW2 14 XTAL1 PC6(TOSC1) 27
X1 15 PD0(RXD) PC5 26
16 PD1(TXD) PC4 25
17 PD2(INT0) PC3 24
2
//-------------------------------------------------------
//Program Program pembacaan 8 buah tombol
//-------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
void main(void)
{
DDRC=0x00;
DDRB=0xFF;
while(1)
{
PORTB = PINC;
}
}
akan masuk ke dalam program utama. Di dalam program utama, mikrokontroller akan
11
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
membaca PORT C. Data dari PORT C akan dimasukan ke dalam variabel, Kemudian
data yang ada di variabel tersebut akan dikeluarakan pada PORT B oleh
tombol tunggal.
//-------------------------------------------------------
//Program membaca 1 tombol
//-------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
void jalankiri()
{
char i;
volatile unsigned char dataLED=0x80;
DDRB=0xFF;
PORTB = 0;
for(i=0; i<8;i++)
{
dataLED= ((dataLED<<1) | (dataLED >>7));
PORTB=dataLED;
delay_ms(100);
}
}
void jalankanan()
{
char i;
volatile unsigned char dataLED=0x01;
DDRB=0xFF;
PORTB = 0;
for(i=0; i<8;i++)
{
dataLED= ((dataLED<<7) | (dataLED >>1));
PORTB=dataLED;
12
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
delay_ms(100);
}
}
void main(void)
{
DDRC=0x00;
while(1)
{
if (PINC.0==1)
{
jalankanan();
}
else
{
jalankiri();
}
}
}
PORT C.0. Kemudian data tersebut akan dibandingkan untuk mengeluarakan data pada
PORT B oleh mikrokontroller. Jika PORT C.0 berlogika rendah maka led pada PORT B
akan bergeser ke kiri, jika port PORT C.0 berlogika rendah maka led pada PORT B
akan bergeser ke kanan. Kemudian memanggil tunda 1 sekon Didalam program utama
13
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB III
TIMER DAN COUNTER
3.1. PENDAHULUAN
Timer dan Counter merupakan sarana input yang kurang dapat perhatian
pemakai mikrokontroler, dengan sarana input ini mikrokontroler dengan mudah bisa
dipakai untuk mengukur lebar pulsa, membangkitkan pulsa dengan lebar yang pasti.
Rangkaian minimum untuk counter melalui Port B.0 ditunjukan pada Gambar
3.1. Rangkaian tersebut menggunakan penampil led. Konfigurasi rangkaian LED yaitu
Common Anode (CA) artinya untuk menghidupkan LED pada Port D, port D harus
HEADER 5
VCC P5
1 P6
2 P7
3 RST
4 GND
5
JISP U4
P0 1 40
VCC P1 2 PB0(XCK/T0) PA0(ADC0) 39
P2 3 PB1(T1) PA1(ADC1) 38
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36
P5 6 PB4(SS) PA4(ADC4) 35
R1 P6 7 PB5(MOSI) PA5(ADC5) 34
P7 8 PB6[MISO) PA6(ADC6) 33
RST 9 PB7[SCK) PA7(ADC7) 32
10 RESET AREF 31
C1 22pF VCC 11 VCC AGND 30
GND AVCC VCC
1
12 29
C3 100nF1 L1 13 XTAL2 PC7(TOSC2) 28
SW2 1 2 14 XTAL1 PC6(TOSC1) 27
X1 1 2 15 PD0(RXD) PC5 26
1 2 16 PD1(TXD) PC4 25
1 2 17 PD2(INT0) PC3 24
2
10
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
sekarang saatnya Anda membuat program yang digunakan untuk mencacah. Program
//------------------------------------------------------
// Program MENCACAH COUNTER TIMER 0
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
unsigned char led,a;
void InisialisasiTIMER ();
void main (void)
{
DDRD = 0xff;
led=0x00;
InisialisasiTIMER();
while(1)
{
a = TCNT0;
if (a == 0x06)
{
led = PIND;
PORTD=~led;
TCNT0=0x00;
}
}
}
void InisialisasiTIMER ()
{
TCNT0=0x00;
TCCR0=0x07;
}
mematikan led dengan menekan satu tombol sebanyak 6x. Program ini, di perlukan
11
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
mendeklarasikan timer sebagai counter maka register TCCR0 diisi dengan nilai 0x07.
Tcnt0 = 0.Untuk menghapus isi dari register timer 0 maka register TCNT0 di beri
nilai 0x00
masukan kedalam variabel. Nilai cacahan yang terdapat di dalam variabel tersebut akan
dibandingkan, pada saat nilai cacahan = 6 maka led akan menyala dan jika tombol di
tekan lagi sebanyak 6x maka led akan mati. Didalam program utama terdapat
pernyataan while(1). Pernyataan itu berfungsi untuk melakukan Looping secara terus
menerus.
sekarang saatnya Anda membuat program yang digunakan untuk mencacah. Program
//------------------------------------------------------
// Program MENCACAH TIMER T0
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
unsigned char led=0;
char a;
void InisialisasiTIMER ();
void main (void)
{
DDRB=0x00;
12
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
DDRD=0xFF;
PORTD=led;
InisialisasiTIMER();
led = 0x01;
while(1)
{
if (led == 0x80)
{
led = 0x01;
}
a = TCNT0;
if (a == 0xFE)
{
PORTD=led;
TCNT0=0x00;
led=led <<1;
}
}
}
void InisialisasiTIMER ()
{
TCNT0=0x00;
TCCR0=0x05;
}
akan mendeklasrasikan timer sebagai counter. Program utama ini digunakan untuk
menghitung banyaknya cacahan timer. Nilai dari cacahan tersebut akan di simpan di
register TCNT0. Saat TCNT0 sama dengan 0xFE maka led yang di pasang pada PORT
D akan bergeser satu digit. Dan sampai pada digit ke 8 maka data led akan
13
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Rangkaian minimum untuk counter melalui Port B.1 ditunjukan pada Gambar
4.2. Rangkaian tersebut menggunakan penampil led. Konfigurasi rangkaian LED yaitu
Common Anode (CA) artinya untuk menghidupkan LED pada Port D, port D harus
HEADER 5
P5
1 P6
VCC 2 P7
3 RST
4 GND
5
JISP U4
P0 1 40
VCC P1 2 PB0(XCK/T0) PA0(ADC0) 39
P2 3 PB1(T1) PA1(ADC1) 38
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36
P5 6 PB4(SS) PA4(ADC4) 35
R1 P6 7 PB5(MOSI) PA5(ADC5) 34
P7 8 PB6[MISO) PA6(ADC6) 33
RST 9 PB7[SCK) PA7(ADC7) 32
10 RESET AREF 31
C1 22pF VCC 11 VCC AGND 30
GND AVCC VCC
1
12 29
C3 100nF1 L1 13 XTAL2 PC7(TOSC2) 28
SW2 1 2 14 XTAL1 PC6(TOSC1) 27
X1 1 2 15 PD0(RXD) PC5 26
1 2 16 PD1(TXD) PC4 25
1 2 17 PD2(INT0) PC3 24
2
sekarang saatnya Anda membuat program yang digunakan untuk mencacah. Program
//------------------------------------------------------
// Program MENCACAH COUNTER TIMER 1
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
14
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
mematikan led dengan menekan satu tombol sebanyak 6x. Program ini, di perlukan
mendeklarasikan timer sebagai counter maka register TCCR1 diisi dengan nilai 0x07.
Tcnt1 = 0.Untuk menghapus isi dari register timer 0 maka register TCNT1 di beri nilai
0x00
15
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
masukan kedalam variabel. Nilai cacahan yang terdapat di dalam variabel tersebut akan
dibandingkan, pada saat nilai cacahan = 6 maka led akan menyala dan jika tombol di
tekan lagi sebanyak 6x maka led akan mati. Didalam program utama terdapat
pernyataan while(1). Pernyataan itu berfungsi untuk melakukan Looping secara terus
menerus.
sekarang saatnya Anda membuat program yang digunakan untuk mencacah. Program
//------------------------------------------------------
// Program MENCACAH TIMER T0
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
unsigned char led=0;
char a;
void InisialisasiTIMER ();
void main (void)
{
DDRB=0x00;
DDRD=0xFF;
PORTD=led;
InisialisasiTIMER();
led = 0x01;
while(1)
{
if (led == 0x80)
{
led = 0x01;
}
a = TCNT1L + TCNT1H;
if (a == 0xFE)
{
PORTD=led;
16
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
TCNT1L=0x00;
TCNT1H=0x00;
led=led <<1;
}
}
}
void InisialisasiTIMER ()
{
TCNT1L=0x00;
TCNT1H=0x00;
TCCR1A=0x00;
TCCR1B=0x05;
}
akan mendeklasrasikan timer sebagai counter. Program utama ini digunakan untuk
menghitung banyaknya cacahan timer. Nilai dari cacahan tersebut akan di simpan di
register TCNT1L dan TCNT1H.. Saat TCNT1L + TCNT1H sama dengan 0xFE maka
led yang di pasang pada PORT D akan bergeser satu digit. Dan sampai pada digit ke 8
17
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB IV
PORT SERIAL
4.1. SERIAL PADA ATMEGA8535
suatu alat komunikasi serial sangat fleksibel. Jenis yang utama adalah :
Operasi full duplex ( register penerima dan pengirim serial dapat berdiri sendiri )
Dukung frames serial dengan 5, 6, 7, 8 atau 9 Data bit dan 1 atau 2 Stop bit
Tahap odd atau even parity dan parity check didukung oleh hardware
complete.
31
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
melakukan inisialisasi ulang dengan mengubah boud rate atau frame format, untuk
meyakinkan bahwa tidak ada transmisi berkelanjutan sepanjang peiode register yang
diubah.
Flag TXC dapat digunakan untuk mengecek bahwa pemancar telah melengkapi
semua pengiriman, dan flag RXC dapat digunakan untuk mengecek bahwa tidak ada
data yang tidak terbaca pada buffer penerima. Tercatat bahwa flag TXC harus
dibersihkan sebelum tiap transmisi ( sebelum UDR ditulisi ) jika itu semua digunakan
untuk tujuan tersebut. USART sederhana inisialisasi kode contoh berikut menunjukan
fungsi satu assembly dan satu C itu mempunyai kesamaan dalam kemampuan. Pada
tidak ada interrupt enable ) frame format yang tetap. Boud rate diberikan sebagai
fungsi parameter.
Untuk kode assembly, parameter boud rate diasumsikan untuk di simpan pada
register r16, r17. Ketika menulis fungsi pada register UCSRC, bit URSEL (MSB)
harus diset dalam kaitan dengan pembagian penempatan I/O oleh UBRRH dan
UCSRC. Lebih mengedepankan inisialisasi rutin dapat dibuat seperti itu meliputi
frame format sebagai parameter, disable interrupt dan lain-lain. Bagai manapun juga
banyak aplikasi menggunakan seting tetap boud dan register control, dan untuk
aplikasi jenis ini dapat ditempatkan secara langsung pada keseluruhan routine, atau
32
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Proses pengiriman data serial dilakukan per byte data dengan menunggu register
UDR yang merupakan tempat data serial akan disimpan menjadi kosong sehingga siap
ditulis dengan data yang baru. Proses ini menggunakan bit yang ada pada register
UCSRA, yaitu bit UDRE (USART Data Register Empty). Bit UDRE merupakan
indikator kondisi register UDR. Jika UDRE bernilai 1 maka register UDR telah kosong.
Proses penerimaan data serial diakukan dengan mengecek nilai bit RXC (USART
Receive Complete) pada register UCSRA. RXC akan bernilai satu jika ada data yang
siap dibaca di buffer penerima, dan bernilai nol jika tidak ada data pada buffer
penerima. Jika penerima USART dinonaktifkan maka bit ini akan selalu bernilai nol.
Rangkaian tersebut, sebagai konverter dari serial ke pararel. Berikut adalah rangkaian
serial led driver yang akan kita hubungkan pada port serial. Rangkaian Led Driver
dengan menggunakan IC RS232 Rangkaian Serial LED Driver ini akan mendeteksi
33
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
VCC
HEADER 5 U4 L1
P0 1 40 DATA0 2 1
VCC P5 P1 2 PB0(XCK/T0) PA0(ADC0) 39 DATA1 2 1
1 P6 P2 3 PB1(T1) PA1(ADC1) 38 DATA2 2 1
2 P7 P3 4 PB2(INT2/AIN0) PA2(ADC2) 37 DATA3 2 1
3 RST P4 5 PB3(OC0/AIN1) PA3(ADC3) 36 DATA4 2 1
4 GND P5 6 PB4(SS) PA4(ADC4) 35 DATA5 2 1
R1 5 P6 7 PB5(MOSI) PA5(ADC5) 34 DATA6 2 1
P7 8 PB6[MISO) PA6(ADC6) 33 DATA7 2 1
JISP PB7[SCK) PA7(ADC7)
RST 9 32
VCC 10 RESET AREF 31
C1 22pF 11 VCC AGND 30
GND AVCC VCC
1
12 29 ADD8
C3 100nF1 13 XTAL2 PC7(TOSC2) 28 ADD9
SW2 PD0 14 XTAL1 PC6(TOSC1) 27 ADD10
X1 PD1 15 PD0(RXD) PC5 26 ADD11
PD2 16 PD1(TXD) PC4 25 ADD12
PD3 17 PD2(INT0) PC3 24 ADD13
2
HEADER 3 U6
8 11
RX1 13 R2IN T1IN 12
1 7 R1IN R1OUT 10
2 TX1 14 T2OUT T2IN 9
3 T1OUT R2OUT
JSerial1 1uF 16V
1 4 1uF 16V
C+ C2+
+ C4 + C5
3 5
C1- C2-
1uF 16V 2 6 1uF 16V
V+ V- C9
+ C8 MAX232
+
komputer, maka sekarang saatnya Anda membuat program yang digunakan untuk
//-------------------------------------------------------
//Program MENGIRIM DATA SERIAL PORT
//-------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
unsigned char data_terima = 0x00;
const long int osilator = 12000000;
unsigned long int UBRR;
void InisialisasiUSART (unsigned long int baud_rate);
void main(void)
34
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
{
DDRC = 0xFF;
PORTC = 0x00;
InisialisasiUSART(9600);
putsf("Selamat Datang Mas Iswanto"); putchar(13);
}
void InisialisasiUSART (unsigned long int baud_rate)
{
UBRR = (osilator/(16*baud_rate))-1;
UBRRL = UBRR;
UBRRH = UBRR>>8;
UCSRB = 0x18;
UCSRC = 0x86;
}
akan menginisialisasi port serial mikrokontroller dan boudrate. Kemudian program akan
mengeluarkan data Selamat Datang Mas Iswanto. Data tersebut akan di keluarkan oleh
mikrokontroller dengan menggunakan port serial dan akan di terima oleh komputer
Setelah membuat dan menjalankan program mengirim data serial, maka sekarang
saatnya Anda membuat program kedua yang digunakan untuk program mengirim dan
//-------------------------------------------------------
//Program MENGIRIM DAN MENERIMA DATA
//-------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
35
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
#include <stdio.h>
unsigned char data_terima = 0x00;
const long int osilator = 12000000;
unsigned long int UBRR;
void InisialisasiUSART (unsigned long int baud_rate);
void main(void)
{
DDRC = 0xFF;
PORTC = 0x00;
InisialisasiUSART(9600);
putsf("Selamat Datang Mas Iswanto"); putchar(13);
while(1)
{
putsf("Tekan sembarang tombol"); putchar(13);
data_terima = getchar();
delay_ms(100);
putsf("Anda menekan tombol ");
putchar(data_terima);; putchar(13);
}
}
void InisialisasiUSART (unsigned long int baud_rate)
{
UBRR = (osilator/(16*baud_rate))-1;
UBRRL = UBRR;
UBRRH = UBRR>>8;
UCSRB = 0x18;
UCSRC = 0x86;
}
Pada program mengirim dan menerima data serial, di perlukan deklarasi register
program akan menginisialisasi port serial mikrokontroller. Selain itu diperlukan fungsi
untuk mengirim karakter dan menerima karakter. Kemudian program akan masuk ke
program utama. Di dalam program utama, program ini akan mengirimkan teks
Selamat Datang Mas Iswanto dan mengirim karakter enter dengan kode
36
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
mengirimkan data penekanan tombol tersebut ke port serial dengan kecepatan transfer
data serial, maka sekarang saatnya Anda membuat program ketiga yang digunakan
//-------------------------------------------------------
//Program MENJALANKAN LED DENGAN KOMPUTER
//-------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
unsigned char data_terima = 0x00;
const long int osilator = 12000000;
unsigned long int UBRR;
char a,b;
void InisialisasiUSART (unsigned long int baud_rate);
void geser_kiri();
void geser_kanan();
void kedip();
void main(void)
{
DDRB = 0xFF;
PORTB = 0x00;
InisialisasiUSART(9600);
putsf("Selamat Datang Mas Iswanto"); putchar(13);
while(1)
{
putsf("Pilih Tombol Berikut ini"); putchar(13);
putsf("1. Geser Kiri Led"); putchar(13);
putsf("2. Geser Kanan Led"); putchar(13);
putsf("3. Led Berkedip"); putchar(13);
data_terima = getchar();
if(data_terima=='1')
{
geser_kiri();
}
if(data_terima=='2')
37
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
{
geser_kanan();
}
if(data_terima=='3')
{
kedip();
}
}
}
void InisialisasiUSART (unsigned long int baud_rate)
{
UBRR = (osilator/(16*baud_rate))-1;
UBRRL = UBRR;
UBRRH = UBRR>>8;
UCSRB = 0x18;
UCSRC = 0x86;
}
void geser_kiri()
{
volatile unsigned char a=0x01;
putsf("1. Geser Kiri Led"); putchar(13);
for(b=0;b<=7;b++)
{
a=((a>>7) | (a<<1));
delay_ms(100);
PORTB=a;
}
PORTB= 0x00;
}
void geser_kanan()
{
volatile unsigned char a=0x01;
putsf("2. Geser Kanan Led"); putchar(13);
for(b=0;b<=7;b++)
{
a=((a<<7) | (a>>1));
delay_ms(100);
PORTB=a;
}
PORTB= 0x00;
}
void kedip()
{
putsf("3. Led Berkedip"); putchar(13);
for(b=0;b<=7;b++)
{
PORTB= 0x00;
delay_ms(50);
PORTB= 0xFF;
38
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
delay_ms(50);
}
PORTB= 0x00;
}
Pada program mengirim dan menerima data serial, di perlukan deklarasi register
program akan menginisialisasi port serial mikrokontroller. Selain itu diperlukan fungsi
untuk mengirim karakter dan menerima karakter. Kemudian program akan masuk ke
program utama. Di dalam program utama, program ini akan mengirimkan teks
Selamat Datang Mas Iswanto dan mengirim karakter enter dengan kode
karakter 13 ke port serial. Kemudian mikro akan mengeluarkan teks untuk penekanan
tombol. Jika data angka 1 maka led brgeser ke kiri, jika data angka 2 maka led brgeser
39
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB V
INTERUPSI
MIKROKONTROLLER
5.1. PENDAHULUAN
berhenti sejenak untuk melayani interupsi tersebut. Program yang dijalankan pada saat
menjalankan program yang berada pada alamat yang ditunjuk oleh vektor dari interupsi
yang terjadi hingga selesai dan kembali meneruskan program yang terhenti oleh
interupsi tadi.
Pengetahuan mengenai interupsi tidak cukup hanya dibahas secara teori saja,
buah sumber interupsi. Interupsi tersebut bekerja jika bit I pada Register status atau
40
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
VCC VCC
U4 L1
VCC
INT2 P0
P1
1
2 PB0(XCK/T0) PA0(ADC0)
40
39
2
2
1
1
P2 3 PB1(T1) PA1(ADC1) 38 2 1
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37 2 1
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36 2 1
P5 6 PB4(SS) PA4(ADC4) 35 2 1
R1 P6 7 PB5(MOSI) PA5(ADC5) 34 2 1
P7 8 PB6[MISO) PA6(ADC6) 33 2 1
RST 9 PB7[SCK) PA7(ADC7) 32
10 RESET AREF 31
C1 22pF VCC 11 VCC AGND 30
GND AVCC VCC
1
12 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28
SW2 14 XTAL1 PC6(TOSC1) 27
X1 15 PD0(RXD) PC5 26
16 PD1(TXD) PC4 25
17 PD2(INT0) PC3 24
2
HEADER 5
INT1 INT0 P5
1 P6
2 P7
3 RST
4 GND
5
JISP
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
//------------------------------------------------------
//Program rutin interupsi eksternal 0
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
unsigned char dt=0x01;
void InisialisasiINT0();
void main (void)
{
DDRA=0xff; InisialisasiINT0();
#asm ("sei");
while(1)
41
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
{
PORTA=dt;
delay_ms(100);
dt=dt<<1;
if (dt==0) {dt=0x01;}
}
}
interrupt [EXT_INT0] void ext_int0_isr(void)
{
unsigned char rr=0;
while (rr<5)
{
PORTA=0x0f;
delay_ms(5);
PORTA=0xf0;
delay_ms(5);
++rr;
}
}
void InisialisasiINT0 ()
{
GICR|=0x80;
MCUCR=0x0C;
MCUCSR=0x00;
GIFR=0x80;
}
akan masuk ke dalam program utama. Program ini akan menginisialisasi interupsi
eksternal mikrokontroller mengeluarkan data 0x01 pada port A. Kemudian data tersebut
di geser ke kiri, sehingga led akan bergeser ke kanan. Saat terjadi interupsi maka
42
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Setelah membuat rangkaian interupsi ekternal int 1, maka sekarang saatnya Anda
//------------------------------------------------------
//Program rutin interupsi eksternal 1
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
unsigned char dt=0x01;
void InisialisasiINT1();
void main (void)
{
DDRA=0xff; InisialisasiINT1();
#asm ("sei");
while(1)
{
PORTA=dt; delay_ms(100);
dt=dt<<1;
if (dt==0) {dt=0x01;}
};
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
unsigned char rr=0;
while (rr<5) {
PORTA=0x0f;
delay_ms(5);
PORTA=0xf0;
delay_ms(5);
++rr;
}
}
void InisialisasiINT1()
{
GICR|=0x80;
MCUCR=0x0C;
MCUCSR=0x00;
GIFR=0x80;
}
43
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
akan masuk ke dalam program utama. Program ini akan menginisialisasi interupsi
eksternal mikrokontroller mengeluarkan data 0x01 pada port A. Kemudian data tersebut
di geser ke kiri, sehingga led akan bergeser ke kanan. Saat terjadi interupsi maka
HEADER 5 U4
P0 1 40
VCC P5 P1 2 PB0(XCK/T0) PA0(ADC0) 39
1 P6 P2 3 PB1(T1) PA1(ADC1) 38
2 P7 P3 4 PB2(INT2/AIN0) PA2(ADC2) 37
3 RST P4 5 PB3(OC0/AIN1) PA3(ADC3) 36
4 GND P5 6 PB4(SS) PA4(ADC4) 35
R1 5 P6 7 PB5(MOSI) PA5(ADC5) 34
P7 8 PB6[MISO) PA6(ADC6) 33
JISP PB7[SCK) PA7(ADC7)
RST 9 32
10 RESET AREF 31
C1 22pF VCC 11 VCC AGND 30
GND AVCC VCC
1
12 29
C3 100nF1 L1 13 XTAL2 PC7(TOSC2) 28
SW2 1 2 14 XTAL1 PC6(TOSC1) 27
X1 1 2 15 PD0(RXD) PC5 26
1 2 16 PD1(TXD) PC4 25
1 2 17 PD2(INT0) PC3 24
2
44
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
//------------------------------------------------------
// Program INTERUPSI TIMER 0
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
unsigned char led=0xfe;
void InisialisasiTIMER0();
void main (void)
{
DDRD=0xff; InisialisasiTIMER0();
#asm ("sei"); while(1);
}
interrupt [TIM0_OVF] void timer0_overflow(void)
{
TCNT0=0x00; led<<=1; led|=1;
if (led==0xff) led=0xfe; PORTD=led;
}
void InisialisasiTIMER0()
{
TCNT0=0x00; TCCR0=0x05;
TIMSK=0x01; TIFR=0x01;
}
akan masuk ke dalam program utama. Program ini akan menginisialisasi interupsi timer
45
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
//------------------------------------------------------
// Program INTERUPSI TIMER 1
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
unsigned char led=0xfe;
void InisialisasiTIMER1();
void main (void)
{
DDRD=0xff; InisialisasiTIMER1();
#asm ("sei"); while(1);
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1L=0x00; TCNT1H=0x00;
led<<=1;
led|=1; delay_ms(100);
if (led==0xff) led=0xfe;
PORTD=led;
}
void InisialisasiTIMER1()
{
TCNT1L=0x00; TCNT1H=0x00; TCCR1A=0x00;
TCCR1B=0x01; TIMSK=0x04; TIFR=0x04;
}
akan masuk ke dalam program utama. Program ini akan menginisialisasi interupsi timer
46
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
//------------------------------------------------------
// Program INTERUPSI TIMER 2
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
unsigned char led=0xfe;
void InisialisasiTIMER2();
void main (void)
{
DDRD=0xff; InisialisasiTIMER2();
#asm ("sei"); while(1);
}
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
TCNT2=0x00; led<<=1; led|=1; delay_ms(100);
if (led==0xff) led=0xfe; PORTD=led;
}
void InisialisasiTIMER2()
{
TCCR2=0x05; TCNT2=0x00; TIMSK=0x40; TIFR=0x40;
}
akan masuk ke dalam program utama. Program ini akan menginisialisasi interupsi timer
47
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
VCC
HEADER 5 U4 L1
P0 1 40 DATA0 2 1
VCC P5 P1 2 PB0(XCK/T0) PA0(ADC0) 39 DATA1 2 1
1 P6 P2 3 PB1(T1) PA1(ADC1) 38 DATA2 2 1
2 P7 P3 4 PB2(INT2/AIN0) PA2(ADC2) 37 DATA3 2 1
3 RST P4 5 PB3(OC0/AIN1) PA3(ADC3) 36 DATA4 2 1
4 GND P5 6 PB4(SS) PA4(ADC4) 35 DATA5 2 1
R1 5 P6 7 PB5(MOSI) PA5(ADC5) 34 DATA6 2 1
P7 8 PB6[MISO) PA6(ADC6) 33 DATA7 2 1
JISP PB7[SCK) PA7(ADC7)
RST 9 32
VCC 10 RESET AREF 31
C1 22pF 11 VCC AGND 30
GND AVCC VCC
1
12 29 ADD8
C3 100nF1 13 XTAL2 PC7(TOSC2) 28 ADD9
SW2 PD0 14 XTAL1 PC6(TOSC1) 27 ADD10
X1 PD1 15 PD0(RXD) PC5 26 ADD11
PD2 16 PD1(TXD) PC4 25 ADD12
PD3 17 PD2(INT0) PC3 24 ADD13
2
HEADER 3 U6
8 11
RX1 13 R2IN T1IN 12
1 7 R1IN R1OUT 10
2 TX1 14 T2OUT T2IN 9
3 T1OUT R2OUT
JSerial1 1uF 16V
1 4 1uF 16V
C+ C2+
+ C4 + C5
3 5
C1- C2-
1uF 16V 2 6 1uF 16V
V+ V- C9
+ C8 MAX232 +
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
48
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
//------------------------------------------------------
// Program INTERUPSI SERIAL
//------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
#define RXC 7
#define FE 4
#define UPE 2
#define OVR 3
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
unsigned char led=0xfe;
const long int osilator = 12000000;
unsigned long int UBRR;
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
bit rx_buffer_overflow;
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR |
DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
PORTA = data;
}
void InisialisasiUSART (unsigned long int baud_rate);
void main(void)
{
DDRA = 0xFF;
PORTA = 0x00;
49
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
InisialisasiUSART(9600);
putsf("Selamat Datang Mas Iswanto");
#asm("sei")
while (1)
{
led<<=1; led|=1; delay_ms(100);
if (led==0xff) led=0xfe; PORTA=led;
};
}
void InisialisasiUSART (unsigned long int baud_rate)
{
UBRR = (osilator/(16*baud_rate))-1;
UBRRL = UBRR;
UBRRH = UBRR>>8;
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
}
akan masuk ke dalam program utama. Program ini akan menginisialisasi interupsi serial
dan akan mengaktifkan serial. Sebelum interupsi mikrokontroller maka program akan
mengerjakanprogram geser led ke kanan. Dan jika terjadi interupsi maka PORT A akan
50
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB VI
LCD
6.1. PENDAHULUAN
Kemampuan dari LCD untuk menampilkan tidak hanya angka-angka, tetapi juga
huruf-huruf, kata-kata dan semua sarana simbol, lebih bagus dan serbaguna daripada
umum. Modul LCD mempunyai basic interface yang cukup baik, yang mana sesuai
dengan minimum system 8031. Sesuai juga dengan keluarga mikrokontroler yang lain.
Bentuk dan ukuran modul-modul berbasis karakter banyak ragamnya, salah satu variasi
bentuk dan ukuran yang tersedia dan dipergunakan pada peralatan ini adalah 16x 2
konsumsi daya yang rendah. Modul ini dilengkapi dengan mikrokontroler yang didisain
berfungsi sebagai pengendali LCD ini mempunyai CGROM (Character Generator Read
Only Memory), CGRAM (Character Generator Random Access Memory) dan DDRAM
51
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
memiliki 16 pin yang terdiri dari 8 jalur data, 3 jalur kontrol dan jalur-jalur catu daya:
1. Pin 1 dan 2
Merupakan sambungan catu daya, Vss, dan Vdd. Pin Vdd dihubungkan
dengan tegangan positif catu daya, dan Vss pada 0 volt atau ground.
2. Pin 3
display.
3. Pin 4
command control input. Dengan membuat RS menjadi high, data karakter dapat
52
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
4. Pin 5
5. Pin 6
Enable (E), input ini digunakan untuk transfer aktual dari perintah-
6. Pin 7 sampai 14
Pin 7 sampai 14 adalah delapan jalur data (D0 D7) dimana data dapat
7. Pin 15 dan 16
VCC
J16.
J5
1
1 pinb.5 VCC 2
2 pinb.6 U1 3
VCC 3 pinb.7 1 40 RS_LCD 5k RS_LCD 4
4 RST 2 PB0(XCK/T0) PA0(ADC0) 39 E_LCD R9 5
5 3 PB1(T1) PA1(ADC1) 38 E_LCD 6
4 PB2(INT2/AIN0) PA2(ADC2) 37 7
Rreset 5 PB3(OC0/AIN1) PA3(ADC3) 36 ADC4 8
pinb.5 6 PB4(SS) PA4(ADC4) 35 ADC5 9
HEADER 5 pinb.6 7 PB5(MOSI) PA5(ADC5) 34 ADC6 10
pinb.7 8 PB6[MISO) PA6(ADC6) 33 ADC7 ADC4 11
9 PB7[SCK) PA7(ADC7) 32 ADC5 12
C1 22pF RST VCC 10 RESET AREF 31 ADC6 13
VCC AGND
1
11 30 VCC ADC7 14
C3 100nF 12 GND AVCC 29 15
SW1 13 XTAL2 PC7(TOSC2) 28 16
X1 14 XTAL1 PC6(TOSC1) 27
C
15 PD0(RXD) PC5 26
16 PD1(TXD) PC4 25 D3
2
PD6(ICP) PD7(OC2)
ATMEGA16
53
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
program LCD.
//-------------------------------------------------------
//Program LCD
//-------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
#asm
.equ __lcd_port=0x18;PORTB
#endasm
#include <lcd.h>
void main(void)
{
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("Halo Iswanto");
delay_ms(100);
lcd_gotoxy(0,1);
lcd_putsf("T.ELEKTRO");
delay_ms(100);
lcd_gotoxy(5,0);
lcd_putsf("UMY ");
delay_ms(100);
while (1);
}
program utama. Program ini akan menginisialisasi LCD dan akan menampilkan
karakter dan tulisan di LCD. Tulisan pertama adalah Halo Iswanto yang akan
ditampilkan pada baris pertama, dan akan ditampilkan di baris kedua berupa tulisan D3
54
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
T.Elektro. Kemudian pada baris ke satu kolom ke lima tulisan iswanto akan diganti
tulisan UGM
55
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB VII
APLIKASI SEVEN SEGMEN
7.1. PENDAHULUAN
penampil seven segmen yang ditunjukkan pada gambar 4.1 (a). tujuh segmen tersebut
f b
e c
(a) (b)
Gambar 7.1. (a) Tampilan Fisik LED, (b) Skema dalam LED
Peraga seven segmen dapat dibuat dalam berbagai cara. Tiap tujuh segmen
tersebut dapat berupa filamen tipis yang berpijar. Jenis peraga ini disebut peraga pijar
(meandescent display), dan sama dengan bola lampu biasa. Peraga jenis lain adalah
LCD (liquid crystal display), peraga cairan, yang ,menghasilkan angka angka
berwarna kelabu atau puth perak. Dioda pemancar cahaya (LED, Light Emiting Dioda)
menghasilkan cahaya kemerah merahan. Pada peraga LED, LED membutuhkan arus
khusus sebesar 20 mA. Karena berupa dioda, LED sensitif terhadap polaritas. Katoda
51
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
(K) harus dihubung ke negatif (GND) dari catu daya dan Anoda (A) dihubung ke positif
dari catu daya. Seven segmen ini mempunyai 2 tipe yaitu common anoda dan common
katoda. Gambar 4.1(b) memperlihatkan catu daya yang dihubungkan ke seven segmen
common anoda.
penampil 7 segment secara langsung dari port keluaran mikrokontroller. Penampil seven
segment yang digunakan common anoda. Data yang digunakan untuk menghasilkan
angka atau huruf tertentu didapatkan dengan cara seperti pada Tabel 4.1
U4
P0 1 40
VCC P1 2 PB0(XCK/T0) PA0(ADC0) 39
P2 3 PB1(T1) PA1(ADC1) 38
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36
P5 6 PB4(SS) PA4(ADC4) 35
R1 P6 7 PB5(MOSI) PA5(ADC5) 34
P7 8 PB6[MISO) PA6(ADC6) 33
RST 9 PB7[SCK) PA7(ADC7) 32
VCC 10 RESET AREF 31
C1 22pF 11 VCC AGND 30 VCC
GND AVCC VCC
1
12 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28
SW2 PD0 14 XTAL1 PC6(TOSC1) 27
X1 PD1 15 PD0(RXD) PC5 26
6
PD2 16 PD1(TXD) PC4 25
PD3 17 PD2(INT0) PC3 24
2
HEADER 5
10
1
2
3
4
5
8
9
P5 PD0
1 P6 PD1
2 P7 PD2
3 RST PD3
4 GND PD4
5 PD5
JISP PD6
PD7
52
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
b7 b6 b5 b4 b3 b2 b1 b0 HEX
dp g f e d c b a DATA
0 1 1 0 0 0 0 0 0 COH
1 1 1 1 1 1 0 0 1 F9H
2 1 0 1 0 0 1 0 0 A4H
3 1 0 1 1 0 0 0 0 BOH
4 1 0 0 1 1 0 0 1 99H
5 1 0 0 1 0 0 1 0 92H
6 1 0 0 0 0 0 1 0 82H
7 1 1 1 1 1 0 0 0 F8H
8 1 0 0 0 0 0 0 0 80H
9 1 0 0 1 0 0 0 0 90H
Setelah rangkaian seven segment dibuat dan dihubungkan dengan port pararel
Segment 1. Program ini digunakan untuk menampilkan data 3 dan 2 secara bergantian.
//-------------------------------------------------------
// Program Sevent Segmen Tunggal
//-------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
void bin7seg(unsigned char data1)
{
switch(data1)
{
case 0 :
PORTD = 0xc0;
break;
case 1 :
PORTD = 0xf9;
break;
53
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
case 2 :
PORTD = 0xa4;
break;
case 3 :
PORTD = 0xb0;
break;
case 4 :
PORTD = 0x99;
break;
case 5 :
PORTD = 0x92;
break;
case 6 :
PORTD = 0x82;
break;
case 7 :
PORTD = 0xf8;
break;
case 8 :
PORTD = 0x80;
break;
case 9 :
PORTD = 0x90;
break;
}
}
void main(void)
{
DDRD=0xFF;
while(1)
{
bin7seg(0); delay_ms(100);
bin7seg(2); delay_ms(100);
}
}
akan masuk ke dalam program utama. Di dalam program utama, mikrokontroller akan
mengeluarkan data angka 0. Data tesebut di konversi BCD ke karakter 7-segment dan
54
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
memanggil tunda 100 mili sekon dan memangil data angka 2 Instruksi while
mikrokontroller dengan data input Seven Segment. 7-segment ini dikendalikan oleh
transistor bc337.
U4
DATA0 1 40 P0
VCC DATA1 2 PB0(XCK/T0) PA0(ADC0) 39 P1
DATA2 3 PB1(T1) PA1(ADC1) 38 P2
DATA3 4 PB2(INT2/AIN0) PA2(ADC2) 37 P3
5 PB3(OC0/AIN1) PA3(ADC3) 36 P4
6 PB4(SS) PA4(ADC4) 35 P5
R1 7 PB5(MOSI) PA5(ADC5) 34 P6
8 PB6[MISO) PA6(ADC6) 33 P7
RST 9 PB7[SCK) PA7(ADC7) 32
VCC 10 RESET AREF 31
11 VCC AGND 30
GND AVCC VCC
1
12 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28
SW2 14 XTAL1 PC6(TOSC1) 27
15 PD0(RXD) PC5 26
16 PD1(TXD) PC4 25
17 PD2(INT0) PC3 24
2
18 PD3(INT1) PC2 23
19 PD4(OC1B) PC1(SDA) 22
20 PD5(OC1A) PC0(SCL) 21
PD6(ICP) PD7(OC2)
ATMEGA32
VCC
1
DATA0 2 Q1
BC337
RT1 330
3
VCC
8
8
1
DATA1 2 Q2
BC337
RT2 330
3
VCC
1
DATA2 2 Q3
10
10
10
10
BC337
9
7
6
4
2
1
9
7
6
4
2
1
9
7
6
4
2
1
9
7
6
4
2
1
RT3 330
3
P0 P0 P0
VCC P1
P2
1
P3
DATA3 2 Q4 P4
BC337 P5
RT4 330 P6
55
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Setelah rangkaian sevent segment dibuat dan dihubungkan dengan port pararel
mikrokontroller, maka sekarang saatnya Anda membuat program yang digunakan untuk
//-------------------------------------------------------
//Program Sevent Segment Termultipleks
//-------------------------------------------------------
#include <mega8535.h>
#include <delay.h>
unsigned char data1;
void bin7seg()
{
switch(data1)
{
case 0 :
PORTD = 0xc0;
break;
case 1 :
PORTD = 0xf9;
break;
case 2 :
PORTD = 0xa4;
break;
case 3 :
PORTD = 0xb0;
break;
case 4 :
PORTD = 0x99;
break;
case 5 :
PORTD = 0x92;
break;
case 6 :
PORTD = 0x82;
break;
case 7 :
PORTD = 0xf8;
break;
case 8 :
PORTD = 0x80;
break;
case 9 :
56
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
PORTD = 0x90;
break;
}
}
void display(unsigned int x)
{
int digit1;
int digit2;
int digit3;
int digit4;
digit4=x/1000;
digit3=(x-digit4*1000)/100;
digit2=(x-digit4*1000-digit3*100)/10;
digit1=(x-digit4*1000-digit3*100-digit2*10);
PORTD=0x00;
data1=digit4;
bin7seg();
PORTD=0x10;
data1=digit4;
bin7seg();
PORTD=0x30;
data1=digit4;
bin7seg();
PORTD=0x70;
data1=digit4;
bin7seg();
}
void main(void)
{
DDRD=0xFF;
while(1)
{
display(1512); delay_ms(500);
display(4123); delay_ms(500);
}
}
maka program akan masuk ke dalam program utama. Di dalam program utama,
mikrokontroller akan mengeluarkan data angka 1512.. Data tersebut akan masuk
kedalam prosedure display untuk mengeluarakan data pada port 3 oleh mikrokontroller.
57
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Kemudian memanggil tunda 1 sekon dan memangil data angka 4123 Instruksi while
58
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB VIII
KEYPAD
8.1. PENDAHULUAN
Keypad 4x3 di sini adalah sebuah keypad matrix dengan susunan empat baris
Seperti terlihat dalam gambar di atas, apabila saklar 1 ditekan, maka baris 1
dan kolom 1 akan terhubung ke common. Apabila saklar 2 ditekan, maka baris 1 dan
58
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Agar keypad tersebut dapat memberian input pada B51PEB, maka terlebih
dahulu keypad ini harus disusun dalam sebuah rangkaian di mana terdapat perbedaan
kondisi pada pin-pinnya antara kondisi tidak ada penekanan tombol, penekanan tombol
1, 2, 3 dan seterusnya.
Kondisi tidak adanya penekanan tombol diatur dengan adanya kondisi logika
high dengan menghubungkan semua pin keypad (kecuali common) ke VCC melalui
resistor pull up. Pada saat tombol tidak ditekan, maka arus akan mengalir dari VCC
59
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Sedangkan saat tombol ditekan, maka baris dan kolom akan terhubung ke
ground sehingga kondisi pada baris dan kolom tersebut akan menjadi low. Apabila
tombol 1 ditekan, maka baris 1 dan kolom 1 akan terhubung ke ground sehingga
kondisi baris dan kolom tersebut akan berubah menjadi low, demikian pula pada tombol
Rangkaian tombol 4x4 adalah rangkaian untuk membaca tombol 4x4 dari port
keluaran mikrokontroller. Pada saat penekanan tombol key pad, data dari key pad akan
ditampilkan LCD.
60
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
VCC
J16.
1
J5 VCC 2
3
5k pinb.0 4
1 pinb.5 R9 pinb.1 5
2 pinb.6 pinb.2 6
3 pinb.7 7
4 RST 8
5 9
10
pinb.4 11
pinb.5 12
HEADER 5 pinb.6 13
U4 pinb.7 14
pinb.0 1 40 15
VCC pinb.1 2 PB0(XCK/T0) PA0(ADC0) 39 16
pinb.2 3 PB1(T1) PA1(ADC1) 38
C
4 PB2(INT2/AIN0) PA2(ADC2) 37
5 PB3(OC0/AIN1) PA3(ADC3) 36 D3
pinb.5 6 PB4(SS) PA4(ADC4) 35 HEADER 16
R1 pinb.6 7 PB5(MOSI) PA5(ADC5) 34 1N4002
pinb.7 8 PB6[MISO) PA6(ADC6) 33
PB7[SCK) PA7(ADC7) VCC
9 32
A
VCC 10 RESET AREF 31
C1 22pF 11 VCC AGND 30 VCC
1
12 GND AVCC 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28
SW2 PD0 14 XTAL1 PC6(TOSC1) 27
X1 PD1 15 PD0(RXD) PC5 26
PD2 16 PD1(TXD) PC4 25
PD3 17 PD2(INT0) PC3 24
2
S4 S8 S12 S16
SW SW SW SW
S5 S9 S13 S17
SW SW SW SW
PD0
PD1
PD2 SW SW SW SW
PD3
PD4
PD5 S7 S11 S15 S19
PD6
PD7
SW SW SW SW
Setelah rangkaian tombol 4x4 dibuat dan dihubungkan dengan port pararel
tombol. 4x4.
//------------------------------------------------------
//Program KEYPAD LCD
//------------------------------------------------------
61
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
#include <lcd.h>
#include <stdio.h>
#include <mega8535.h>
#include <delay.h>
#asm
.equ __lcd_port=0x18;PORTB
#endasm
unsigned char dt, dtkey;
char buf[33];
void inkey(void);
void main()
{
PORTD = 0XFF;
DDRD=0xF0;
lcd_init(16);
lcd_gotoxy(0,1);
lcd_putsf("Hello world");
while(1)
{
inkey();
lcd_gotoxy(0,1);
sprintf(buf,"hex %x ",dtkey);
lcd_puts(buf);
}
}
void inkey(void)
{
PORTD.4 = 0;
dt = (~PIND & 0x0F);
switch (dt)
{
case 1:dtkey = 0x01;
break;
case 2:dtkey = 0x05;
break;
case 4:dtkey = 0x09;
break;
case 8:dtkey = 0x13;
break;
}
PORTD.4 = 1;PORTD.5 = 0;
dt = (~PIND & 0x0F);
switch (dt)
{
case 1:dtkey = 0x02;
break;
case 2:dtkey = 0x06;
break;
case 4:dtkey = 0x10;
62
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
break;
case 8:dtkey = 0x14;
break;
}
PORTD.5 = 1;PORTD.6 = 0;
dt = (~PIND & 0x0F);
switch (dt)
{
case 1:dtkey = 0x03;
break;
case 2:dtkey = 0x07;
break;
case 4:dtkey = 0x11;
break;
case 8:dtkey = 0x15;
break;
}
PORTD.6 = 1;PORTD.7 = 0;
dt = (~PIND & 0x0F);
switch (dt)
{
case 1:dtkey = 0x04;
break;
case 2:dtkey = 0x08;
break;
case 4:dtkey = 0x12;
break;
case 8:dtkey = 0x16;
break;
}
PORTD.7 = 1;
}
dalam program utama. Di dalam program utama, mikrokontroller akan membaca data
keypad 4x4 sesuai dengan penekanan tombol. Data keypad akan di tampilkan melalui
LCD
63
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB IX
ANALOG TO DIGITAL
CONVERTER
MIKROKONTROLLER
9.1. PENDAHULUAN
Dalam dunia komputer, semua nilai tegangan dijadikan dalam bentuk digital,
dan menggunakan sistem bilangan biner. Untuk itu dalam sistem ini, karena output dari
sensor suhu berupa tegangan analog, maka diperlukan pengubah tegangan analog ke
digital. ADC (Analog to Digital Converter) adalah suatu piranti yang digunakan untuk
mengubah isyarat analog ke isyarat digital, rangkaian ini digunakan untuk mengubah
isyarat analog dari sensor ke bentuk digital yang nantinya masuk ke komputer.
internal dengan fidelitas 10 bit. Dalam mode operasinya, ADC ATMEGA8535 dapat
dikonfigurasi, baik sebagai single ended input maupun pewaktuan, tegangan referensi,
mode operasi, dan kemampuan filter derau yang amat fleksibel sehingga dapat dengan
64
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
format output data, dan mode pembacaan. Register yang perlu diset nilainya adalah
ADMUX (ADC Multiplexer Selection Register), ADCSRA (ADC Control and Status
Register A), dan SFIOR (special Function IO Register). ADMUX merupakan register 8
bit yang berfungsi menentukan tegangan referensi ADC, format data output, dan saluran
65
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
Memeiliki Nilai Awal 00 sehingga referensi tegangan berasal dari pin AREF. Detail
1 0 Tidak dipergunakan
b. ADLAR merupakan bit pemilih mode data keluaran ADC. Bernilai awal 0,
sehingga 2 bit tertinggi data hasil konversinya berada di register ADCH dan 8 bit
sisanya berada di register ADCL, seperti dalam tabel 9.3. Apabila bernilai 1, maka
66
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
c. MUX[4..0] merupakan bit pemilih saluran pembacaan ADC. Bernilai awal 00000.
Untuk mode single ended input, MUX[4..0] bernilai dari 00000 hingga 00111,
MUX4..0 Single Ended Input Pos Differential Input Neg Differential Input Gain
00000 ADC0
00001 ADC1
00010 ADC2
00011 ADC3
00100 ADC4 N/A
00101 ADC5
00110 ADC6
00111 ADC7
01000 ADC0 ADC0 10x
01001 ADC1 ADC0 10x
01010 ADC0 ADC0 200x
01011 ADC1 ADC0 200x
01100 ADC2 ADC2 10x
01101 ADC3 ADC2 10x
01110 ADC2 ADC2 200x
01111 ADC3 ADC2 200x
10000 ADC0 ADC1 1x
10001 ADC1 ADC1 1x
10010 N/A ADC2 ADC1 1x
10011 ADC3 ADC1 1x
10100 ADC4 ADC1 1x
10101 ADC5 ADC1 1x
10110 ADC6 ADC1 1x
10111 ADC7 ADC1 1x
11000 ADC0 ADC2 1x
11001 ADC1 ADC2 1x
11010 ADC2 ADC2 1x
11011 ADC3 ADC2 1x
11100 ADC4 ADC2 1x
67
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
kontrol dan status dari ADC. Memiliki susunan dalam tabel 9.5.
a. ADEN merupakan bit pengatur aktivasi ADC. Bernilai awal 0. Jika bernilai 1,
b. ADSC merupakan bit penanda mulainya konversi ADC. Bernilai awal 0 selama
konversi ADC akan bernilai 1, sedangkan jika konversi selesai, akan bernilai 0.
c. ADATE merupakan bit pengatur aktivasi picu otomatis operasi ADC. Bernilai
awal 0, jika bernilai1 maka konversi ADC akan dimulai pada saat transisi positif
dari sinyal picu yang diplih. Pemiliha sinyal picu menggunakan bit ADTS pada
register SFIOR.
d. ADIF merupakan bit penanda akhir suatu konversi ADC. Bernilai awal 0. Jika
bernilai 1, maka konversi ADC pada saluran telah selesai dan data siap diakses.
e. ADIE merupakan bit pengatur aktivasi interupsi yang berhubungan dengan akhir
konversi ADC. Bernilai awal 0. Jika berniali 1 dan jika konversi ADC telah
f. ADPS[2..0] merupakan bit pengatur clock ADC. Bernilai awal 000. Detail nilai
68
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
SFIOR merupakan register 8 bit pengatur sumber picu konversi ADC, apakah
dari picu eksternal atau dari picu internal. Susunannya dalam tabel 9.2.
berfungsi jika bit ADATE pada register ADCSRA bernilai 1. Bernilai awal 000
sehingga ADC bekerja pada mode free running dan tidak ada interupsi yang akan
dihasilkan. Detail nilai ADTS[2..0] dapat dilihat pada tabel 9.3 Untuk Operasi ADC, bit
69
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
bit ADIF (ADC Interupt Flag) pada register ADCSRA. ADIF akan benilai satu jika
konversi sebuah saluran ADC telah selesai dilakukan dan data hasil konversi siap untuk
diambil, dan demikian sebaliknya. Data disimpan dalam dua buah register, yaitu ADCH
dan ADCL.
pada Gambar 9.7 yang perlu diperhatikan adalah konfigurasi rangkaian LED yaitu
Common Anode (CA) artinya untuk menghidupkan LED pada Port D, port D harus
70
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
VCC
HEADER 5
3
P5
1 P6 R2
2 P7
3 RST 2 POT
4 GND
5
JISP U4
P0 1 40
1
VCC P1 2 PB0(XCK/T0) PA0(ADC0) 39
P2 3 PB1(T1) PA1(ADC1) 38
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36
P5 6 PB4(SS) PA4(ADC4) 35
R1 P6 7 PB5(MOSI) PA5(ADC5) 34
P7 8 PB6[MISO) PA6(ADC6) 33
RST 9 PB7[SCK) PA7(ADC7) 32
10 RESET AREF 31
C1 22pF VCC 11 VCC AGND 30
GND AVCC VCC
1
12 29
C3 100nF1 L1 13 XTAL2 PC7(TOSC2) 28
SW2 1 2 14 XTAL1 PC6(TOSC1) 27
X1 1 2 15 PD0(RXD) PC5 26
1 2 16 PD1(TXD) PC4 25
1 2 17 PD2(INT0) PC3 24
2
saatnya Anda membuat program yang digunakan untuk membaca ADC ATMEGA8535
dan menampilkan data ADC tersebut dengan menggunakan LED yang terhubung pada
//-------------------------------------------------------
//Program ADC LED
//-------------------------------------------------------
#include <mega8535.h>
#include <stdio.h>
#include <delay.h>
unsigned int data_adc;
int suhu;
#define ADC_VREF_TYPE 0x60
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
71
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
return ADCH;
}
void main(void)
{
DDRD = 0xFF;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x87;
SFIOR&=0xEF;
while (1)
{
data_adc=read_adc(0);
suhu=~data_adc;
PORTD = suhu;
}
}
dalam program utama. Program ini akan membaca adc 1 buah ATMEGA8535 yaitu adc
0 yang datanya akan ditampilkan dengan LED yang konfigurasi rangkaian LED yaitu
Sintac suhu=~data_adc merupakan ungkapan untuk membalik data adc, karena adc
akan dikeluarkan melalui LED yang konfigurasinya rangkaian LED yaitu Common
Anode (CA), sehingga data yang ditampilkan akan sama dengan nyalanya LED.
72
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
3
R11 R12 R14 R13 R16 R18 R15 R17
2 POT
2 POT
2 POT
2 POT
2 POT
2 POT
2 POT
2 POT
HEADER 5
P5
1
1 P6
2 P7
3 RST
4 GND
5
JISP U1
VCC P0 1 40
P1 2 PB0(XCK/T0) PA0(ADC0) 39
P2 3 PB1(T1) PA1(ADC1) 38
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36
R1 P5 6 PB4(SS) PA4(ADC4) 35
P6 7 PB5(MOSI) PA5(ADC5) 34
P7 8 PB6[MISO) PA6(ADC6) 33
9 PB7[SCK) PA7(ADC7) 32
C1 22pF RST VCC 10 RESET AREF 31 VCC
VCC AGND
1
11 30 VCC
GND AVCC J16.
C3 100nF 12 29
SW1 13 XTAL2 PC7(TOSC2) 28
X1 PD0 14 XTAL1 PC6(TOSC1) 27 1
PD1 15 PD0(RXD) PC5 26 2
PD1(TXD) PC4 VCC
PD2 16 25 3
2
D3
HEADER 16
1N4002
VCC
A
dengan LCD, maka sekarang saatnya Anda membuat program yang digunakan untuk
//-------------------------------------------------------
//Program ADC LCD
//-------------------------------------------------------
#include <mega8535.h>
#include <stdio.h>
#include <delay.h>
#include <math.h>
73
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
#include <stdlib.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
unsigned int data_adc;
int suhu,suhu_;
char strSuhu[4];
char stra1[4];
#define ADC_VREF_TYPE 0x60
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
void main(void)
{
int a1;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x87;
SFIOR&=0xEF;
lcd_init(16);
lcd_gotoxy(0,0);lcd_putsf("**ADC ATMEGA8535**");
lcd_gotoxy(0,1);lcd_putsf("CREATED BY 1512");
delay_ms(1000);
while (1)
{
for(a1=0;a1<8;a1++)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("ADC");
lcd_gotoxy(5,0);
itoa(a1,stra1);
lcd_puts(stra1);
data_adc=read_adc(a1);
suhu=data_adc;
itoa(suhu,strSuhu);
lcd_gotoxy(0,1);
lcd_puts(strSuhu);
delay_ms(500);
}
}
}
74
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
dalam program utama. Program ini akan membaca adc 8 buah ATMEGA8535 yang
75
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB X
PWM ATMEGA8535
10.1. PENDAHULUAN
motor, yaitu dengan cara mengatur lebar pulsa (waktu ON) dari tegangan sumbernya
(tegangan DC). Perbandingan antara waktu ON dan waktu OFF disebut duty cycle
(siklus kerja). Semakin besar siklus kerjanya, akan semakin besar pula keluaran yang
dihasilkan, sehingga kecepatan motor akan semakin besar. Pembangkitan sinyal PWM
terintegrasi dalam chip. Keluaran dari PWM tersebut terdapat pada pin 15 (OC1). Untuk
frekuensinya.
PWM yang akan dibahas adalah mode Fast PWM, karena dalam perancangan sistem
robot ini menggunakan mode Fast PWM. Pada mode Fast PWM, semakin besar nilai
OCR, maka akan semakin besar pula siklus kerja yang dihasilkan. Keluaran PWM akan
berlogika tinggi setelah nilai TOP tercapai sampai nilai OCR tercapai dan kemudian
76
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
akan berlogika rendah sampai nilai TOP tercapai kembali. Prinsip kerja dari Fast PWM
Keluaran
Gambar 10.1. Prinsip Kerja Mode Fast PWM
OCR
D= x100% ........................................10.1
1 + TOP
f clock
f PWM = ..........................................10.2
N (1 + TOP)
log(TOP + 1)
RPWM = .................................10.3
log 2
keterangan:
Rangkaian minimum untuk pwm melalui Port D.4 dan Port D.5 ditunjukan pada
Rangkaian driver tersebut akan di hubungkan dengan pin D.4 dan pin D.5.
77
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
JISP
1 RST
2 pinb.7
3 pinb.6
4 pinb.5
5
U1
1 40
5V 2 PB0(XCK/T0) PA0(ADC0) 39
3 PB1(T1) PA1(ADC1) 38
4 PB2(INT2/AIN0) PA2(ADC2) 37
5 PB3(OC0/AIN1) PA3(ADC3) 36
pinb.5 6 PB4(SS) PA4(ADC4) 35
R1 pinb.6 7 PB5(MOSI) PA5(ADC5) 34
pinb.7 8 PB6[MISO) PA6(ADC6) 33
RST 9 PB7[SCK) PA7(ADC7) 32
5V 10 RESET AREF 31
C1 22pF 11 VCC AGND 30
GND AVCC 5V
1
12 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28
SW2 14 XTAL1 PC6(TOSC1) 27
X1 15 PD0(RXD) PC5 26
16 PD1(TXD) PC4 25
17 PD2(INT0) PC3 24
2
12V2 MG2
1
D2
DIODE
MOTOR DC
2
TIP9013
470 TIP3055
MG2
1
12V2
D1
DIODE
MOTOR DC
2
TIP9013
470 TIP3055
sekarang saatnya Anda membuat program yang digunakan untuk mengatur putaran
motor dc.
78
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
//-------------------------------------------------------
//Program Bab 10.1. PWM
//-------------------------------------------------------
#include <stdio.h>
#include <mega8535.h>
#include <delay.h>
void InisialisasiPWM();
int data1;
int data2;
void main (void)
{
InisialisasiPWM();
while(1)
{
data1 = 50;
data2 = 1024;
OCR1A=data1;
OCR1B=data2;
TIFR=0;
}
}
void InisialisasiPWM()
{
DDRD=0xff;
TCCR1A=0xa3;
TCCR1B=0x0b;
TCNT1=0x0000;
}
dalam program utama. Program utama ini digunakan untuk mengendalikan putaran dua
buah motor dengan dua PWM. Dengan PWM 50 maka putaran motor tidak terlalu cepat
dan dengan PWM 1024 maka putaran motor akan sepat. Jadi untuk mendapatkan
putaran motor yang sangat cepat maka PWM yang digunakan sangat tinggi dan untuk
mendapatkan putaran sangat pelan maka PWM yang digunakan sangat rendah
79
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB XI
KOMPARATOR ATMEGA8535
11.1. PENDAHULUAN
Komparator analog merupakan salah satu fitur pada ATMEGA8535. Fitur ini
langsung membandingkan 2 input analog. Karena input analog adalah fungsi altenatif
dari PORT B (PORTB.2 dan PORTB.3) maka PORTB.2 dan PORTB.3 harus kita set
Tahap pertama adalah komparator membandingkan input analog 0(AIN0) dan input
analog 1 (ANI1)
Tahap kedua adalahdari output komparator analog tersebut menuju ke logika flag
interupsi (ACL)
80
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
VCC
3
R2
POT 2 HEADER 5
P5
1 P6
2 P7
1
3 RST
4 GND
VCC 5
JISP
3
U4
R11 P0 1 40
VCC P1 2 PB0(XCK/T0) PA0(ADC0) 39
POT 2 P2 3 PB1(T1) PA1(ADC1) 38
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36
P5 6 PB4(SS) PA4(ADC4) 35
R1 P6 7 PB5(MOSI) PA5(ADC5) 34
1
P7 8 PB6[MISO) PA6(ADC6) 33
RST 9 PB7[SCK) PA7(ADC7) 32
10 RESET AREF 31
C1 22pF VCC 11 VCC AGND 30
GND AVCC VCC
1
12 29
C3 100nF1 L1 13 XTAL2 PC7(TOSC2) 28
SW2 1 2 14 XTAL1 PC6(TOSC1) 27
X1 1 2 15 PD0(RXD) PC5 26
1 2 16 PD1(TXD) PC4 25
1 2 17 PD2(INT0) PC3 24
2
//-------------------------------------------------------
//Program KOMPARATOR
//-------------------------------------------------------
#include <stdio.h>
#include <mega8535.h>
#include <delay.h>
void InisialisasiCOMPARATOR ();
void main()
{
DDRD=0xFF;
InisialisasiCOMPARATOR();
81
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
#asm("sei")
while(1)
{
if (ACSR.5==0) {PORTD=0;}
else {PORTD=0xff;}
}
}
void InisialisasiCOMPARATOR ()
{
ACSR=0x20;
SFIOR=0x00;
}
program akan mendeklarasi port D sebagai output dan PORTB.0 dan PORTB.1 sebagai
komparator. Kemudian program masuk ke dalam program utama. Di dalam Program ini
komparator analog 0 lebih besar dari pada komparator 1 maka LED mati dan sebaliknya
jika komparator analog 1 lebih besar dari pada analog 0 maka LED menyala.
82
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
BAB XII
EEPROM
12.1. PENDAHULUAN
salah satu dari tiga tipe memori pada AVR (dua yang lain adalah memori flash dan
SRAM). EEPROM tetap dapat menyimpan data saat tidak di catu daya dan juga dapat
Untuk menulis dalam EEPROM, perlu ditentukan terlebih dahulu data apa yang
akan ditulis serta alamat untuk menulis data. Alamat yang akan ditulis dimasukan ke
dalam EEPROM Address Register (EEAR). Data akan diletakkan dalam EEPROM
- EEAR8 EEARH
7 6 5 4 3 2 1 0
MSB LSB
R/W R/W R/W R/W R/W R/W R/W R/W
7 6 5 4 3 2 1 0
EERIE EEMWE EEWE EERE
R/W R/W R/W R/W R/W R/W R/W R/W
83
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
HEADER 5
P5
1 P6
2 P7
3 RST
4 GND
5
JISP
U4
P0 1 40
VCC P1 2 PB0(XCK/T0) PA0(ADC0) 39
P2 3 PB1(T1) PA1(ADC1) 38
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36
P5 6 PB4(SS) PA4(ADC4) 35
R1 P6 7 PB5(MOSI) PA5(ADC5) 34
P7 8 PB6[MISO) PA6(ADC6) 33
RST 9 PB7[SCK) PA7(ADC7) 32
10 RESET AREF 31
C1 22pF VCC 11 VCC AGND 30
GND AVCC VCC
1
12 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28 VCC
SW2 14 XTAL1 PC6(TOSC1) 27
PD0(RXD) PC5 J16.
X1 15 26
16 PD1(TXD) PC4 25
17 PD2(INT0) PC3 24 1
2
D3
HEADER 16
1N4002
VCC
A
84
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
program yang digunakan untuk membaca arah dari compas dan ditampilkan di LCD.
//-------------------------------------------------------
//Program EEPROM
//-------------------------------------------------------
#include <mega8535.h>
#include <stdio.h>
#include <delay.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
char buf[33];
int alfa;
int eeprom *ptr_to_eeprom;
void main(void)
{
int i;
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("Data EEPROM alfa");
lcd_gotoxy(0,1);
sprintf(buf,"%x ",alfa);
lcd_puts(buf);
alfa=0x55;
lcd_gotoxy(6,1);
sprintf(buf,"%x ",alfa);
lcd_puts(buf);
i=*ptr_to_eeprom;
lcd_gotoxy(12,1);
sprintf(buf,"%x ",i);
lcd_puts(buf);
while (1)
{
// Place your code here
};
}
85
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
86