pelatihan-ATMEGA8535-CVAVR.pdf
Transcript of pelatihan-ATMEGA8535-CVAVR.pdf
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA Jalan Lingkar Barat, Tamantirto, Kasihan, Bantul, Yogyakarta 55183 Telp. 0274-387656 (Hunting) Fax. 0274-381656
www.umy.ac.id www.iswantodosen.blogspot.com
DATA0
P7
+ C8
1uF 16V
DATA7
TIM0
T1
P3DATA6A
C
D3
1N4002
R1
470
GND
12345
JP4
HEADER 5
1 2D0
LED
594837261
P1
SERIAL COM
P6
P1
ADD10
TIM1
ADD11
WRX1
12MHz
INT0
VCC
TX1
ADD12
RST9
XTAL218
XTAL119 PSEN29ALE/PROG 30
EA/VPP31
P1.01
P1.12
P1.23
P1.34
P1.45
P1.56
P1.67
P1.78P2.0/A8
21
P2.1/A922
P2.2/A10 23
P2.3/A1124
P2.4/A12 25
P2.5/A13 26
P2.6/A1427
P2.7/A15 28
P3.0/RXD10 P3.1/TXD11
P3.2/INTO12
P3.3/INT113
P3.4/TO14
P3.5/T115
P3.6/WR16P3.7/RD 17
P0.0/AD0 39
P0.1/AD1 38
P0.2/AD237
P0.3/AD3 36
P0.4/AD435
P0.5/AD534
P0.6/AD6 33
P0.7/AD732
U4
AT89C51
ADD9
RD
DATA4
+
C91uF 16V
DATA5
12
J1
POWER
+ C5
1uF 16V
R24K7
C310u
RX1
C730p
ALE
P0
S1RESET
R1IN13 R2IN8
T1IN11
T2IN10
C+1
C1-3
C2+4
C2- 5
V+2 V- 6
R1OUT 12
R2OUT 9T1OUT14 T2OUT7
U6
MAX232
RST
R1
VCC
INT1
ADD8
ADD13
DATA2
PSEN
DATA3
C630p
VCC
P5P4
P2
DATA1
ADD14ADD15
+ C4
1uF 16V
PELATIHAN MIKROKONTROLER
ATMEGA8535
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
i
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 1 -
PENGENALAN BAHASA C
1. PENDAHULUAN
Bahasa C pertama kali digunakan di komputer Digital Equipment Corporation
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
Kerningan dan Dennis Ritchie berjudul “The C Programming Language”, diterbitkan
oleh Prentice-Hall tahun 1978. Deskripsi C dari Kerninghan dan Ritchie ini kemudian
kemudian dikenal secara umum sebagai “K dan R C”
2. PENULISAN PROGRAM BAHASA C
Program Bahasa C tidak mengenal aturan penulisan di kolom tertentu, jadi bisa
dimulai dari kolom manapun. Namun demikian, untuk mempermudah pembacaan
program dan untuk keperluan dokumentasi, sebaiknya penulisan bahasa C diatur
sedemikian rupa sehingga mudah dan enak dibaca.
Berikut contoh penulisan Program Bahasa C:
#include <mega8535.h> #include <delay.h> main () { ……… ……… }
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 2 -
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
tubuh program ini disebut dengan blok.
Tanda () digunakan untuk mengapit argumen suatu fungsi. Argumen adalah
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
prosesor. Setiap pernyataan diakhiri dengan tanda titik koma ;
Baris pertama #include <…> bukanlah pernyataan, sehingga tak diakhiri
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
digunakan semacam perpustakaan bagi pernyataan yang ada di tubuh program.
#include merupakan salah satu jenis pengarah praprosesor (preprocessor
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
stdio.h saat pelaksanaan kompilasi.Bentuk umum #include:
#include “namafile”
Bentuk pertama (#include <namafile>) mengisyaratkan bahwa pencarian file
dilakukan pada direktori khusus, yaitu direktori file include. Sedangkan bentuk kedua
(#include “namafile”) menyatakan bahwa pencarian file dilakukan pertama kali pada
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 3 -
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
proses operasi data menjadi lebih efisien dan efektif.
Tabel 2.1 Bentuk Tipe data:
No Tipe Data Ukuran Range (Jangkauan) 1 Char 1 byte -128 s/d 127 2 Int 2 byte -32768 s/d 32767 3 Unsigned int 2 byte 0 s/d 65535 4 Long Int 4 byte -2147483648 s/d 2147483648 5 Unsigned Long int 4 byte 0 s/d 4294967296 6 Float 4 byte -3.4E-38 s/d 3.4E+38 7 Double 8 byte 1.7E-308 s/d 1.7E+308 8 Long Double 10 byte 3.4E-4932 s/d 1.1E+4932 9 Char 1 byte -128 s/d 127 10 Unsigned char 1 byte 0 s/d 255
4. KONSTANTA
Konstanta merupakan suatu nilai yang tidak dapat diubah selama proses program
berlangsung. Konstanta nilainya selalu tetap. Konstanta harus didefinisikan terlebih
dahulu di awal program. Konstanta dapat bernilai integer, pecahan, karakter dan string.
Contoh konstanta : 50; 13; 3.14; 4.50005; ‘A’; ‘Bahasa C’.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 4 -
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.
• Tidak boleh mengandung spasi.
• Tidak boleh mengandung symbol-simbol khusus, kecuali garis bawah (underscore).
Yang termasuk symbol khusus yang tidak diperbolehkan antara lain : $, ?, %, #, !, &,
*, (, ), -, +, = dsb
• Panjangnya bebas, tetapi hanya 32 karakter pertama yang terpakai.
6. DEKLARASI
Deklarasi diperlukan bila kita akan menggunakan pengenal (identifier) dalam program.
Identifier dapat berupa variable, konstanta dan fungsi.
6.1. DEKLARASI VARIABEL
Bentuk umum pendeklarasian suatu variable adalah : Nama_tipe nama_variabel;
Contoh :
int x; // Deklarasi x bertipe integer
6.2. DEKLARASI KONSTANTA
Dalam bahasa C konstanta dideklarasikan menggunakan preprocessor #define.
Contohnya :
#define PHI 3.14 #define nim “0111500382”
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 5 -
6.3. DEKLARASI FUNGSI
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
menggunakannya tidak perlu dideklarasikan.
Fungsi yang perlu dideklarasikan terlebih dahulu adalah fungsi yang dibuat oleh
programmer. Bentuk umum deklarasi sebuah fungsi adalah :
Tipe_fungsi nama_fungsi(parameter_fungsi);
Contohnya :
float luas_lingkaran(int jari); void tampil(); int tambah(int x, int y);
7. OPERATOR
7.1. OPERATOR PENUGASAN
Operator penugasan (Assignment operator) dalam bahasa C berupa tanda sama dengan
(“=”).
7.2. OPERATOR ARITMATIKA
Bahasa C menyediakan lima operator aritmatika, yaitu :
• .* : untuk perkalian
• / : untuk pembagian
• % : untuk sisa pembagian (modulus)
• + : untuk penjumlahan
• - : untuk pengurangan
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 6 -
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;
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 7 -
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; }
7.3. OPERATOR HUBUNGAN (PERBANDINGAN)
Operator hubungan digunakan untuk membandingkan hubungan antara dua buah
operand /sebuah nilai atau variable. Operasi majemuk seperti pada tabel dibawah ini:
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 8 -
Tabel 2.2 Operator Hubungan
Operator Arti Contoh
< Kurang dari X<Y Apakah X kurang dari Y
<= Kurang dari sama dengan X<=Y Apakah X Kurang dari sama dengan Y
> Lebih dari X>Y Apakah X Lebih dari Y
>= Lebih dari sama dengan X==Y Apakah X Lebih dari sama dengan Y
== Sama dengan X==Y Apakah X Sama dengan Y
!= Tidak sama dengan X!= Y Apakah X Tidak sama dengan Y
7.4. OPERATOR LOGIKA
Jika operator hubungan membandingkan hubungan antara dua buah operand,
maka operator logika digunakan untuk membandingkan logika hasil dari operator-
operator hubungan.
Operator logika ada tiga macam, yaitu :
• && : Logika AND (DAN)
• || : Logika OR (ATAU)
• ! : Logika NOT (INGKARAN)
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
salah jika ekspresinya bernilai benar.
#include <mega8535.h> #include <delay.h> void main() { char in1; char in2; DDRB=0xFF; PORTB=0xFF; in1=0xf0;
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 9 -
in2=0x40; if((in1==0xf0) && (in2==0x40)) {PORTB = 0x2A;} }
7.5. OPERATOR BITWISE (MANIPULASI PER BIT)
Operator bitwise digunakan untuk memanipulasi bit-bit dari nilai data yang ada di
memori.
Operator bitwise dalam bahasa C di SDCC adalah sebagai berikut :
• << : Pergeseran bit ke kiri
• >> : Pergeseran bit ke kanan
• & : Bitwise AND
• ^ : Bitwise XOR (exclusive OR)
• | : Bitwise OR
• ~ : Bitwise NOT
• Pertukaran Nibble dan Byte
• Mengambil Bit yang paling Berbobot
7.5.1. OPERASI GESER KIRI (<<)
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
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 10 -
#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; } }
7.5.2. OPERASI GESER KANAN(>>)
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; } }
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 11 -
7.5.3. OPERASI BITWISE AND ( & )
Operasi bitwise AND akan melakukan operasi AND pada masing-masing bit, sehingga
bit 0 akan dioperasikan dengan bit 0 dan bit 1 dan seterusnya.
Contohnya :
Hasil = 0x03 & 0x31; Operasinya 0x03 = 00000011 0x31 = 00110001 __________________________________________
Hasil 0x01 = 00000001
#include <mega8535.h> #include <delay.h> void main() { char a=0x03; char b=0x31; DDRB=0xFF; PORTB=0xFF; PORTB= a & b ; }
7.5.4. OPERASI BITWISE OR ( | )
Operasi bitwise OR akan melakukan operasi OR pada masing-masing bit, sehingga bit 0
akan dioperasikan dengan bit 0 dan bit 1 dan seterusnya.
Contohnya :
Hasil = 0x05 | 0x31; Operasinya 0x01 = 00000001 0x31 = 00110001 __________________________________________
Hasil 0x01 = 00110001
#include <mega8535.h> #include <delay.h> void main() { char a=0x03; char b=0x31; DDRB=0xFF; PORTB=0xFF; PORTB= a | b ; }
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 12 -
7.5.5. OPERASI BITWISE XOR( ^ )
Operasi bitwise XOR akan melakukan operasi XOR pada masing-masing bit, sehingga
bit 0 akan dioperasikan dengan bit 0 dan bit 1 dan seterusnya.
Contohnya :
Hasil = 0x02 ^ 0xFA; Operasinya 0x02 = 00000010 0xFA = 11111010 __________________________________________
Hasil 0x01 = 11111000
#include <mega8535.h> #include <delay.h> void main() { char a=0x02; char b=0xFA; DDRB=0xFF; PORTB=0xFF; PORTB=a ^ b ; }
7.5.6. OPERASI BITWISE NOT( ~ )
Operasi bitwise XOR akan melakukan operasi XOR pada masing-masing bit, sehingga
bit 0 akan dioperasikan dengan bit 0 dan bit 1 dan seterusnya.
Contohnya : Hasil = ~ 0x31; 0x31 = 00110001 Hasil ~0x31 = 11001110
#include <mega8535.h> #include <delay.h> void main() { char a= 0x31; DDRB=0xFF; PORTB=0xFF; PORTB= ~a; }
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 13 -
7.5.7. PERTUKARAN NIBBLE DAN BYTE
Pertukaran nibble dalam bahasa C dikenali SDCC dengan bentuk pernyataan
sebagai berikut ini:
volatile unsigned char i: i = (( i << 4) | ( i >> 4)); //pertukaran nibble
Dan pernyataan sebagai berikut ini sebagai pertukaran byte:
volatile unsigned char j: j = (( j << 8) | ( j >> 8)); //pertukaran byte
#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]; }
7.5.8. MENGAMBIL BIT YANG PALING BERBOBOT
Untuk mendapatkan bit yang paling berbobot (MSB) untuk tipe long, short, int, dan
char maka dapat dilakukan dengan pertanyaan berikut:
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 14 -
Volatile unsigned char gint; Unsigned char hop; Hop = (gint >> 7) & 1 // mengambil MSB
#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)); } }
7.6. OPERATOR UNARY
Operator Unary merupakan operator yang hanya membutuhkan satu operand saja.
Dalam bahasa C terdapat beberapa operator unary, yaitu :
Tabel 2.3 Operasi Unary
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 15 -
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; }
7.7. OPERATOR MAJEMUK
Operator majemuk terdiri dari dua operator yang digunakan untuk menyingkat
penulisan. Operasi majemuk seperti pada tabel dibawah ini
Tabel Operasi majemuk
Operator Contoh Kependekan dari += Counter +=1; Counter = counter + 1 -= Counter -=1 Counter = counter - 1 *= Counter *=1 Counter = counter * 1 /= Counter /=1 Counter = counter / 1 %= Counter %=1 Counter = counter % 1 <<= Counter <<=1 Counter = counter << 1 >>= Counter >>=1 Counter = counter >> 1 &= Counter &=1 Counter = counter & 1 |= Counter |=1 Counter = counter | 1 ^= Counter ^=1 Counter = counter ^ 1 ~= Counter ~=1 Counter = counter ~ 1
8. KOMENTAR PROGRAM
Komentar program hanya diperlukan untuk memudahkan pembacaan dan pemahaman
suatu program (untuk keperluan dokumentasi program). Dengan kata lain, komentar
program hanya merupakan keterangan atau penjelasan program. Untuk memberikan
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 16 -
komentar atau penjelasan dalam bahasa C digunakan pembatas /* dan */ atau
menggunakan tanda // untuk komentar yang hanya terdiri dari satu baris. Komentar
program tidak akan ikut diproses dalam program (akan diabaikan).
Contoh pertama :
// program ini dibuat oleh ….
Dibelakang tanda // tak akan diproses dalam kompilasi. Tanda ini hanya untuk satu baris
kalimat.
Contoh kedua :
/* program untuk memutar motor DC atau motor stepper */
Bentuk ini berguna kalau pernyataannya berupa kalimat yang panjang sampai beberapa
baris.
9. PENYELEKSIAN KONDISI
Penyeleksian kondisi digunakan untuk mengarahkan perjalanan suatu proses.
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.
9.1. STRUKTUR KONDISI “IF….”
Struktur if dibentuk dari pernyataan if dan sering digunakan untuk menyeleksi suatu
kondisi tunggal. Bila proses yang diseleksi terpenuhi atau bernilai benar, maka
pernyataan yang ada di dalam blok if akan diproses dan dikerjakan.
Bentuk umum struktur kondisi if adalah :
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 17 -
if(kondisi) pernyataan;
#include <mega8535.h> #include <delay.h> void main() { char inp1; DDRA=0xFF; DDRB=0xFF; inp1=PORTB; if(inp1==0x40) {PORTA = 0x20;} }
9.2. STRUKTUR KONDISI “IF......ELSE….”
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
dilaksanakan. Bentuk umumnya adalah sebagai berikut :
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
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 18 -
PORTA = i; // berarti tidak ada yang dikerjakan tunda50(100); } } #include <mega8535.h> #include <delay.h> void main() { char inp1; DDRA=0xFF; DDRB=0xFF; inp1=PORTB; if(inp1==0x01) {PORTA = 0x20;} else {PORTA=0x80;} }
9.3. STRUKTUR KONDISI “SWITCH...CASE... DEFAULT…”
Struktur kondisi switch....case....default digunakan untuk penyeleksian kondisi dengan
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
pernyataan yang ada di bawah ‘default’.
Bentuk umum dari struktur kondisi ini adalah :
switch(kondisi) {
case 1 : pernyataan-1; break; case 2 : pernyataan-2; break; ..... case n : pernyataan-n; break; default : pernyataan-m
}
contoh
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 19 -
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
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 20 -
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 dalam bahasa C mempunyai bentuk yang bermacam-macam.
10.1. STRUKTUR PERULANGAN “ WHILE”
Perulangan WHILE banyak digunakan pada program yang terstruktur.
Perulangan ini banyak digunakan bila jumlah perulangannya belum diketahui. Proses
perulangan akan terus berlanjut selama kondisinya bernilai benar (true) dan akan
berhenti bila kondisinya bernilai salah.
Bentuk umum dari struktur kondisi ini adalah:
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--; } }
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 21 -
10.2. STRUKTUR PERULANGAN “DO.....WHILE…”
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
perulangan. Jadi dengan menggunakan struktur do…while sekurang-kurangnya akan
terjadi satu kali perulangan.
Bentuk umum dari struktur kondisi ini adalah:
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); }
10.3. STRUKTUR PERULANGAN “FOR”
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
perulangan for adalah sebagai berikut :
for(inisialisasi; syarat; penambahan) pernyataan;
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 22 -
Keterangan:
Inisialisasi : pernyataan untuk menyatakan keadaan awal dari variabel kontrol.
syarat : ekspresi relasi yang menyatakan kondisi untuk keluar dari perulangan.
penambahan : pengatur perubahan nilai variabel kontrol.
Contoh
for (k = 0; k<4 ; k++) { i=tabel1(k); PORTA = i; tunda50(100); }
#include <mega8535.h> #include <delay.h> void main() { char a; DDRA=0xFF; for(a=10;a>=0;a--) PORTA=a; }
11. ARAY (LARIK)
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
dimensi satu, array dimensi dua dan array multi-dimensi.
11.1. ARRAY DIMENSI SATU
Setiap elemen array dapat diakses melalui indeks. Indeks array secara default
dimulai dari 0. Deklarasi Array Bentuk umum :
Deklarasi array dimensi satu:
[Tipe_array][ nama_array][elemen1];
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 23 -
11.2. ARRAY DIMENSI DUA
Array dua dimensi merupakan array yang terdiri dari m buah baris dan n buah
kolom. Bentuknya dapat berupa matriks atau tabel.
Deklarasi array dimensi dua :
[Tipe_array][nama_array][elemen1][elemen2];
11.3. ARRAY MULTI-DIMENSI
Array multi-dimensi merupakan array yang mempunyai ukuran lebih dari dua.
Bentuk pendeklarasian array sama saja dengan array dimensi satu maupun array
dimensi dua. Bentuk umumnya yaitu :
[tipe_array][nama_array][elemen1][elemen2]…[elemenN];
12. FUNGSI
12.1. PENGERTIAN FUNGSI
Fungsi merupakan suatu bagian dari program yang dimaksudkan untuk
mengerjakan suatu tugas tertentu dan letaknya terpisah dari program yang
memanggilnya. Fungsi merupakan elemen utama dalam bahasa C karena bahasa C
sendiri terbentuk dari kumpulan fungsi-fungsi. Dalam setiap program bahasa C,
minimal terdapat satu fungsi yaitu fungsi main(). Fungsi banyak diterapkan dalam
program-program C yang terstruktur. Keuntungan penggunaan fungsi dalam program
yaitu program akan memiliki struktur yang jelas (mempunyai readability yang tinggi)
dan juga akan menghindari penulisan bagian program yang sama.
12.2. PENDEFISIAN FUNGSI
Sebelum digunakan fungsi harus didefinisikan terlebih dahulu. Bentuk definisi fungsi
adalah:
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 24 -
Tipe_Nilai_Balik nama_fungsi(argumen1, argumen2) { Pernyataan1; Pernyataan1; return(ekspresi);
}
Contoh:
int jumlah(int bil1,int bil2) //definisi fungsi jumlah { int hasil; hasil = bil1 + bil2
return(hasil); }
int jumlah(int bil1,int bil2)
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); }
12.3. PROTOTYPE FUNGSI
Ketentuan pendefinisian fungsi yang mendahului fungsi pemanggil dapat merepotkan
untuk program yang komplek atau besar. Untuk mengatasi hal tersebut maka fungsi
dapat dideklarasikan sebelum digunakan, terletak sebelum fungsi main. Deklarasi fungsi
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 25 -
dikenal dengan prototype fungsi. Cara mendeklarasikan fungsi sama dengan header
fungsi dan diakhiri tanda titik koma ( ; )
#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); }
12.4. VARIABEL LOKAL DAN GLOBAL
Variabel lokal adalah variabel yang dideklarasikan di dalam suatu fungsi,
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,
sehingga semua fungsi dapat memakainya.
#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); }
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 26 -
12.5. KATA KUNCI EXTERN DAN STATIC
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
keluar dari fungsi.
12.6. FUNGSI TANPA NILAI BALIK
Fungsi yang tidak mempunyai nilai balik menggunakan kata kunci void
sedangkan fungsi yang tidak mempunyai argumen, setelah nama fungsi dalam kurung
dapat kosong atau dengan menggunakan kata kunci void.
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();
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 27 -
}
12.7. FUNGSI DENGAN NILAI BALIK (RETURN VALUE)
Nilai balik dinyatakan delam pernyataan return. Tipe nilai balik dapat berupa
char, int, short, long, atau float
Contoh:
int jumlah(int bil1,int bil2) { return(bil1+bil2); }
12.8. ARGUMEN/ PARAMETER FUNGSI
Argumen dilewatkan ke dalam fungsi terdiri atas dua macam, yaitu:
a. Pelewatan secara nilai
Bentuk definisi pelewatan secara nilai adalah:
tipe nama_fungsi (tipe argumen1, tipe argumen2, ...) { .................... ....................
}
#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; }
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 28 -
b. Pelewatan secara pointer
Bentuk definisi pelewatan secara pointer adalah:
tipe nama_fungsi (tipe *argumen1, tipe *argumen2, ...) { .................... ....................
}
#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
atau berbeda yang dikemas dalam satu nama.
13.1. DEKLARASI STRUKTUR
Deklarasi struktur dilakukan dengan format sebagai berikut:
Struct nama_struktur { deklarasi variabel; }
Contoh:
Struct kar_sensor { unsigned char impedan; unsigned char koefi_suhu;
unsigned char gain; }
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 29 -
atau
typedef struct { deklarasi variabel } nama_struktur;
Contoh:
Typedef struct { unsigned char impedan; unsigned char koefi_suhu; unsigned char gain;
}
13.2. PENDEFINISIAN VARIABEL STRUKTUR
Pada deklarasi struktur belum ada pengalokasian memori, oleh karena itu agar
dapat digunakan maka perlu dilakukan pendefinisian variabel struktur. Pendefinisian
variabel struktur dilakukan dengan format sebagai berikut:
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:
Nama_variabel.anggota = data; //untuk penulisan Tampung = nama_variabel.anggota //untuk pembacaan
Contoh:
Sen_suhu.impedansi = 0x5; Sen_suhu.kofi_suhu = 0x01; Sen_suhu.gain = 0x04;
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 30 -
#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; }
13.4. LARIK STUKTUR
Struktur dapat juag didefinisikan sebagai larik seperti berikut ini:
Struct kar_sensor dbase_sensor[4];
Untuk mengakses anggota struktur harus disertakan indeks lariknya.
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>
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 31 -
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; }
13.5. INISIALISASI STRUKTUR
Anggota struktur dapat diberi nilai ketika pendefinisian variabel struktur seperti
pada berikut ini:
Struct kar_sensor sen_suhu = {0x05, 0x09, 0x01};
Contoh:
Struct kar_sensor dbase_sensor[4] = { {0x05, 0x07, 0x09}; {0x02, 0x04, 0x01}; {0x04, 0x01, 0x03}; {0x07, 0x03, 0x04}; }
#include <mega8535.h> #include <delay.h> struct kar_sensor { unsigned char impedan; unsigned char koefi_suhu; unsigned char gain; }; void main()
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 32 -
{ 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; }
13.6. POINTER STRUKTUR
Struktur dapat didefinisikan sebagai pointer seperti berikut ini:
Struct kar_sensor * dbase_sensor; //variabel //pointer
Struct kar_sensor base; //variabel
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
13.7. MELEWATKAN POINTER STRUKTUR KE FUNGSI
Penggunaan pointer struktur untuk melewatkan parameter ke fungsi dapat
mencegah pelewatan data anggota struktur yang banyak, karena hanya parameter
tertentu saja yang akan dilewatkan. Melewatkan pointer struktur ke fungsi dapat juga
didefinisikan sebagai seperti berikut ini:
Struct kar_sensor base * dbase_sensor; Dbase_sensor = &base; Dbase_sensor −> impedan = 0x05; Dbase_sensor −> koefi_suhu = 0x02; Dbase_sensor −> gain = 0x03; Kali_impedan(Struct kar_sensor *Structpointer) { Structpointer −> impedan *= 2
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 33 -
} P1 = Dbase_sensor −> impedan P2 = Dbase_sensor −> koefi_suhu; P3 = Dbase_sensor −> gain
14. POINTER
14.1. PENGERTIAN 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,
variabel pertama dikatakan menunjuk ke variabel kedua
Operator Pointer ada dua, yaitu :
• Operator &
o Operator & bersifat unary (hanya memerlukan satu operand saja).
o Operator & menghasilkan alamat dari operandnya.
• . Operator *
o Operator * bersifat unary (hanya memerlukan satu operand saja).
o Operator * menghasilkan nilai yang berada pada sebuah alamat.
14.2. DEKLARASI POINTER
Seperti halnya variabel yang lain, variabel pointer juga harus dideklarasikan terlebih
dahulu sebelum digunakan.
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.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 34 -
Bahkan operasi pointer dapat dilaksanakan relatif terhadap tipe dasar apapun yang
ditunjuk. Contoh, ketika kita mendeklarasikan pointer dengan tipe int*, kompiler akan
menganggap alamat yang ditunjuk menyimpan nilai integer - walaupun sebenarnya
bukan (sebuah pointer int* selalu menganggap bahwa ia menunjuk ke sebuah obyek
bertipe integer, tidak peduli isi sebenarnya). Karenanya, sebelum mendeklarasikan
sebuah pointer, pastikan tipenya sesuai dengan tipe obyek yang akan ditunjuk.
Contoh :
char *ptr; data char *ptr;
Tabel 2.5 Ukuran Variabel Pointer
No Kelas Memori Lebar Pointer 1 generik 3 2 data 1 3 idata 1 4 xdata 2 5 code 2 6 pdata 1
Sdcc juga mendukung deklarasi pointer yang mengarahkan fisik pointer ke kelas
memori tertentu.
Contoh:
/*secara fisik pointer berada di internal RAM yang menunjukan ke RAM eksternal*/ xdata unsigned char *data p:
/* secara fisik pointer berada di eksternal RAM yang menunjukan ke RAM internal*/
data unsigned char *data p:
/* secara fisik pointer berada di code ROM yang menunjukan ke RAM eksternal*/ /* p harus diinisialisasi ketika dideklarasikan*/
xdata unsigned char *code p = 0x1000:
/* secara fisik pointer berada code ROM yang menunjukan ke ROM*/ /* p harus diinisialisasi ketika dideklarasikan*/
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 35 -
code unsigned char *code p = 0x1000:
/* secara fisik pointer generic berada di eksternal RAM*/ char *xdata p:
14.3. INISIALISASI POINTER
Setelah dideklarasikan pointer belum menunjuk ke suatu alamat tertentu, oleh
karena itu perlu untuk diinisialisasi agar pointer menunjuk ke alamat tertentu sesuai
dengan kebutuhan.
14.3.1. MENUNJUKAN ALAMAT VARIABEL
Menunjuk alamat variabel dilakukan dengan cara sebagai berikut:
int aku; // deklarasi variabel int *ptr; // deklarasi pointer prt=&aku; // inisialisasi pointer // ptr = alamat variabel aku
atau
int aku; int *ptr=&aku;
Tanda ‘&’ di depan variabel menyatakan alamat memori variabel tersebut.
14.3.2. MENUNJUKAN ALAMAT MEMORI ABSOLUT
Disamping diarahkan untuk menunjukan alamat variabel, pointer juga dapat
diinisialisasi untuk menunjukan alamat absolut dengan cara sebagai berikut:
int *ptrku; ptrku= (int *) 0x8000;
atau
int *ptrku=(int *) 0x8000;
15. MENYISIPKAN INSTRUKSI ASSEMBLI
CVAVR juga mendukung penyisipan instruksi dalam bahasa asembli. Instruksi asembli
dituliskan diantara kata kunci #asm dan #endasm seperti berikut ini:
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 36 -
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; } } }
15.1. PENGGUNAAN LABEL PADA INSTRUKSI ASSEMBLI
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:
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
- 37 -
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;
}
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
1
BAB I APLIKASI OUTPUT
1.1. RANGKAIAN LAMPU LED
Rangkaian minimum untuk menghidupkan 8 LED melalui Port B ditunjukan
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
dikirim atau diberi logika ‘0’.
12
VCC
PC2
PC4
PC6
12
C1 22pF
12PC51212
R1
12
PC112
12
U1
ATMEGA8535
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
PC0
VCC
C3 100nF
X1
VCC
SW1
12
PC3
VCC
PC7
RST
C2 22pF
Gambar 1.1. Hasil pemasangan komponen rangkaian lampu led
1.2. PEMROGRAMAN MENYALAKAN LED
Setelah rangkaian LED dibuat dan dihubungkan dengan port pararel
mikrokontroller, maka sekarang saatnya Anda membuat program yang digunakan untuk
menghidupkan LED tersebut.
Program sebagai berikut ini
//-------------------------------------------------------//Program LED Menyala //-------------------------------------------------------#include <mega8535.h>
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
2
#include <delay.h> void main(void) { char a; a=0x000; DDRC=0xFF; while(1) { PORTC = a; } }
Cara kerja program:
Pada program Program LED Menyala, di perlukan deklarasi register dan delay untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
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
keluarkan oleh mikrokontroller dengan menggunakan PORTC. Data tersebut di simpan
dalam variabel a yang dideklarasikan sebagai char. Data tersebut dikeluarkan dengan
menggunakan PORTC sehingga harus dideklarasikan PORTC sebagai output dengan
DDRC=0xFF. Instruksi while merupakan instruksi perulangan, sehingga
mikrokontroller akan mengeluarkan data yang di simpan oleh variabel karakter secara
terus menerus.
1.3. PEMROGRAMAN LED BERKEDIP
Setelah membuat dan menjalankan program menyalakan lampu LED, maka
sekarang saatnya Anda membuat program kedua yang digunakan untuk menghidupkan
LED berkedip.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
3
Program sebagai berikut ini
//-------------------------------------------------------//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); } }
Cara kerja program:
Pada program Program LED Berkedip, terlihat menggunakan mikrokontroller
ATMEGA8535, sehingga di perlukan deklarasi register untuk mikrokontroller jenis
ATMEGA8535. Di dalam program utama, terdapat variabel karakter yang berfungsi
untuk menyimpan data 00 dan FF. Data tersebut akan di keluarkan oleh mikrokontroller
dengan menggunakan port 0. Instruksi while merupakan instruksi perulangan.
1.4. PEMROGRAMAN LED FLIP FLOP
Setelah membuat dan menjalankan program menyalakan lampu LED berkedip,
maka sekarang saatnya Anda membuat program ketiga yang digunakan untuk
menghidupkan LED flip-flop 1.
Program sebagai berikut ini
//------------------------------------------------------- //Program Bab 3.3. LED Flip-Flop
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
4
//------------------------------------------------------- #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); } }
Cara kerja program:
Pada program LED Flip-Flop di perlukan deklarasi register untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
akan mendeklarasikan waktu 1 sekon. Waktu tersebut berfungsi untuk waktu tunda.
Kemudian mikrokontroller akan mengeksekusi program utama.
Di dalam program utama, terdapat variabel karakter yang berfungsi untuk
menyimpan data 0x00F dan 0x0F0. Data tersebut akan di keluarkan oleh
mikrokontroller dengan menggunakan port B.
1.5. PEMROGRAMAN LED BERJALAN KEKANAN
Setelah membuat dan menjalankan program menyalakan lampu LED flip-flop,
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
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
5
geser kanan. Operasi geser kiri akan menggeser bit-bit kekanan sehingga bit 0 akan
berpindah ke bit 1 dan bit 1 akan berpindah ke bit 2 dan seterusnya.
Program sebagai berikut ini
//------------------------------------------------------ //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; } }
Cara kerja program:
Pada program Program LED berjalan Kekanan di perlukan deklarasi register
untuk mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka
program akan mendeklarasikan waktu kurang lebih 1 sekon.
Kemudian mikrokontroller akan mengeksekusi program utama. Di dalam
program utama, terdapat variabel karakter yang berfungsi untuk menyimpan data 0x01.
Data tersebut akan di keluarkan oleh mikrokontroller dengan menggunakan port 0.
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
melakukan Looping secara terus menerus.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
6
1.6. PEMROGRAMAN LED BERJALAN KEKIRI
Setelah membuat dan menjalankan program menyalakan lampu LED berjalan
kekanan, maka sekarang saatnya Anda membuat program yang digunakan untuk
menghidupkan LED berjalan kekiri. Program LED berjalan kekanan menggunakan
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 sebagai berikut ini
//------------------------------------------------------ //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; } }
Cara kerja program:
Pada program Program LED berjalan ke kiri di perlukan deklarasi register
untuk mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka
program akan mendeklarasikan waktu kurang lebih 1 sekon.
Kemudian mikrokontroller akan mengeksekusi program utama. Di dalam
program utama, terdapat variabel karakter yang berfungsi untuk menyimpan data 0x01.
Data tersebut akan di keluarkan oleh mikrokontroller dengan menggunakan port 0.
kemudian mikrokontroller menjalankan operasi geser kekiri. Diantara operasi geser kiri
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
7
dan mengeluarkan data di PORTB tersebut terdapat waktu tunda kurang lebih 1 sekon.
Didalam program utama terdapat pernyataan while(1). Pernyataan itu berfungsi untuk
melakukan Looping secara terus menerus.
1.7. PEMROGRAMAN LED BERJALAN BOLAK-BALIK
Setelah membuat dan menjalankan program menyalakan lampu LED berjalan
menyala kekiri, maka sekarang saatnya Anda membuat program ketuga yang digunakan
untuk menghidupkan LED bolak balik. Program LED bolak balik menggunakan operasi
pernyataan geser kanan dan geser kiri.
Program sebagai berikut ini
//------------------------------------------------------ //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) {
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
8
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; } }
Cara kerja program:
Pada program menyalakan LED dari kiri ke kanan di perlukan deklarasi register
untuk mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka
program akan mendeklarasikan waktu kurang lebih 1 sekon. Waktu tersebut berfungsi
untuk waktu tunda. Waktu tunda itu tidak tidak akurat.
Kemudian mikrokontroller akan mengeksekusi program utama. Di dalam
program utama, terdapat variabel karakter yang berfungsi untuk menyimpan data 0x01.
Data tersebut akan di keluarkan oleh mikrokontroller dengan menggunakan port 0.
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
melakukan Looping secara terus menerus.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
10
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
kondisi logika high.
Pada saat tombol tidak ditekan, maka arus akan mengalir dari VCC melalui
resistor menuju ke port seperti tampak pada gambar berikut.
PORT
Gambar 2.1. Rangkaian saklar
Sedangkan saat tombol ditekan, maka baris dan kolom akan terhubung ke ground
sehingga kondisi pada baris dan kolom tersebut akan menjadi low.
2.2. RANGKAIAN PEMBACAAN 8 TOMBOL
Rangkaian pembacaan 8 buah tombol adalah rangkaian untuk membaca
penekanan tombol yang terhubung pada port keluaran mikrokontroller yang hasilnya
tertampil pada led .
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
11
12
X1
C3 100nF1
VCC
VCC
12
VCC
12
12
SW2
12
12
C2 22pF
12
U4
ATMEGA8535
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
C1 22pF
12
VCC
R1
12
Gambar 2.2. Rangkaian aplikasi pembacaan 8 buah tombol
2.3. PEMROGRAMAN PEMBACAAN 8 BUAH TOMBOL
Setelah rangkaian tombol dibuat dan dihubungkan dengan port pararel
mikrokontroller, maka sekarang saatnya Anda membuat program pembacaan tombol.
Program sebagai berikut ini
//-------------------------------------------------------//Program Program pembacaan 8 buah tombol //------------------------------------------------------- #include <mega8535.h> #include <delay.h> void main(void) { DDRC=0x00; DDRB=0xFF; while(1) { PORTB = PINC; } }
Cara kerja program:
Pada program pembacaan 8 buah tombol, di perlukan deklarasi register untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
akan masuk ke dalam program utama. Di dalam program utama, mikrokontroller akan
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
12
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
mikrokontroller. Didalam program utama terdapat pernyataan while(1). Pernyataan itu
berfungsi untuk melakukan Looping secara terus menerus.
2.4. PEMROGRAMAN PEMBACAAN TOMBOL
Setelah rangkaian tombol dibuat dan dihubungkan dengan port pararel
mikrokontroller, maka sekarang saatnya Anda membuat program Program pembacaan
tombol tunggal.
Program sebagai berikut ini
//------------------------------------------------------- //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;
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
13
delay_ms(100); } } void main(void) { DDRC=0x00; while(1) { if (PINC.0==1) { jalankanan(); } else { jalankiri(); } } }
Cara kerja program:
Pada program satu tombol, di perlukan deklarasi register untuk mikrokontroller
jenis ATMEGA8535. Setelah mendeklarasi register, maka program akan masuk ke
dalam program utama. Di dalam program utama, mikrokontroller akan membaca
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
terdapat pernyataan while(1). Pernyataan itu berfungsi untuk melakukan Looping
secara terus menerus.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
10
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.
AVR ATMEGA8535 memiliki tiga buah timer, yaitu Timer/Counter0 (8 bit),
Timer/Counter1 (16 bit), dan Timer/Counter3 (16 bit).
3.2. RANGKAIAN MENCACAH COUNTER TIMER T0
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
dikirim atau diberi logika ‘0’.
VCC
P6
P2
P7
P5
P3
P1
R1
L11 2
P0
C3 100nF1
VCC
P5
P4
RST
VCC
1 2
VCC
P6
U4
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
C2 22pF
SW2
12
P7RST
JISP
HEADER 5
12345
X1
1 21 2
1 2
GND
1 2
1 2
C1 22pF
1 2
Gambar 3.1. Hasil pemasangan komponen-komponen mencacah counter T0
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
11
3.3. PEMROGRAMAN MENCACAH COUNTER T0
Setelah rangkaian dibuat dan dihubungkan dengan port mikrokontroller, maka
sekarang saatnya Anda membuat program yang digunakan untuk mencacah. Program
cacah menggunakan port B.0 pada mikrokontroller.
Program sebagai berikut ini
//------------------------------------------------------ // 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; }
Cara kerja program:
Program mencacah counter T0 merupakan program untuk menghidupkan dan
mematikan led dengan menekan satu tombol sebanyak 6x. Program ini, di perlukan
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
12
deklarasi register untuk mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi
register, maka program akan mendeklasrasikan timer sebagai counter. Untuk
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
Di dalam program utama, mikrokontroller akan membaca cacahan melalui
PORTB.0. Cacahan tersebut akan di masukan kedalam register TCNT0, kemudian di
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.
3.4. PEMROGRAMAN MENCACAH TIMER T0
Setelah rangkaian dibuat dan dihubungkan dengan port mikrokontroller, maka
sekarang saatnya Anda membuat program yang digunakan untuk mencacah. Program
cacah menggunakan timer pada mikrokontroller.
Program sebagai berikut ini
//------------------------------------------------------ // 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;
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
13
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; }
Cara kerja program:
Pada Program mencacah Timer T0, di perlukan deklarasi register untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
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
dikembalikan ke posisi awal.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
14
3.5. RANGKAIAN MENCACAH COUNTER TIMER T1
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
dikirim atau diberi logika ‘0’.
P3
P6VCC
L11 2
1 2
P7R1
1 2
P0
GND
P5P4
1 2
P1
C1 22pF
U4
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
VCC
RST
1 2
VCC VCC
1 2
1 2
P5
P7
C2 22pF
C3 100nF1
RST
X1
1 2
SW2
12
P6
P2
JISP
HEADER 5
12345
Gambar 3.2. Hasil pemasangan komponen-komponen mencacah counter T1
3.6. PEMROGRAMAN MENCACAH COUNTER T1
Setelah rangkaian dibuat dan dihubungkan dengan port mikrokontroller, maka
sekarang saatnya Anda membuat program yang digunakan untuk mencacah. Program
cacah menggunakan port B.1 pada mikrokontroller.
Program sebagai berikut ini
//------------------------------------------------------ // Program MENCACAH COUNTER TIMER 1 //------------------------------------------------------ #include <mega8535.h> #include <delay.h> #include <stdio.h>
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
15
unsigned char led,a; void InisialisasiTIMER (); void main (void) { DDRD = 0xff; led=0x00; InisialisasiTIMER(); while(1) { a = TCNT1L + TCNT1H; if (a == 0x06) { led = PIND; PORTD=~led; TCNT1L=0x00; TCNT1H=0x00; } } } void InisialisasiTIMER () { TCNT1L=0x00; TCNT1H=0x00; TCCR1A=0x00; TCCR1B=0x07; }
Cara kerja program:
Program mencacah counter T1 merupakan program untuk menghidupkan dan
mematikan led dengan menekan satu tombol sebanyak 6x. Program ini, di perlukan
deklarasi register untuk mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi
register, maka program akan mendeklasrasikan timer sebagai counter. Untuk
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
Di dalam program utama, mikrokontroller akan membaca cacahan melalui
PORTB.1. Cacahan tersebut akan di masukan kedalam register TCNT1, kemudian di
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
16
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.
3.7. PEMROGRAMAN MENCACAH TIMER T1
Setelah rangkaian dibuat dan dihubungkan dengan port mikrokontroller, maka
sekarang saatnya Anda membuat program yang digunakan untuk mencacah. Program
cacah menggunakan timer pada mikrokontroller.
Program sebagai berikut ini
//------------------------------------------------------ // 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;
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
17
TCNT1L=0x00; TCNT1H=0x00; led=led <<1; } } } void InisialisasiTIMER () { TCNT1L=0x00; TCNT1H=0x00; TCCR1A=0x00; TCCR1B=0x05; }
Cara kerja program:
Pada Program mencacah Timer T1, di perlukan deklarasi register untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
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
maka data led akan dikembalikan ke posisi awal.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
31
BAB IV PORT SERIAL
4.1. SERIAL PADA ATMEGA8535
Universal synchronous dan asynchronous pemancar dan penerima serial adalah
suatu alat komunikasi serial sangat fleksibel. Jenis yang utama adalah :
Operasi full duplex ( register penerima dan pengirim serial dapat berdiri sendiri )
Operasi Asychronous atau synchronous
Master atau slave mendapat clock dengan operasi synchronous
Pembangkit boud rate dengan resolusi tinggi
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
Pendeteksian data overrun
Pendeteksi framing error
Pemfilteran gangguan ( noise ) meliputi pendeteksian bit false start dan
pendeteksian low pass filter digital
Tiga interrupt terdiri dari TX complete, TX data register empty dan RX
complete.
Mode komunikasi multi-processor
Mode komunikasi double speed asynchronous
4.2. INISIALISASI USART
USART harus diinisialisasi sebelum komunikasi manapun dapat berlansung.
Proses inisialisasi normalnyaterdiri daripengesetan boud rate, penyetingan frame
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
32
format dan pengaktifan pengirim atau penerimatergantung pada pemakaian. Untuk
interrupt menjalankan operasi USART , global interrupt flag ( penanda ) sebaiknya
dibersihkan ( dan interrupt global disable ) ketika inisialisasi dilakukan. Sebelum
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
contoh tersebit mengasumsikan bahwa operasi asinkron menggunakan metode poling (
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
dikombinasikan dengan inisialisasi kode untuk modul I/O yang lain.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
33
4.3. MENGIRIM DATA MELALUI PORT SERIAL
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.
4.4. MENERIMA DATA MELALUI PORT SERIAL
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.
4.5. RANGKAIAN SERIAL MIKROKONTROLLER
Rangkaian berikut digunakan untuk interfacing Led dengan port serial.
Rangkaian tersebut, sebagai konverter dari serial ke pararel. Berikut adalah rangkaian
serial led driver yang akan kita hubungkan pada port serial. Rangkaian Led Driver
Serial menggunakan Microcontroller ATMEGA8535 yang dihubungkan ke port serial
dengan menggunakan IC RS232 Rangkaian Serial LED Driver ini akan mendeteksi
setiap pengiriman data karakter dari port serial computer.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
34
U4
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
ADD9
P3
GND
ADD8
P712
PD5
VCC
P5
DATA5
ADD12
L112
PD6
+ C4
1uF 16V
12DATA2
P6
TX1
RST
RX1
P4
SW2
12
+
C91uF 16V
VCC
12
PD1X1
DATA4
JISP
HEADER 5
12345
U6
MAX232
138 11
10
1
3
4
5
2 6
12
9147 R1IN
R2IN T1IN
T2IN
C+
C1-
C2+
C2-
V+ V-
R1OUT
R2OUTT1OUTT2OUT
DATA7
DATA3
P7
+ C8
1uF 16V
12
C1 22pF
DATA0P1
VCC
P5
VCCP2P6
PD7
ADD11
C2 22pF
DATA1
PD3
+ C5
1uF 16V
DATA6
C3 100nF1
12
P0
PD0
RST
ADD10
ADD15
12
PD2
JSerial1
HEADER 3
123
ADD13PD4 ADD14
12R1
Gambar 4.1. Hasil pemasangan komponen rangkaian serial mikrokontroller
4.6. PEMROGRAMAN MENGIRIM DATA
Setelah membuat rangkaian serial mikrokontroller dan menghubungkan ke
komputer, maka sekarang saatnya Anda membuat program yang digunakan untuk
mengirim data serial.
Program sebagai berikut ini
//-------------------------------------------------------//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)
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
35
{ 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; }
Cara kerja program:
Pada program mengirim data serial, di perlukan deklarasi register untuk
mikrokontroller jenisATMEGA8535. Setelah mendeklarasi register, maka program
akan menginisialisasi port serial mikrokontroller dan boudrate. Kemudian program akan
masuk ke program utama. Di dalam program utama, mikrokontroller akan
mengeluarkan data Selamat Datang Mas Iswanto. Data tersebut akan di keluarkan oleh
mikrokontroller dengan menggunakan port serial dan akan di terima oleh komputer
4.7. PEMROGRAMAN MENGIRIM DAN MENERIMA DATA
Setelah membuat dan menjalankan program mengirim data serial, maka sekarang
saatnya Anda membuat program kedua yang digunakan untuk program mengirim dan
menerima data serial.
Program sebagai berikut ini
//-------------------------------------------------------//Program MENGIRIM DAN MENERIMA DATA //-------------------------------------------------------#include <mega8535.h> #include <delay.h>
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
36
#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; }
Cara kerja program:
Pada program mengirim dan menerima data serial, di perlukan deklarasi register
untuk mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka
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 kemuidan membaca penekanan tombol keyboard dan
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
37
mengirimkan data penekanan tombol tersebut ke port serial dengan kecepatan transfer
kirim 9600 bps.
4.8. PEMROGRAMAN MENJALANKAN LED DENGAN PC
Setelah membuat dan menjalankan program program mengirim dan menerima
data serial, maka sekarang saatnya Anda membuat program ketiga yang digunakan
untuk mengeser LED dengan terminal komputer.
Program sebagai berikut ini
//-------------------------------------------------------//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')
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
38
{ 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;
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
39
delay_ms(50); } PORTB= 0x00; }
Cara kerja program:
Pada program mengirim dan menerima data serial, di perlukan deklarasi register
untuk mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka
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
ke kanan, jika data angka 3 maka led berkedip.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
40
BAB V INTERUPSI
MIKROKONTROLLER
5.1. PENDAHULUAN
Interupsi adalah suatu kejadian atau peristiwa yang menyebabkan mikrokontroler
berhenti sejenak untuk melayani interupsi tersebut. Program yang dijalankan pada saat
melayani interupsi disebut Interrupt Service Routine.
Pada sistem mikrokontroler yang sedang menjalankan programnya, saat terjadi
interupsi , program akan berhenti sesaat, melayani interupsi tersebut dengan
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,
diperlukan contoh program yang konkrit untuk memahami. ATMEGA8535 memiliki 21
buah sumber interupsi. Interupsi tersebut bekerja jika bit I pada Register status atau
Status Register (SREG) dan bit pada masing-masing register bernilai 1.
5.2. RANGKAIAN INTERUPSI EKTERNAL
Rangkaian berikut digunakan untuk interupsi ekternal mikrokontroller.
Rangkaian tersebut menggunakan interupsi eksternal 0, 1, dan 2 yang menggunakan
tampilan LED yang dihubungkan pada Port A.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
41
12
P6
P3
12
INT2U4
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
RST
C2 22pF
12
VCC
P7
RST
SW2
12
L112
JISP
HEADER 5
12345
X1
VCC
P5
VCC
12R1
C3 100nF1
P5
P4
P2
VCC
GND
INT1
12
VCC
P6
P7
C1 22pF VCC
P112
P0
INT0
12
VCC
Gambar 6.1. Rangkaian interupsi ekternal mikrokontroller
5.2.1. PEMROGRAMAN INTERUPSI EKTERNAL INT0
Setelah membuat rangkaian interupsi ekternal untuk menghidupkan LED, maka
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
dengan menggunakan interupsi external 0.
Program sebagai berikut ini
//------------------------------------------------------ //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)
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
42
{ 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; }
Cara kerja program:
Pada program rutin interupsi eksternal 0, di perlukan deklarasi register untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
akan masuk ke dalam program utama. Program ini akan menginisialisasi interupsi
ekternal 0 dan akan mengaktifkan interupsi ekternal 0. Sebelum terjadi 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
mikrokontroller akan mengeluarkan data flip-flop pada port A
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
43
5.2.2. PEMROGRAMAN INTERUPSI EKTERNAL INT1
Setelah membuat rangkaian interupsi ekternal int 1, maka sekarang saatnya Anda
membuat program yang digunakan untuk menghidupkan LED dengan menggunakan
interupsi external int1
Program sebagai berikut ini
//------------------------------------------------------ //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; }
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
44
Cara kerja program:
Pada program rutin interupsi eksternal 1, di perlukan deklarasi register untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
akan masuk ke dalam program utama. Program ini akan menginisialisasi interupsi
ekternal 1 dan akan mengaktifkan interupsi ekternal 1. Sebelum terjadi 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
mikrokontroller akan mengeluarkan data flip-flop pada port A
5.3. RANGKAIAN INTERUPSI TIMER MIKROKONTROLLER
Rangkaian berikut digunakan untuk interupsi ekternal mikrokontroller.
Rangkaian tersebut menggunakan interupsi timer 0 dan 1 yang menggunakan tampilan
LED yang dihubungkan pada Port D.
X1
C3 100nF1
C1 22pF
P4P3
RST
P5
JISP
HEADER 5
12345
C2 22pF
P6P7
1 2
1 2
R1
1 2
VCCVCC
P6
1 2
1 2
U4
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
VCC
GND
P0
P2
L11 2
P5
1 2
P1
P7
RST
1 2
SW2
12
Gambar 6.2. Rangkaian interupsi timer mikrokontroller
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
45
5.3.1. PEMROGRAMAN INTERUPSI TIMER 0
Setelah membuat rangkaian interupsi timer untuk menghidupkan LED, maka
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
dengan menggunakan interupsi timer 0.
Program sebagai berikut ini
//------------------------------------------------------ // 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; }
Cara kerja program:
Pada program rutin interupsi timer 0, di perlukan deklarasi register untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
akan masuk ke dalam program utama. Program ini akan menginisialisasi interupsi timer
0 dan akan mengaktifkan interupsi timer 0. sebelum interupsi mikrokontroller akan
menyalakan led, setelah interupsi led geser kanan.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
46
5.3.2. PEMROGRAMAN INTERUPSI TIMER 1
Setelah membuat rangkaian interupsi timer untuk menghidupkan LED, maka
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
dengan menggunakan interupsi timer 1.
Program sebagai berikut ini
//------------------------------------------------------ // 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; }
Cara kerja program:
Pada program rutin interupsi timer 1, di perlukan deklarasi register untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
akan masuk ke dalam program utama. Program ini akan menginisialisasi interupsi timer
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
47
1 dan akan mengaktifkan interupsi timer 1. sebelum interupsi mikrokontroller akan
menyalakan led, setelah interupsi led geser kanan.
5.3.3. PEMROGRAMAN INTERUPSI TIMER 2
Setelah membuat rangkaian interupsi timer untuk menghidupkan LED, maka
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
dengan menggunakan interupsi timer 2.
Program sebagai berikut ini
//------------------------------------------------------ // 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; }
Cara kerja program:
Pada program rutin interupsi timer 2, di perlukan deklarasi register untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
akan masuk ke dalam program utama. Program ini akan menginisialisasi interupsi timer
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
48
2 dan akan mengaktifkan interupsi timer 2. sebelum interupsi mikrokontroller akan
menyalakan led, setelah interupsi led geser kanan.
5.4. RANGKAIAN INTERUPSI SERIAL
Rangkaian berikut digunakan untuk interupsi serial mikrokontroller. Rangkaian
tersebut menggunakan interupsi serial yang menggunakan tampilan LED yang
dihubungkan pada Port A.
PD2
PD0
12
ADD12
P1
ADD9
DATA2
VCC
12P5P6
P6
U4
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
ADD13
ADD15
12
ADD8
JSerial1
HEADER 3
123
RX1
+ C4
1uF 16V
C2 22pF
PD1
P3
C3 100nF1
X1
RST
ADD11
DATA4
P5
P4
PD4
ADD10
GND
VCCP2
PD6
12
12
DATA112
VCC
L112
RST
PD3
P0
12
ADD14
VCC
PD5
P7DATA6
C1 22pF
PD7
+
C91uF 16V
+ C5
1uF 16V
DATA3
DATA5
+ C8
1uF 16V
SW2
12
DATA7
U6
MAX232
138 11
10
1
3
4
5
2 6
12
9147 R1IN
R2IN T1IN
T2IN
C+
C1-
C2+
C2-
V+ V-
R1OUT
R2OUTT1OUTT2OUTTX1
R1
P7
JISP
HEADER 5
12345
DATA0
Gambar 6.3. Rangkaian interupsi serial mikrokontroller
5.4.1. PEMROGRAMAN INTERUPSI SERIAL
Setelah membuat rangkaian interupsi serial untuk menghidupkan LED, maka
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
dengan menggunakan interupsi serial.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
49
Program sebagai berikut ini
//------------------------------------------------------ // 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;
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
50
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; }
Cara kerja program:
Pada program rutin interupsi serial, di perlukan deklarasi register untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
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
mengeluarkan data karakter dari serial transmisi.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
51
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
penampil-penampil menggunakan 7-segment LED (Light Emiting Diode) yang sudah
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
karakter (panjang 16, baris 2, karakter 32) dan 16 pin.
6.2. M1632 MODULE LCD 16 X 2 BARIS (M1632)
M1632 adalah merupakan modul LCD dengan tampilan 16 x 2 baris dengan
konsumsi daya yang rendah. Modul ini dilengkapi dengan mikrokontroler yang didisain
khusus untuk mengendalikan LCD. Mikrokontroler HD44780 buatan Hitachi yang
berfungsi sebagai pengendali LCD ini mempunyai CGROM (Character Generator Read
Only Memory), CGRAM (Character Generator Random Access Memory) dan DDRAM
(Display Data Random Access Memory).
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
52
6.3. FUNGSI PIN-PIN MODUL LCD
Modul LCD berukuran 16 karakter x 2 baris dengan fasilitas back lighting
memiliki 16 pin yang terdiri dari 8 jalur data, 3 jalur kontrol dan jalur-jalur catu daya:
Gambar 6.1. Pin-pin modul LCD
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
Merupakan pin kontrol Vcc yang digunakan untuk mengatur kontras
display.
3. Pin 4
Merupakan register select (RS), masukan yang pertama dari tiga
command control input. Dengan membuat RS menjadi high, data karakter dapat
ditransfer dari dan menuju modulnya.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
53
4. Pin 5
Read/Write (R/W). Untuk memfungsikan sebagai perintah Write maka
R/W low atau menulis karakter ke modul.
5. Pin 6
Enable (E), input ini digunakan untuk transfer aktual dari perintah-
perintah atau karakter antara modul dengan hubungan data.
6. Pin 7 sampai 14
Pin 7 sampai 14 adalah delapan jalur data (D0 – D7) dimana data dapat
ditransfer ke dan dari display.
7. Pin 15 dan 16
Pin 15 atau A (+) mempunyai level DC +5 V berfungsi sebagai LED
backlight + sedangkan pin 16 yaitu K (-) memiliki level 0 V
6.4. RANGKAIAN LCD
Rangkaian LCD adalah rangkaian untuk menghubungkan LCD secara langsung
dari port keluaran mikrokontroller dengan input LCD.
ADC4
VCC
pinb.7
D3
1N4002
AC
VCC
ADC5
pinb.5
VCC
pinb.7
X1
Rreset
pinb.6ADC7
pinb.6
C1 22pF
RS_LCDRST
J5
HEADER 5
12345
pinb.7
ADC5
VCC
C2 22pF
VCC
RS_LCD
RST
J16.
HEADER 16
123456789
10111213141516
pinb.7
ADC6
pinb.6pinb.6
C3 100nFSW1
12
VCC
E_LCD
pinb.5
ADC4ADC6
ADC7
U1
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
E_LCDR9
5k
Gambar 6.2. Rangkaian LCD mikrokontroller
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
54
6.4.1. PEMROGRAMAN LCD
Setelah membuat rangkaian LCD, maka sekarang saatnya Anda membuat
program LCD.
Program sebagai berikut ini
//-------------------------------------------------------//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); }
Cara kerja program:
Pada program LCD, di perlukan deklarasi register untuk mikrokontroller jenis
ATMEGA8535. Setelah mendeklarasi register, maka program akan masuk ke dalam
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
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
55
T.Elektro. Kemudian pada baris ke satu kolom ke lima tulisan iswanto akan diganti
tulisan UGM
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
51
BAB VII APLIKASI SEVEN SEGMEN
7.1. PENDAHULUAN
Peralatan keluaran yang sering digunakan dalam menampilkan bilangan adalah
penampil seven segmen yang ditunjukkan pada gambar 4.1 (a). tujuh segmen tersebut
dilabelkan dengan huruf a sampai g.
a
f b
g
e c
d
(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
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
52
(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.
7.2. RANGKAIAN SEVEN SEGMENT TUNGGAL 1
Rangkaian seven segment tunggal adalah rangkaian untuk menggerakkan
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
10985421
6
3
P2
PD5
P6
P7
PD2
P4
P1
PD3
PD4
PD0
PD1
VCC
R1
U4
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
P6
PD5
PD4
C1 22pF
VCC
PD7
PD6
C3 100nF1
P5
P5
SW2
12
P3
PD0
VCC
RST
PD7
P0
PD3
JISP
HEADER 5
12345
C2 22pF
PD6
RSTP7
X1
VCC
PD2
GND
PD1
Gambar 7.2. Rangkaian aplikasi penggerak seven segmen tunggal
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
53
Tabel 7.1 Data Karakter Angka Pada 7 Segment
7.2.1. PEMROGRAMAN SEVENT SEGMENT TUNGGAL 1
Setelah rangkaian seven segment dibuat dan dihubungkan dengan port pararel
mikrokontroller, maka sekarang saatnya anda membuat program Program Seven
Segment 1. Program ini digunakan untuk menampilkan data 3 dan 2 secara bergantian.
Program sebagai berikut ini
//-------------------------------------------------------// 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;
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
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
54
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); } }
Cara kerja program:
Pada program Sevent Segmen Tunggal, di perlukan deklarasi register untuk
mikrokontroller jenis ATMEGA8535. Setelah mendeklarasi register, maka program
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
akan di keluarkan oleh mikrokontroller dengan menggunakan PORT D. Kemudian
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
55
memanggil tunda 100 mili sekon dan memangil data angka 2 Instruksi while
merupakan instruksi perulangan, sehingga mikrokontroller akan mengeluarkan data
secara terus menerus.
7.3. APLIKASI SEVEN SEGMENT TERMULTIPLEKS
Rangkaian seven segment termultipleks Seven Segment adalah rangkaian untuk
menggerakkan 4 buah penampil 7 segment secara langsung dari port keluaran
mikrokontroller dengan data input Seven Segment. 7-segment ini dikendalikan oleh
transistor bc337.
DATA1
P6
DATA0
DATA2
VCC
10 9 7 6 4 2 1
8
10 9 7 6 4 2 1
8
DATA2
RST
P5P4
P2
R1
P0 P0
10 9 7 6 4 2 1
8
DATA3 P3
RT2 330
P5
P7
P2
Q3BC337
1
2
3
P4
P3DATA3
10 9 7 6 4 2 1
8
Q2BC337
1
2
3
Q4BC337
1
2
RT3 330
DATA0
P1
DATA1
VCC
VCC
Q1BC337
1
2
3
VCC
P6
SW2
12
U4
ATMEGA32
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
P0
P1VCC
C3 100nF1
VCC
P0
RT4 330
VCC
RT1 330
Gambar 7.3. Rangkaian aplikasi penggerak seven segmen termultipleks
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
56
7.4. PEMROGRAMAN SEVENT SEGMENT TERMULTIPLEKS
Setelah rangkaian sevent segment dibuat dan dihubungkan dengan port pararel
mikrokontroller, maka sekarang saatnya Anda membuat program yang digunakan untuk
menampilkan data 1512 dan 4123 pada seven segment.
Program sebagai berikut ini
//------------------------------------------------------- //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 :
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
57
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); } }
Cara kerja program:
Pada program Program 7-segment 2. Sevent Segmen Termultiplek, di perlukan
deklarasi register untuk mikrokontroller jenis AT89x51. Setelah mendeklarasi register,
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.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
58
Kemudian memanggil tunda 1 sekon dan memangil data angka 4123 Instruksi while
merupakan instruksi perulangan, sehingga mikrokontroller akan mengeluarkan data
secara terus menerus.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
58
BAB VIII KEYPAD
8.1. PENDAHULUAN
Keypad 4x3 di sini adalah sebuah keypad matrix dengan susunan empat baris
dan tiga kolom dengan sebuah common.
Gambar 8.1. Konstruksi keypad 4x3 dengan common
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
kolom 2 akan terhubung ke common dan seterusnya.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
59
Gambar 8.2. Gambar interface keypad 4x3
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
melalui resistor menuju ke port seperti tampak pada gambar berikut.
Gambar 8.3. Aliran arus saat tombol tidak ditekan
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
60
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
‘2’ dan seterusnya sehingga terbentuk tabel berikut.
Tabel 8.1. Tabel kombinasi keypad
8.2. RANGKAIAN PEMBACAAN KEYPAD DENGAN LCD
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.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
61
S8
SW
S11
SW
PD2
U4
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
J5
HEADER 5
12345
pinb.6
PD0X1
PD5
S17
SW
PD1
C3 100nF1
pinb.0
SW2
12
D3
1N4002
AC
S5
SW
pinb.6
VCC
S9
SW
PD7
pinb.7
pinb.0
J16.
HEADER 16
123456789
10111213141516
PD1
pinb.6
PD6
C2 22pF
PD4S15
SW
PD6
pinb.6
S12
SW
pinb.5
S18
SW
PD5
S16
SW
RST
PD2
pinb.1
PD7
S6
SW
pinb.7
pinb.7
pinb.2
S13
SW
C1 22pF
PD3
pinb.7
PD0
S10
SW
VCC
pinb.6
pinb.7
S19
SW
pinb.5
R1
PD3
VCC
VCC
pinb.1
R95k
VCC
VCC
S4
SW
S7
SW
S14
SW
pinb.2
pinb.4
PD4
pinb.5
Gambar 8.4. Rangkaian aplikasi tombol keypad dengan lcd
8.2.1. PEMROGRAMAN PEMBACAAN KEYPAD
Setelah rangkaian tombol 4x4 dibuat dan dihubungkan dengan port pararel
mikrokontroller, maka sekarang saatnya Anda membuat program Program pembacaan
tombol. 4x4.
Program sebagai berikut ini
//------------------------------------------------------ //Program KEYPAD LCD //------------------------------------------------------
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
62
#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;
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
63
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; }
Cara kerja program:
Pada Program Tombol, di perlukan deklarasi register untuk mikrokontroller
jenis ATMEGA8535. Setelah mendeklarasi register, maka program akan masuk ke
dalam program utama. Di dalam program utama, mikrokontroller akan membaca data
keypad 4x4 sesuai dengan penekanan tombol. Data keypad akan di tampilkan melalui
LCD
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
64
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.
9.2. ADC ATMEGA8535
ATMEGA8535 merupakan tipe AVR yang dilengkapi dengan 8 saluran ADC
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
mudah disesuaikan dengan kebutuhan dari ADC itu sendiri.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
65
Gambar 9.1. Diagram Blok ADC
Proses inisialisasi ADC meliputi proses penentuan clock, tegangan referensi,
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
ADC yang digunakan. Konfigurasi register ADMUX pada Gambar 9.2.
REF1 REF0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
Gambar 9.2. Register ADMUX
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
66
Bit penyusunnya sebagai berikut:
a. REF[1..0] merupakan bit pengatur tegangan referensi ADC ATMega8535.
Memeiliki Nilai Awal 00 sehingga referensi tegangan berasal dari pin AREF. Detail
nilai yang lain dapat dilihat pada tabel 9.1.
Tabel 9.1. Pemilihan Mode Tegangan Referensi ADC
REF1 REF0 Mode Tegangan Referensi
0 0 Berasal dari pin AREF
0 1 Berasal dari pin AVCC
1 0 Tidak dipergunakan
1 1 Berasal dari tegangan referensi internal 2,56 V
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
hasilnya pada tabel 9.4.
– – – – – – ADC9 ADC8
ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0
ADCH
ADCL Gambar 9.3. Format Data ADC dengan ADLAR=0
ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2
ADC1 ADC0 - - - - - -
ADCH
ADCL Gambar 9.4. Format Data ADC dengan ADLAR=1
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
67
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,
konfigurasinya dalam tabel 9.2.
Tabel 9.2. Pemilihan Bit Saluran Pembacaan ADC
MUX4..0 Single Ended Input Pos Differential Input Neg Differential Input Gain
00000 ADC0 00001 ADC1
00010 ADC2
00011 ADC3
00100 ADC4
00101 ADC5
00110 ADC6
00111 ADC7
N/A
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
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
68
ADCSRA merupakan register 8 bit yang berfungsi melakukan manajemen sinyal
kontrol dan status dari ADC. Memiliki susunan dalam tabel 9.5.
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
Gambar 9.5. Register ADCSRA
Bit penyusunnya sebagai berikut:
a. ADEN merupakan bit pengatur aktivasi ADC. Bernilai awal 0. Jika bernilai 1,
maka ADC aktif.
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
selesai, sebuah interupsi akan dieksekusi.
f. ADPS[2..0] merupakan bit pengatur clock ADC. Bernilai awal 000. Detail nilai
bit dalam tabel 9.2.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
69
Tabel 9.3. Konfigurasi Prescaler ADC
ADPS2 ADPS1 ADPS0 Faktor Pembagi
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128
SFIOR merupakan register 8 bit pengatur sumber picu konversi ADC, apakah
dari picu eksternal atau dari picu internal. Susunannya dalam tabel 9.2.
ADTS2 ADTS1 ADTS0 – ACME PUD PSR2 PSR10 SFIOR
Gambar 9.6. Register SFIOR
ADTS[2..0] merupakan bit pengatur picu eksternal operasi ADC. Hanya
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
ACME, PUD, PSR2, dan PSR10 tidak diaktifkan.
.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
70
Tabel 9.4. Pemilihan Sumber Picu ADC
ADTS2 ADTS1 ADTS0 Sumber Picu
0 0 0 Mode Free Running
0 0 1 Komparator Analog
0 1 0 Interrupt External Request 0
0 1 1 Timer/Counter0 Compare Match
1 0 0 Timer/Counter0 Overflow
1 0 1 Timer/Counter1 Compare Match B
1 1 0 Timer/Counter1 Overflow
1 1 1 Timer/Counter1 Capture Event
Dalam proses pembacaan hasil konversi ADC, dilakukan pengecekan terhadap
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.
9.3. RANGKAIAN ADC ATMEGA DENGAN LED
Rangkaian minimum untuk membaca ADC dengan tempilan LED ditunjukan
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
dikirim atau diberi logika ‘0’.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
71
P7
GND
C1 22pF
SW2
12
P7
C2 22pF
P3
VCC
RST
VCC
JISP
HEADER 5
12345
1 2
P6
U4
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)1 2
1 2
R1
RST
C3 100nF1
P1
P5
VCC
P2
1 2
VCC
L11 2
1 2
X1
P6
1 2
1 2
P4
R2
POT
13
2
P0
P5
Gambar 9.7. Hasil pemasangan komponen ADC LED
9.4. PEMROGRAMAN ADC ATMEGA8535
Setelah rangkaian adc mikrokontroller ATMEGA8535 dibuat, maka sekarang
saatnya Anda membuat program yang digunakan untuk membaca ADC ATMEGA8535
dan menampilkan data ADC tersebut dengan menggunakan LED yang terhubung pada
PORT D yang konfigurasi rangkaian LED yaitu Common Anode (CA).
Program sebagai berikut ini
//-------------------------------------------------------//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;
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
72
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; } }
Cara kerja program:
Pada program ADC LCD, di perlukan deklarasi register untuk mikrokontroller
jenis ATMEGA8535. Setelah mendeklarasi register, maka program akan masuk ke
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
Common Anode (CA). Sintac DDRD = 0xFF merupakan ungkapan untuk
mendeklarasikan PORT D sebagai output. Sintac ini ADCSRA=0x87;
SFIOR&=0xEF berfungsi untuk mengisi register ADCSRA dan register SFIOR.
data_adc=read_adc(0)merupakan ungkapan untuk mendapatkan nilai adc 0.
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.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
73
9.5. RANGKAIAN ADC ATMEGA DENGAN LCD
Rangkaian minimum untuk membaca ADC dengan tempilan LCD ditunjukan
pada Gambar 9.9.
VCC
P7
VCC
D3
1N4002
AC
P2
PD4
RST
PD7
C1 22pF
GND
PD2PD5
R1
R12
POT
13
2
VCC
P4
P6
R14
POT
13
2
R18
POT
13
2
R15
POT
13
2
VCC
PD7
VCC
PD0
VCCC3 100nF
R13
POT
13
2
RST
X1
C2 22pF
VCC
P5P6
PD6
PD0
JISP
HEADER 5
12345
PD6
SW1
12
P7
P5
P3
P1
U1
ATMEGA8535
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
J16.
HEADER 16
123456789
10111213141516
PD1
R95k
R16
POT
13
2
PD2
PD4
P0
R11
POT
13
2
R17
POT
13
2
PD1
PD5
Gambar 9.8. Hasil pemasangan komponen ADC LCD
9.6. PEMROGRAMAN ADC ATMEGA8535 DENGAN LCD
Setelah rangkaian adc mikrokontroller ATMEGA8535 dibuat dan dihubungkan
dengan LCD, maka sekarang saatnya Anda membuat program yang digunakan untuk
membaca ADC ATMEGA8535 dan ditampilkan menggunakan LCD.
Program sebagai berikut ini
//-------------------------------------------------------//Program ADC LCD //-------------------------------------------------------#include <mega8535.h> #include <stdio.h> #include <delay.h> #include <math.h>
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
74
#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); } } }
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
75
Cara kerja program:
Pada program ADC LCD, di perlukan deklarasi register untuk mikrokontroller
jenis ATMEGA8535. Setelah mendeklarasi register, maka program akan masuk ke
dalam program utama. Program ini akan membaca adc 8 buah ATMEGA8535 yang
datanya akan ditampilkan dengan LCD. Sintac ini ADCSRA=0x87; SFIOR&=0xEF
berfungsi untuk mengisi register ADCSRA dan register SFIOR.
data_adc=read_adc(0)merupakan ungkapan untuk mendapatkan nilai adc 0.
Sintac suhu=data_adc merupakan ungkapan untuk menyimpan data adc. Kemudian
data tersebut di konversi menjadi desimal dengan sintac itoa(suhu,strSuhu).
Kemudian data tersebut akan ditampilkan melalui LCD.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
76
BAB X PWM ATMEGA8535
10.1. PENDAHULUAN
PWM (Pulse Width Modulation) dapat digunakan untuk mengatur kecepatan
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
dengan mikrokontroler memiliki beberapa keuntungan, seperti teknik pemrograman
yang sederhana, dan rangkaian listrik menjadi sederhana.
Mikrokontroler AVR ATMEGA8535 dapat digunakan sebagai pembangkit
gelombang PWM. Mikrokontroler AVR ATMEGA8535 mempunyai PWM yang telah
terintegrasi dalam chip. Keluaran dari PWM tersebut terdapat pada pin 15 (OC1). Untuk
menjalankan program PWM, diperlukan 3 unit register timer, yaitu:
a. Timer/Counter Control Register (TCCR), untuk menentukan mode PWM.
b. Timer/Counter Register (TCNT), digunakan untuk menentukan modulasi
frekuensinya.
c. Output Compare Register (OCR), untuk menentukan nilai siklus kerjanya.
Dalam mikrokontroler ATMEGA8535, terdapat beberapa mode PWM. Mode
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
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
77
akan berlogika rendah sampai nilai TOP tercapai kembali. Prinsip kerja dari Fast PWM
dapat dilihat pada Gambar 10.1.
nilai counter nilai OCR TOP
Keluaran
Gambar 10.1. Prinsip Kerja Mode Fast PWM
Untuk menghitung siklus kerja digunakan rumus:
%1001
xTOP
OCRD+
= ........................................10.1
Untuk menentukan frekuensi PWM dihitung dengan rumus:
)1( TOPN
ff clockPWM +
= ..........................................10.2
Sedangkan untuk menentukan resolusi PWM digunakan rumus:
.................................10.3
keterangan:
N adalah faktor prescaler (1, 8, 64, 256, atau 1024), dan
TOP adalah nilai tertinggi dari pengaturan counter.
10.2. RANGKAIAN PWM MIKROKONTROLLER
Rangkaian minimum untuk pwm melalui Port D.4 dan Port D.5 ditunjukan pada
Gambar 10.2. Rangkaian tersebut menggunakan diver motor dc yaitu transistor.
Rangkaian driver tersebut akan di hubungkan dengan pin D.4 dan pin D.5.
2log)1log( +
=TOPRPWM
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
78
5V
C3 100nF1
pinb.5
X1
5V
RST
R1
SW2
12
TIP9013
TIP3055
U1
ATMEGA8535
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
D2
DIODE
D1
DIODE
12V2
JISP
12345
pinb.7
C2 22pF
TIP9013
5V
pinb.7
pinb.6
470 TIP3055
pinb.6
470
MG2
MOTOR DC
12
MG2
MOTOR DC
12
RST
pinb.5
12V2
C1 22pF
Gambar 10.2. Hasil pemasangan komponen rangkaian minimum untuk pwm
10.3. PEMROGRAMAN PWM MIKROKONTROLLER
Setelah rangkaian dibuat dan dihubungkan dengan port mikrokontroller, maka
sekarang saatnya Anda membuat program yang digunakan untuk mengatur putaran
motor dc.
Program sebagai berikut ini
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
79
//-------------------------------------------------------//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; }
Cara kerja program:
Pada program ini perlukan deklarasi register untuk mikrokontroller
jenisATMEGA8535. Setelah mendeklarasi register, maka program akan masuk ke
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
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
80
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
sebagai input dengan menonaktifkan R-pullup internal.
Komparator analog memiliki dua tahap yaitu:
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)
Gambar 6.3. Blok diagram komparator analog
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
81
11.2. RANGKAIAN KOMPARATOR
Rangkaian komparator adalah rangkaian untukmembandingkan tegangan input
analog. Yang hasil pembadingan akan di keluarkan melalui LED.
1 2
VCC
1 2
1 2
P1
C1 22pF
JISP
HEADER 5
12345
R1
1 2
P7
P5
P7
VCC
VCC
1 2
R11
POT
13
2
P6
U4
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
X1
C2 22pF
RST
VCC
R2
POT
13
2
1 2
P0
C3 100nF1
VCC
L11 2
GND
1 2
P5
SW2
12
P6
P4P3P2
RST
Gambar 11.1. Rangkaian komparator analog mikrokontroller
11.3. PEMROGRAMAN KOMPARATOR ANALOG
Setelah membuat rangkaian komparator analog mikrokontroller, maka sekarang
saatnya Anda membuat program komparator analog mikrokontroller.
Program sebagai berikut ini
//-------------------------------------------------------//Program KOMPARATOR //-------------------------------------------------------#include <stdio.h> #include <mega8535.h> #include <delay.h> void InisialisasiCOMPARATOR (); void main() { DDRD=0xFF; InisialisasiCOMPARATOR();
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
82
#asm("sei") while(1) { if (ACSR.5==0) {PORTD=0;} else {PORTD=0xff;} } } void InisialisasiCOMPARATOR () { ACSR=0x20; SFIOR=0x00; }
Cara kerja program:
Pada program Bab 10.1. komparator analog, di perlukan deklarasi
register untuk mikrokontroller jenis AT90S2313. Setelah mendeklarasi register, maka
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
akan membandingkan antara komparator analog 1 dan komparator analog 2. Jika
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.
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
83
BAB XII EEPROM
12.1. PENDAHULUAN
EEPROM (Electrically Eraseble Programmable Read Only Memori) adalah
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
diubah saat program berjalan.
12.2. EEPROM ATMEGA8535
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
Data Register (EEDR).
– – – – – – - EEAR8
EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0
EEARH EEARL
Gambar 12.1. Register EEAR
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
Gambar 12.2. Register EEDR
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
Gambar 12.3. Register EEDR
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
84
EECR (EEPROM Control Register) digunakan untuk mengontrol operasi dari
EEPROM. Bit penyusunnya dapat dijelaskan sebagai berikut:
Bit 7..4: Bit tidak digunakan
Bit 3: EERIE (EEPROM Ready Interrupt Enable)
Bit 2: EEMWE (EEPROM Master Write Enable)
Bit 1: EEWE (EEPROM Write Eneble)
Bit 0: EERE (EEPROM Read Enable)
12.3. RANGKAIAN EEPROM ATMEGA8535
Rangkaian berikut digunakan untuk membaca dan menulis data eeprom
ATMEGA8535. Rangkaian tersebut menggunakan port.A sebagai output yang
dihubungkan dengan LCD.
P7
P3
PD4
VCC
PD2
P0
VCC
RST
PD1
P7
PD7
U4
ATMEGA16
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
VCC
PD5
C3 100nF1
GND
X1
VCC
P5
VCC
J16.
HEADER 16
123456789
10111213141516
D3
1N4002
AC
R95k PD0
JISP
HEADER 5
12345
P6
SW2
12
P1
P5
C2 22pF
P6
C1 22pF
RST
R1
PD6
P4
VCC
P2
Gambar 12.4. Rangkaian membaca dan mengisi eeprom
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
85
12.3.1. PEMROGRAMAN MEMBACA DAN MENGISI EEPROM
Setelah membuat rangkaian compas, maka sekarang saatnya Anda membuat
program yang digunakan untuk membaca arah dari compas dan ditampilkan di LCD.
Program sebagai berikut ini
//------------------------------------------------------- //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 }; }
UNIVERSITAS MUHAMMADIYAH YOGYAKARTA
86
Cara kerja program:
Pada program EEPROM, di perlukan deklarasi register untuk mikrokontroller
jenis ATMEGA8535. Setelah mendeklarasi register, maka program akan masuk ke
dalam program utama. Pada program utama pertama mendeklarasikan LCD.
Kemudian program menyimpan data 55 ke eeprom. Fungsi i=*ptr_to_eeprom;
berfungsi untuk memanggil data eeprom.