Anda di halaman 1dari 184

Microcontroller ATMEGA8535 Trainer Kit Experiment

Manual

PETUNJUK PRAKTIKUM
MIKROKONTROLLER AVR

Oleh:
Triwiyanto

Media Pengembangan
Mikrokontroler
AVR dengan CodeVision

JURUSAN TEKNIK ELEKTROMEDIK


Petunjuk Praktikum AVR-Triwiyanto

Page 1

POLTEKKES KEMENKES SURABAYA


2011
PERCOBAAN 1
LED
I.

Pendahuluan

Pada praktikum ini, anda akan mempelajari cara mengembangkan sebuah system
menggunakan

mikrokontroler

AVR

buatan

CodeVisionAVR.CodeVisionAVR merupakan

Atmel

software

menggunakan
C-cross

software

compiler, dimana

program dapat ditulis menggunakan bahasa-C. Dengan menggunakan pemrograman


bahasa-C diharapkan waktu disain (deleloping time) akan menjadi lebih singkat. Setelah
program dalam bahasa-C ditulis dan dilakukan kompilasi tidak terdapat kesalahan
(error) maka proses download dapat dilakukan. Pada percobaan ini anda akan
mengendalikan LED ON dan OFF.

II.

Tujuan
Setelah menyelesaikan praktikum ini, yang anda peroleh adalah :
1. dapat menjelaskan arsitektur umum dan keistimewaan dari mikrokontroler
AVR ATmega8535.
2. dapat

menceritakan

kembali

alur

pengembangan

software

pada

mikrokontroler AVR menggunakan CodeVisionAVR.


3. dapat menggunakan fungsi output pada mikrokontroler AVR 4. dapat
mengerjakan tugas yang diberikan dengan bahasa-C.

III.

Dasar Teori
Port Sebagai Input / Output Digital
Atmega 8535 mempunyai empat buah port yang bernama PortA, PortB, PortC,

dan PortD. Keempat port tersebut merupakan jalur bi-directional dengan pilihan internal
pull-up.
Tiap port mempunyai tiga buah register bit, yaitu DDxn, PORTxn, dan PINxn.

Petunjuk Praktikum AVR-Triwiyanto

Page 2

Huruf x mewakili nama huruf dari port sedangkan huruf n mewakili nomor bit. Bit DDxn
terdapat pada I/O address DDRx, bit PORTxn terdapat pada I/O address PORTx, dan
bit PINxn terdapat pada I/O address PINx. Bit DDxn dalam register DDRx (Data
Direction Register) menentukan arah pin. Bila DDxn diset 1, maka Px berfungsi sebagai
pin output. Bila DDxn diset 0 maka Px berfungsi sebagai pin input. Bila PORTxn diset 1
pada saat pin terkonfigurasi sebagai pin input, maka resistor pull-up akan diaktifkan.
Untuk mematikan resistor pull-up, PORTxn harus diset 0 atau pin dikonfigurasi sebagai
pin output. Pin port adalah tri-state setelah kondisi reset. Bila PORTxn diset 1 pada saat
pin terkonfigurasi sebagai pin output maka pin port akan berlogika 1. Dan bila PORTxn
diset 0 pada saat pin terkonfigurasi sebagai pin output maka pin port akan berlogika 0.
Saat mengubah kondisi port dari kondisi tri-state (DDxn=0, PORTxn=0) ke
kondisi output high (DDxn=1, PORTxn=1) maka harus ada kondisi peralihan apakah itu
kondisi pull-up enabled (DDxn=0, PORTxn=1) atau kondisi output low (DDxn=1,
PORTxn=0). Biasanya, kondisi pull-up enabled dapat diterima sepenuhnya, selama
lingkungan impedansi tinggi tidak memperhatikan perbedaan antara sebuah strong high
driver dengan sebuah pull-up. Jika ini bukan suatu masalah, maka bit PUD pada register
SFIOR dapat diset 1 untuk mematikan semua pull-up dalam semua port. Peralihan dari
kondisi input dengan pull-up ke kondisi output low juga menimbulkan masalah yang
sama. Maka harus menggunakan kondisi tri-state (DDxn=0, PORTxn=0) atau kondisi
output

high

(DDxn=1,

PORTxn=0)
kondisi

sebagai

transisi.

Tabel

Konfigurasi Pin Port

Tabel diatas menunjukkan konfigurasi pin pada portport mikrokontroler. Bit 2 PUD =
Pull-up Disable, bila bit diset bernilai 1 maka pull-up pada port I/O akan dimatikan

Petunjuk Praktikum AVR-Triwiyanto

Page 3

walaupun register DDxn dan PORTxn dikonfigurasikan untuk menyalakan pull-up


(DDxn=0, PORTxn=1).
Codevision AVR
Pemrograman mikrokontroler AVR lebih mudah dilakukan dengan bahasa
pemrograman C, salah satu

software pemrograman AVR mikrokontroler adalah

Codevision AVR C Compiler. Dengan C AVR program yang telah di tulis selanjutnya
dicompile agar diperoleh bentuk hexadesimal dengan bentuk file *.hex. bentuk hexa
inilah yang akan dapat di download ke mikrokontroller.

Petunjuk Praktikum AVR-Triwiyanto

Page 4

Memulai project dengan C AVR

File > New > Pilih Project > OK


Use codeWizardAVR? >NO<
Kemudian simpan project. Dan muncul jendela berikut

Pada colom C compiler, di bagian chip pilih


mikrokontroller yang digunakan (Atmega8535)
berikut juga crystal nya(12 Mhz). OK

Langkah selanjutnya yaitu, membuat file tempat penulisan source code yang ber ektensi
.c. yaitu, pilih File > New > Pilih Source > OK.

Petunjuk Praktikum AVR-Triwiyanto

Page 5

Kemudian, ketikkan dulu satu atau beberapa baris listing program, kemudian simpan
File > Save ], dengan ekstensi .c.

Langkah selanjutnya adalah meng-include file source code listing program tadi kedalam
project yang kita buat, caranya adalah.. Pilih Project > Configure

Kemudian pilih > Add > masukkkan/ open file ber-ekstensi .c yang tadi di save.

Fungsi Delay
Menghasilkan delay dalam program-C. Berada pada header delay.h yang harus
diIncludekan sebelum digunakan. Sebelum memanggil fungsi, interrupsi harus dimatikan
terlebih dahulu, bila tidak maka delay akan lebih lama dari yang diharapkan. Juga
sangat penting untuk menyebutkan frekuensi clock chip IC AVR yang digunakan pada
menu Project-Configure-C Compiler-Code Generation.

Petunjuk Praktikum AVR-Triwiyanto

Page 6

Fungsi delay yang disediakan adalah: void


delay_us(unsigned int n) menghasilkan delay selama n detik, n adalah nilai konstan
void delay_ms(unsigned int n) menghasilkan delay selama
n mili-detik, n adalah nilai konstan

IV.

Peralatan
1. 1 set PC yang dilengkapi dengan software CodeVision AVR.
2. set development board AVR ATmega8535
3. 1 power-supply +5VDC

V.

Prosedure Percobaan

R8
220

D8

Petunjuk Praktikum AVR-Triwiyanto

Page 7

1. Percobaan LED ON
Pada percobaan ini akan menghidupkan LED sejumlah 4 buah

#include <mega8535.h> void main(void)


{
DDRC=0xFF;
PORTC=0x0F;
}

2. Percobaan LED On/ Off dengan fungsi delay


Pada percobaan ini LED akan ON dan OFF dengan waktu tunda tertentu,
yang ditentukan dengan fungsi delay_ms.
#include <mega8535.h> #include <delay.h>
void main(void)
{
DDRC= 0xFF;
while (1)
{

Petunjuk Praktikum AVR-Triwiyanto

Page 8

PORTC=0xFF; delay_ms(1000);
PORTC=0x00;
delay_ms(1000);
}
}

3. Percobaan LED dengan data Tabel


Pada percobaan ini kombinasi display LED yang ON ditentukan berdasarkan
table pada array urutan[8] dengan perpindahan satu pola ke pola yang
lainnya berdasarkan delay.
#include <mega8535.h>
#include <delay.h>
void main(void)
{
char urutan[8]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
char i;
DDRC=0xFF;
PORTC=0xFF;
while(1)
{
for (i=0;i<8;i++)
{
PORTC=urutan[i];
delay_ms(1000);
}
}
}

Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas dalam bentuk PDF,
dengan uraian meliputi:
a. Gambar rangkaian dan penjelasannya
b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas
c. Jelaskan masing-masing program tersebut diatas.
d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu
Petunjuk Praktikum AVR-Triwiyanto

Page 9

e. Gambar Simulasi percobaan tersebut dengan dengan menggunakan


Proteus, file gambar di PASTE pada laporan praktikum.
2. Buatlah rangkaian programmer per individu (waktu 2 minggu)
3. Buatlah rangkaian minimum system AVR, bagilah berdasarkan jumlah pin (
ATtiny 15, 2313, ATMEGA8, ATMEGA8535 ) per individu. Minimum system berisi
LED, SW, motor DC, Buzzer (waktu 2 minggu)

PERCOBAAN 2
S W Push Button
I.

Pendahuluan

Petunjuk Praktikum AVR-Triwiyanto

Page 10

Pada praktikum ini, anda akan mempelajari cara mengembangkan sebuah


system menggunakan mikrokontroler AVR buatan Atmel menggunakan software
CodeVisionAVR.. CodeVisionAVR merupakan software C-cross compiler, dimana
program

dapat

ditulis

menggunakan

bahasa-C.

Dengan

menggunakan

pemrograman bahasa-C diharapkan waktu disain (deleloping time) akan menjadi


lebih singkat. Setelah program dalam bahasa-C ditulis dan dilakukan kompilasi
tidak terdapat kesalahan (error) maka proses download dapat dilakukan. Pada
percobaan ini anda akan mengendalikan LED dengan menggunakan Saklar Push
Button.

II.

Tujuan
Setelah menyelesaikan praktikum ini, yang anda peroleh adalah :
1. Dapat

menjelaskan

arsitektur

umum

dan

keistimewaan

dari

mikrokontroler AVR ATmega8535.


2. Dapat menceritakan kembali alur pengembangan software pada
mikrokontroler AVR menggunakan CodeVisionAVR.
3. Dapat menggunakan fungsi input/ output pada mikrokontroler AVR
4. Dapat mengerjakan tugas yang diberikan dengan bahasa-C.

III.Dasar
Teori
R8
220

D8

Gambar 2.1. Rangkaian LED terhubung ke PORTC


Petunjuk Praktikum AVR-Triwiyanto

Page 11

Gambar 2.2. Rangkaian Push Button terhubung ke PORTB

(a)

(b)

Gambar 2.3. Konfigurasi PORTB dan PORTC pada CodeVision


IV.

Peralatan
1. 1 set PC yang dilengkapi dengan software CodeVision AVR.
2. set development board AVR ATmega8535
3. 1 power-supply +5VDC

V.

Prosedure Percobaan

Petunjuk Praktikum AVR-Triwiyanto

Page 12

1. Percobaan Input/Ouput
Pada percobaan
ini PORTB difungsikan sebagai input dan PORTC
difungsikan sebagai output.
#include <mega8535.h> void main(void)
{
DDRC=0xFF;
DDRB=0x00; PORTB=0xFF;
while (1)
{
PORTC=PINB;
}}

2. Percobaan Input/ Output dengan fungsi BIT.


Pada percobaan ini, anda akan belajar bagaimana mengambil data per bit. Dengan
menggunakan instruksi PINB.X, dengan X adalah nilai bit.

#include <mega8535.h>
void main(void)
{
DDRC=0xFF;
DDRB=0x00;
PORTB=0xFF;
while(1)
{
if (PINB.0==0) {PORTC=0x01;}
else if (PINB.1==0){PORTC=0x02;}
else if (PINB.2==0){PORTC=0x04;}
else if (PINB.3==0){PORTC=0x08;}
else {PORTC=0x00;}
}
}

3. Percobaan SW dengan pemilihan kombinasi LED


Pada percobaan ini anda akan mengambil data dengan menggunakan SW push
button, setiap penekanan SW akan menampilkan pola LED tertentu.
Petunjuk Praktikum AVR-Triwiyanto

Page 13

Petunjuk Praktikum AVR-Triwiyanto

Page 14

#include <mega8535.h>
#include <delay.h>
//declare global arrays for two patterns unsigned
char p1[4] = { 0b10000001,
0b01000010,
0b00100100,
0b00011000 };
unsigned char p2[4] = { 0b11111111,
0b01111110,
0b00111100,
0b00011000 }; void main()
{ unsigned char i;
//loop
counter
DDRC = 0xFF;
PORTC= 0x00;
DDRB = 0x00;
PORTB.0 = 1;
PORTB.1 = 1;

//PB as output
//keep all LEDs off
//PC as input
//enable pull ups for
//only first two pins

while(1)
{
//# if SW0 is pressed show pattern 1
if(PINB.0==0)
{
for(i=0;i<3;i++)
{
PORTC=p1[i]; //output data
delay_ms(300); //wait for some time
}
PORTC=0;
//turn off all LEDs
}
//# if SW1 is pressed show pattern 2
if(PINB.1==0)

Petunjuk Praktikum AVR-Triwiyanto

Page 15

{
for(i=0;i<3;i++)
{
PORTC=p2[i]; //output data
delay_ms(300); //wait for some time
}
PORTC=0;
//turn off all LEDs
}
};
}

Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk
PDF, dengan uraian meliputi
a. Gambar rangkaian dan penjelasannya
b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas
c. Jelaskan masing-masing program tersebut diatas.
d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu
2. Rancanglah aplikasi dari minimum system yang sudah anda buat tersebut untuk
keperluan elektronika medic, dalam bentuk gambar di Proteus dikerjakan per
individu (waktu 1 minggu, dikumpulkan minggu depan)

Petunjuk Praktikum AVR-Triwiyanto

Page 16

PERCOBAAN 3
DISPLAY 7 SEGMEN
I.

Pendahuluan
Pada percobaan ini akan menggunakan display 7 segmen sebanyak 8 buah,
dengan menggunakan scanning data, maka jumlah port yang dibutuhkan menjadi
sedikit. Display 7 segmen yang digunakan pada percobaan ini adalah 7
segmen common anoda, dengan driver transistor PNP dan decoder 74LS138
untuk scanning 7 segmen..

II.

Tujuan
Setelah menyelesaikan praktikum ini, yang anda peroleh adalah :
1. Dapat

menceritakan

kembali

alur

pengembangan

software

pada

mikrokontroler AVR menggunakan CodeVisionAVR.


2. Dapat menggunakan fungsi output pada mikrokontroler AVR dengan
interface ke 7 segmen common anoda
3. Dapat mengerjakan tugas yang diberikan dengan bahasa-C.
III.

Dasar Teori

Tabel kebenaran 74LS138


SELEKTOR
C
0
0
0
0
1
1
1
1

B
0
0
1
1
0
0
1
1

A
0
1
0
1
0
1
0
1

ENABLE
G1 /G2A
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0

/G2B
0
0
0
0
0
0
0
0

OUTPUT
Y0
0
1
1
1
1
1
1
1

Y1
1
0
1
1
1
1
1
1

Y2
1
1
0
1
1
1
1
1

Y3
1
1
1
0
1
1
1
1

Y4
1
1
1
1
0
1
1
1

Y5
1
1
1
1
1
0
1
1

Y6
1
1
1
1
1
1
0
1

Y7
1
1
1
1
1
1
1
0

1. Pada tabel kebenaran tersebut tampak bahwa seven segmen yang hidup tergantung
pada output dari dekoder 74LS138, yang sedang mengeluarkan logika low 0,
sehingga dari 8 buah display tersebut, selalu hanya satu display yang akan
Petunjuk Praktikum AVR-Triwiyanto

Page 17

dihidupkan. Agar display tampak nyala secara bersamaan maka ketiga display
tersebut harus dihidupkan secara bergantian dengan waktu tunda tertentu.
2. Pada gambar tersebut seven segment commont anoda dikendalikan dengan
menggunakan transistor PNP melalui decoder 74LS138, apabila ada logika low pada
basis transistor, maka 7 segment akan nyala dan sebaliknya akan padam.

Gambar 3.1. Modul 7 Segment tunggal


Tabel Data Display 7 Segmen
P0.6
g
1
1
0
0

P0.5
f
0
1
1
1

P0.4
e
0
1
0
1

P0.3
d
0
1
0
0

P0.2
c
0
0
1
0

P0.1
b
0
0
0
0

P0.0
a
0
1
0
0

0
0
1

0
0
0

0
0
0

1
0
0

0
0
1

0
1
1

0
1
0

Display
0
1
2
3
:
:
A
b
C
:

Pada tabel tersebut tampak bahwa untuk menghidupkan sebuah segmen, harus
dikirimkan data logika low 0 dan sebaliknya untuk mematikan segmen, harus dikirimkan
data logika high 1.

Petunjuk Praktikum AVR-Triwiyanto

Page 18

Gambar 3.3. Rangkaian decoder dan driver 7 Segmen

IV.

Peralatan
1. 1 set PC yang dilengkapi dengan software CodeVision AVR.
2. set development board AVR ATmega8535
3. 1 power-supply +5VDC

Petunjuk Praktikum AVR-Triwiyanto

Page 19

V.

Prosedure Percobaan
1. Percobaan Display 7 Segmen
Pada percobaan ini anda akan belajar bagaimana mencetak sebuah karakter ke
7 segmen, konversi data decimal ke 7 segmen, menggunakan fungsi SWITCH.
a. Konfigurasi pada Code Vision

Gambar 3.4. Konfigurasi PORTC dan PORTD

Petunjuk Praktikum AVR-Triwiyanto

Page 20

b. Listing Program
#include <mega8535.h>
#include<delay.h>
unsigned char data; void
convert(){
switch(data)
{
//
gfedcba
case 0:
PORTC=0b11000000;break;
case 1:
PORTC=0b11111001;break;
case 2:
PORTC=0b10100100;break;
case 3:
PORTC=0b10110000;break;
case 4:
PORTC=0b10011001;break;
case 5:
PORTC=0b10010010;break;
case 6:
PORTC=0b10000010;break;
case 7:
PORTC=0b11111000;break;
case 8:
PORTC=0b10000000;break;
case 9:
PORTC=0b10010000;break;
default:
PORTC=0xff;
}
}
void main (void)
{
DDRC=DDRD=PORTC=0xff;
PORTD.5=1;
PORTD.6=1;
PORTD.7=1; while(1)
{
data=5;
convert();
}
}

Petunjuk Praktikum AVR-Triwiyanto

Page 21

2. Percobaan Display 7 segmen increment data 0 sd 9 Pada percobaan ini data


ditampilkan ke sebuah 7 segmen, data ditampilkan secara berurutan mulai dari 0 sd 9,
dengan waktu tunda 1 detik. Untuk setiap kenaikan angka.
a. Konfigurasi Code Vision

Gambar 3.5. Konfigurasi PORTC dan PORTD

b. Listing Program
#include <mega8535.h>
#include<delay.h>
unsigned char data; void
convert(){
switch(data)
{
//
gfedcba
case 0:
PORTC=0b11000000;break;
case 1:
PORTC=0b11111001;break;
case 2:
PORTC=0b10100100;break;
case 3:
PORTC=0b10110000;break;
case 4:
PORTC=0b10011001;break;
case 5:
PORTC=0b10010010;break;

Petunjuk Praktikum AVR-Triwiyanto

Page 22

case 6:
PORTC=0b10000010;break;
case 7:
PORTC=0b11111000;break;
case 8:
PORTC=0b10000000;break;
case 9:
PORTC=0b10010000;break;
default:
PORTC=0xff;
}
}
void main (void)
{
DDRC=DDRD=PORTC=0xff;
PORTD.5=1;
PORTD.6=1;
while(1)
{
convert();
data=data+1;
if(data==10){data=0;};
delay_ms(1000);
}
}

3. Display 7 Segmen dengan Simulasi Setting data


Pada percobaan ini anda akan belajar bagaimana mensimulasikan setting data
dengan display pada 7 segmen. a. Konfigurasi Codevision

Petunjuk Praktikum AVR-Triwiyanto

Page 23

Gambar 3.6. Konfigurasi pada PORTC, PORTD dan PORTB

b. Listing program
Petunjuk Praktikum AVR-Triwiyanto

Page 24

#include
<mega8535.h>
#include
<delay.h>
void
convert();
int
data,dataTemp,dataPul,dataSat;
void
main(void)
{
DDRC=0xFF;
DDRB=0x00;
PORTB=0xFF;
PORTC=0xFF; DDRD=0xFF;
data=00;
while(PINB.2==1)
{
if (PINB.0==0)
{
data=data+1;
}
else if (PINB.1==0)
{
data=data-1;
}
dataTemp=data;
dataSat = dataTemp % 10;
dataPul = dataTemp / 10;

// sat = sisa dari data dibagi 10

dataTemp=dataSat; convert();
PORTD.5=1; PORTD.6=0;
delay_ms(30);
dataTemp=dataPul;
PORTD.5=0;
PORTD.6=0;

Petunjuk Praktikum AVR-Triwiyanto

convert();

Page 25

delay_ms(30);
}
PORTC=0x00;
delay_ms(2000);
}
void convert(){
switch(dataTemp)
{
//
pg fe dcba
case 0:
PORTC=0b11000000;break;
case 1:
PORTC=0b11111001;break;
case 2:
PORTC=0b10100100;break;
case 3:
PORTC=0b10110000;break;
case 4:
PORTC=0b10011001;break;
case 5:
PORTC=0b10010010;break;
case 6:
PORTC=0b10000010;break;
case 7:
PORTC=0b11111000;break;
case 8:
PORTC=0b10000000;break;
case 9:
PORTC=0b10010000;break;
default:
PORTC=0xff;
}
}

Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk
PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan
b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas
c. Jelaskan masing-masing program tersebut diatas.
d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu
e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum
2. Presentasi rangkaian untuk tugas minimum system aplikasi dibidang elektronika
medic, sesuai penugasan minggu II
Petunjuk Praktikum AVR-Triwiyanto

Page 26

PERCOBAAN 4
LCD KARAKTER 2 X 16
I.

Pendahuluan

Pada percobaan ini anda akan mempelajari interface LCD (liquid crystal display )
dengan mikrokontroller. LCD merupakan komponen display yang dapat menampilkan
berbagai macam karakter. Jenis LCD ada berbagai macam, dan yang paling sering
digunakan adalah LCD Karakter 2 x 16. Pada percobaan iini akan menggunakan LCD
karakter 2 x16, dengan interface pada PORTC, Codevision menyediakan fungsi-fungsi
untuk keperluan pengelolaan LCD.
II.

Tujuan
Setelah menyelesaikan praktikum ini, yang anda peroleh adalah :
1. Dapat

menceritakan

kembali

alur

pengembangan

software

pada

mikrokontroler AVR menggunakan CodeVisionAVR.


2. Dapat menggunakan fungsi output pada mikrokontroler AVR dengan
interface ke LCD Karakter 2 x 16
3. Dapat mengerjakan tugas-tugas yang diberikan dengan bahasa-C.

III.

Teori

Modul LCD Character dapat dengan mudah dihubungkan dengan mikrokontroller seperti
AT89S51. LCD yang akan kita praktikumkan ini mempunyai lebar display 2 baris 16
kolom atau biasa disebut sebagai LCD Character 2x16, dengan 16 pin konektor, yang
didifinisikan sebagai berikut:

Petunjuk Praktikum AVR-Triwiyanto

Page 27

Gambar 4.2. Modul LCD Karakter 2x16

Tabel 4.1 Pin dan Fungsi


PIN

Name

Function

VSS

Ground voltage

VCC

+5V

VEE

Contrast voltage

RS

Register Select
0 = Instruction Register
1 = Data Register

R/W

Read/ Write, to choose write or read mode


0 = write mode
1 = read mode

DB0

LSB

DB1

DB2

10

DB3

11

DB4

12

DB5

13

DB6

Enable
0 = start to lacht data to LCD character
1= disable

Petunjuk Praktikum AVR-Triwiyanto

Page 28

14

DB7

MSB

15

BPL

Back Plane Light

16

GND

Ground voltage

Display karakter pada LCD diatur oleh pin EN, RS dan RW:
Jalur EN dinamakan Enable. Jalur ini digunakan untuk memberitahu LCD bahwa anda
sedang mengirimkan sebuah data. Untuk mengirimkan data ke LCD, maka melalui
program EN harus dibuat logika low 0 dan set pada dua jalur kontrol yang lain RS dan
RW. Ketika dua jalur yang lain telah siap, set EN dengan logika 1 dan tunggu untuk
sejumlah waktu tertentu ( sesuai dengan datasheet dari LCD tersebut ) dan berikutnya
set EN ke logika low 0 lagi.
Jalur RS adalah jalur Register Select. Ketika RS berlogika low 0, data akan dianggap
sebagi sebua perintah atau instruksi khusus ( seperti clear screen, posisi kursor dll ).
Ketika RS berlogika high 1, data yang dikirim adalah data text yang akan ditampilkan
pada display LCD. Sebagai contoh, untuk menampilkan huruf T pada layar LCD maka
RS harus diset logika high 1.
Jalur RW adalah jalur kontrol Read/ Write. Ketika RW berlogika low (0), maka informasi
pada bus data akan dituliskan pada layar LCD. Ketika RW berlogika high 1, maka
program akan melakukan pembacaan memori dari LCD. Sedangkan pada aplikasi
umum pin RW selalu diberi logika low 0.
Pada akhirnya, bus data terdiri dari 4 atau 8 jalur ( bergantung pada mode operasi yang
dipilih oleh user ). Pada kasus bus data 8 bit, jalur diacukan sebagai DB0 s/d DB7.

Beberapa perintah dasar yang harus dipahami adalah inisialisasi LCD Character,
Function Set
Mengatur interface lebar data, jumlah dari baris dan ukuran font karakter
KONTROL
Petunjuk Praktikum AVR-Triwiyanto

DATA
Page 29

RS

EN

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

pulse

DL

CATATAN:
X : Dont care
DL: Mengatur lebar data
DL=1, Lebar data interface 8 bit ( DB7 s/d DB0)
DL=0, Lebar data interface 4 bit ( DB7 s/d DB4)
Ketika menggunakan lebar data 4 bit, data harus dikirimkan dua kali
N=1, Display dua baris
N=0, Display satu baris
Entry Mode Set
Mengatur increment/ decrement dan mode geser
KONTROL

DATA

RS

EN

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

pulse

I/D

Catatan:
I/D: Increment/ decrement dari alamat DDRAM dengan 1 ketika kode karakter dituliskan
ke DDRAM.
I/D = 0, decrement
I/D= 1, increment
S: Geser keseluruhan display kekanan dan kekiri
S=1, geser kekiri atau kekanan bergantung pada I/D
S=0, display tidak bergeser
Display On/ Off Cursor
Mengatur status display ON atau OFF, cursor ON/ OFF dan fungsi Cursor Blink

Petunjuk Praktikum AVR-Triwiyanto

Page 30

KONTROL

DATA

RS

EN

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

pulse

D : Mengatur display
D = 1, Display is ON
D = 0, Display is OFF
Pada kasus ini data display masih tetap berada di DDRAM, dan dapat ditampilkan
kembali secara langsung dengan mengatur D=1.
C : Menampilkan kursor
C = 1, kursor ditampilkan
C = 0, kursor tidak ditampilkan
B : Karakter ditunjukkan dengan kursor yang berkedip
B=1, kursor blink
Clear Display
Perintah ini hapus layar
KONTROL

DATA

RS

EN

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

pulse

Geser Kursor dan Display


Geser posisi kursor atau display ke kanan atau kekiri tanpa menulis atau baca data
display. Fungsi ini digunakan untuk koreksi atau pencarian display
KONTROL

DATA

RS

EN

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

pulse

D/C

R/L

Petunjuk Praktikum AVR-Triwiyanto

Page 31

Catatan : x = Dont care


D/C

R/L

Note

Geser posisi kursor ke kiri

Geser posisi kursor ke kanan

Geser keseluruhan display ke kiri

Geser keseluruhan display ke kanan

Memori LCD
1. DDRAM ( Display Data RAM )
Memori DDRAM digunakan untuk menyimpan karakter yang akan ditampilkan. Semua
teks yang kita tuliskan ke modul LCD adalah disimpan didalam memory ini, dan modul
LCD secara berturutan membaca memory ini untuk menampilkan teks ke modul LCD itu
sendiri.

Gambar 4.3. Lokasi memori display LCD Karakter


Pada peta memori tersebut, daerah yang berwarna kuning ( 00 s/d 0F dan 40 s/d 4F )
adalah display yang tampak. Sebagaimanan yang anda lihat, jumlahnya sebanyak 16
karakter per baris dengan dua baris. Angka pada setiap kotak adalah alamat memori
yang bersesuaian dengan posisi dari layar. Demikianlah karakter pertama di sudut kiri
Petunjuk Praktikum AVR-Triwiyanto

Page 32

atas adalah menempati alamah 00h. Posisi karakter berikutnya adalah alamat 01h dan
seterusnya.
INISIALISASI
Sebelum kita dapat menggunakan modul LCD, kita harus melakukan inisialisasi dan
mengkonfigurasikannya. Hal ini dijalankan dengan mengirimkan sejumlah instruksi ke
LCD. Antara lain: pengaturan lebar data interface 8 bit atau 4 bit data bus, pemilihan
ukuran font karakter 5x8 atau 5x7 dan lain-lain, dengan instruksi sebagai berikut.

Gambar 4.4. Konfigurasi Codevision dan koneksi hardware

Fungsi LCD
Fungsi LCD terletak pada header lcd.h yang harus di-include-kan sebelum digunakan.
Sebelum melakukan include terlebih dahulu sebutkan port mikrokontroller yang akan
dihubungkan ke LCD. Hal ini juga dapat dengan mudah dilakukan dengan menggunakan
CodeWizardAVR.
/* modul LCD dihubungkan dengan PORTC */
#asm
.equ __lcd_port=0x15
#endasm
Petunjuk Praktikum AVR-Triwiyanto

Page 33

/* sekarang fungsi LCD dapat di-include*/


#include <lcd.h>

Fungsi-fungsi untuk mengakses LCD diantaranya adalah :

a. unsigned char lcd_init(unsigned char lcd_columns)


Untuk menginisialisasi modul LCD, menghapus layar dan meletakkan posisi karakter
pada baris ke-0 kolom ke-0. Jumlah kolom pada LCD harus disebutkan (misal, 16).
Kursor tidak ditampakkan. Nilai yang dikembalikan adalah 1 bila modul LCD terdeteksi,
dan bernilai 0 bila tidak terdapat modul LCD. Fungsi ini harus dipanggil pertama kali
sebelum menggunakan fungsi yang lain.
b. void lcd_clear(void)
Menghapus layar LCD dan meletakkan posisi karakter pada baris ke-0 kolom ke-0.

c. void lcd_gotoxy(unsigned char x, unsigned char y)


Meletakkan posisi karakter pada kolom ke-x baris ke-y. Nomor baris dan kolom
dimulai dari nol.

d. void lcd_putchar(char c)
Menampilkan karakter c pada LCD.

e. void lcd_puts(char *str)


Menampilkan string yang disimpan pada SRAM pada LCD.
2. Peralatan
1. 1 set PC yang dilengkapi dengan software CodeVision AVR.
2. set development board AVR ATmega8535
3. 1 power-supply +5VDC

V. Prosedur Percobaan
1. Percobaan Cetak Karakter pada baris 1
Petunjuk Praktikum AVR-Triwiyanto

Page 34

#include <mega8535.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
//
#include <lcd.h> // Declare your global variables here
void main(void)
{ PORTB=0xFF;
DDRB=0x00;
// LCD module initialization lcd_init(16);
while (1) {
lcd_gotoxy(0,0);
lcd_putsf("Selamat Datang");
}
}

2. Percobaan manipulasi nilai

Petunjuk Praktikum AVR-Triwiyanto

Page 35

#include <mega8535.h>
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
// Alphanumeric LCD Module functions bisa di copy dari codeWizard CAVR
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
int LCD;
char lcd_buffer[33];
unsigned char x,y,hasil,hasil_1,hasil_2; void
main (void)
{
//PORT initialization as input or output
DDRA=DDRB=0x00;
DDRC=DDRD=PORTB=0xFF;
PORTA=PORTC=0x00;
LCD=1;
lcd_init(16); // inisialisasi lcd, kolom modul lcd =16.
lcd_gotoxy(0,0);
// ke kolom x=0 dan baris y=0
lcd_putsf("Ngetes LCD"); //menampilkan tulisan Ngetes LCD
lcd_gotoxy(0,1);
// kebaris ke 2 y=1
lcd_putsf("Program C &
AVR"); delay_ms(1500);
x=1;y=1;
ulang:
//label ulang
hasil=x+y;
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"hsl:%i",hasil);
lcd_puts(lcd_buffer); lcd_gotoxy(8,0);
sprintf(lcd_buffer,"hsl-1:%i",hasil_1);
lcd_puts(lcd_buffer); lcd_gotoxy(0,1);
sprintf(lcd_buffer,"hsl-2:%i",hasil_2);
lcd_puts(lcd_buffer);
hasil_2=hasil_1; hasil_1=hasil;
x++; delay_ms(500);
goto ulang;
//kelabel ulang }

Petunjuk Praktikum AVR-Triwiyanto

Page 36

Pada program diatas, terdapat beberapa perintah..


#include <lcd.h>

//meng-include kan fungsi-fungsi lcd

// Alphanumeric LCD Module functions bisa di copy dari codeWizard CAVR


// inisialisasi lcd dipasang diport mana
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
lcd_init(16);

//inisialisasi lcd, yang digunakan adalah 16 baris

lcd_clear();

//meng-clear lcd, menulis kosong di lcd lcd_gotoxy(x,y);

//melompat ke kolom x dan baris y (x,y adalah nilai)


lcd_putsf( coba );
//menuliskan ke lcd, apa yang tertulis di dalam tanda petik dua, baik itu spasi
//menampilkan variable di lcd
#include <stdio.h> //dipersiapkan dulu untuk fungsi sprintf char
lcd_buffer[33];

//mempersiapkan buffer

sprintf(lcd_buffer,"hsl-1:%i",hasil_1);
//menampilkan tulisan hsl-1 dengan variable hasil_1
lcd_puts(lcd_buffer);

//menampilkan isi buffer

perintah-perintah dalam menampilkan di lcd,


%i = variable yang ditampilkan berupa integer
%c=variable yang ditampilkan berupa caracter 3.
Percobaan manipulasi nilai II

Petunjuk Praktikum AVR-Triwiyanto

Page 37

#include <mega8535.h>
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
// Alphanumeric LCD Module functions bisa di copy dari codeWizard CAVR
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
unsigned char tulis[5]={'m','i','c','r','o'};
char lcd_buffer[33];
unsigned char i;
void main(void)
{
lcd_init(16); // inisialisasi lcd, kolom modul lcd =16. while(1)
{
for(i=0;i<5;i++)
{
lcd_clear();
lcd_gotoxy(i,0);
// ke kolom x=0 dan baris y=0
sprintf(lcd_buffer,"%c",tulis[i]);
lcd_puts(lcd_buffer);
delay_ms(200);
}
}
}

%f=menampilkan tipe float


%d=menampilkan bilangan bulat
/n=pindah ke baris selanjutnya
operasi-operasi valid yang dapat dijalankan oleh variables tipe data. Gunakan yang
sesuai, pemilihan data memepengaruhi memory yang dipakai dan ketelitian. 4.
Percobaan manipulasi data III

Petunjuk Praktikum AVR-Triwiyanto

Page 38

#include <mega8535.h>
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
unsigned char data1=9;
signed char data2=-10;
char lcd_buffer[33];
int data; float
data3;
void main(void)
{
data1=data1+data2;
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"hasilnya=%i",data1);
lcd_puts(lcd_buffer); delay_ms(1200);
data=data1/2; lcd_clear();
sprintf(lcd_buffer,"9/2=%i",data);
lcd_puts(lcd_buffer);
delay_ms(1200); data=20.4;
lcd_clear();
sprintf(lcd_buffer,"20.4=%i",data);
lcd_puts(lcd_buffer);
delay_ms(1200); data3=5/2;
lcd_clear();
sprintf(lcd_buffer,"5/2=%f",data3);
lcd_puts(lcd_buffer); delay_ms(1200);
}

5. Percobaan Cetak Karakter Interaksi dengan Saklar


Pada percobaan ini interaksi cetak karakter dilakukan dengan penekanan pada
sebuah saklar yang terhubung pada PORTB.
Petunjuk Praktikum AVR-Triwiyanto

Page 39

a. Konfigurasi pada Code Vision

Gambar 4.5. Konfigurasi codevision pada LCD dan PORTB


b. Listing program

#include <mega8535.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
//
#include <lcd.h>
// Declare your global variables here
void main(void)
{
PORTB=0xFF;
DDRB=0x00;
// LCD module initialization
Petunjuk Praktikum AVR-Triwiyanto

Page 40

lcd_init(16); lcd_gotoxy(0,0); lcd_putsf("Welcome");


delay_ms(1000); while (1)
if (PINB.0==1)
{
lcd_gotoxy(0,0); lcd_putsf("Button Released");
delay_ms(500);
}
else
{
lcd_gotoxy(0,0); lcd_putsf("Button Pressed");
delay_ms(500);
}
}

6. Percobaan Cetak Karakter Interaksi dengan Saklar


Pada percobaan ini interaksi karakter dilakukan dengan menggunakan beberapa
saklar dan masing-masing saklar mewakili karakter tertentu.
a. Konfigurasi codevision sama dengan percobaan 5
b. Listing program
#include <mega8535.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm

Petunjuk Praktikum AVR-Triwiyanto

Page 41

#include <lcd.h>
// Declare your global variables here
void main(void)
{
PORTB=0xFF;
DDRB=0x00;
// LCD module initialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("Welcome");
delay_ms(1000); while
(1)
if (PINB==0xff)
{
lcd_gotoxy(0,0);
lcd_putsf("No Button");
delay_ms(500);
}
if else (PINB.0==0)
{
lcd_gotoxy(0,0);
lcd_putsf("Button 0");
delay_ms(500);
}
if else (PINB.1==0)
{
lcd_gotoxy(0,0);
lcd_putsf("Button 1");
delay_ms(500);
}
else
{
lcd_gotoxy(0,0);
lcd_putsf("No Button");
delay_ms(500);
}
}

Tugas
Petunjuk Praktikum AVR-Triwiyanto

Page 42

1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk
PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan
b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas
c. Jelaskan masing-masing program tersebut diatas.
d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu
e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum

PERCOBAAN 5
Petunjuk Praktikum AVR-Triwiyanto

Page 43

ANALOG TO DIGITAL CONVERTER


I.

Pendahuluan
Pada praktikum ini, anda akan mempelajari cara mengembangkan sebuah
system menggunakan mikrokontroler AVR buatan Atmel menggunakan
software CodeVisionAVR. Seperti pada umumnya mikrokontroler, program
untuk

mikrokontroler

AVR

ditulis

menggunakan

bahasa

assembly.

CodeVisionAVR merupakan software C-cross compiler, dimana program


dapat ditulis menggunakan bahasa-C. Dengan menggunakan pemrograman
bahasa-C diharapkan waktu disain (deleloping time) akan menjadi lebih
singkat. Setelah program dalam bahasa-C ditulis dan dilakukan kompilasi
tidak terdapat kesalahan (error) maka proses download dapat dilakukan. ADC
merupakah salah satu fasilitas yang ada pada mikrokontroller, untuk
melakukan konversi analog menjadi digital. Pada percobaan ini anda akan
berlajar bagaimana konfigurasi ADC, menampilkan data ke LED, 7 segmen
dan LCD Karakter.

II.

Tujuan
Setelah menyelesaikan praktikum ini, yang anda peroleh adalah :
1. Dapat menjelaskan arsitektur umum dan keistimewaan dari mikrokontroler
AVR ATmega8535 fungsi ADC.
2. Dapat mengembangkan program CodeVisionAVR untuk konfigurasi ADC
3. Dapat menggunakan fungsi ADC
4. Dapat menampilkan data ADC ke LED, 7 Segmen dan LCD karakter
5. dapat mengerjakan tugas yang diberikan dengan bahasa-C.

III.

Dasar Teori

Petunjuk Praktikum AVR-Triwiyanto

Page 44

Mikrokontroller atmega8535 telah memiliki fasilitas Analog to Digital Converter


yang sudah built-in dalam chip. Atmega8535 memiliki resolusi ADC 10-bit dengan
8channel input dan mendukung 16macam penguat beda. ADC ini bekerja dengan teknik
successive approximation. Rangkaian internal ADC ini memiliki catu daya tersendiri
yaitu pin AVCC. Tegangan AVCC harus sama dengan VCC 0.3
(datasheet pada lampiran 1).
Data hasil konversi ADC dirumuskan sebagai berikut:

. 1024

dimana Vin adalah tegangan masukan pada pin yang dipilih sedangkan Vref
adalah tegangan referensi yang dipilih.
ADC terdiri atas rangkaian Sample and Hold yang menjamin tegangan masukan
ke ADC di tahan pada level konstan saat konversi.

Block diagram ADC terlihat di

Gambar berikut.

Gambar 5.1. Diagram blok ADC


Petunjuk Praktikum AVR-Triwiyanto

Page 45

Inisialisasi ADC
Untuk menggunakan ADC, haruslah diinisialisasi terlebih dahulu. Proses
inisialisasi ADC meliputi proses penentuan clock, tegangan referensi, format output, dan
mode pembacaan. Register yang perlu diset nilainya adalah ADMUX (ADC Multiplexer
Selection Register) ,ADCSRA ( ADC Control and Status Reister A), SFIOR ( Spesial
Function IO Register).
Inisialisasi ADMUX
ADMUX merupakan register 8 bit yang berfungsi menentukan tegangan referensi
ADC, format data Output, dan saluran ADC yang digunakan. Konfigurasinya seperti
gambar berikut.

Gambar 5.2. Register ADMUX

Gambar 5.3. Konfigurasi saat ADLAR sama dengan nol

Gambar 5.4. Konfigurasi saat ADLAR sama dengan satu


Petunjuk Praktikum AVR-Triwiyanto

Page 46

Bit bit penyusunya dapat dijelaskan sebgai berikut :


A. REFS [1..0] merupakan bit pengatur teangan referensi ADC ATmega16 Memiliki
nilai awal 00 sehingga referensi teganan berasal dari pin AREF,jika nilai REFS 01
maka nilai tegangan referensi diambil dari pin AVCC,jika nilai REFS 11 berarti
nilai teganan referensi berasal dari dalam yaitu sebesar 2,56 Volt.
B. ADLAR merupakan bit pemilih mode data keluaran ADC. Bernilai awal 0
sehingga 2 bit tertinggi data hasil konfersinya berada diregister ADCH dan 8bit
sisanya berada di register ADCL,seperti ditujukkan gambar 2.4(b) dan jika
bernilai 1,maka hasilnya pada gambar 2.4(c).
C. MUX [ 4..0] merupakan bit pemilih saluran pembacaan ADC. Bernilai awal 0000.
Untuk mode single ended input,MUX[4..0] bernilai dari 0000-00111. Berikut tabel
konfigurasi bit MUX

Tabel pemilihan bit saluran pembacaan ADC

Petunjuk Praktikum AVR-Triwiyanto

Page 47

Gambar 5.5. Tabel pemilihan kanal ADC

Tabel pemilihan bit saluran pembacaan ADC (lanjutan)

Petunjuk Praktikum AVR-Triwiyanto

Page 48

Inisialisasi ADCSRA
ADCSRA merupakan register 8 bit yang berfungsi melakukan manajemen sinyal kontrol
dan status dari ADC. Memiliki sususan seperti gambar berikut.

Gambar 5.6. Register ADCSRA


Bit penyusunnya dapat dijelaskan sebagai berikut :
a) ADEN merupakan bit pengatur aktivasi ADC. Berawal dari 0.Jika 1, maka ADC
Aktif.
b) ADSC merupakan bit penanda mulainya konversi ADC. Bernilai awal 0,selama
konvesi akan bernilai 1, dan jika telah selesai akan bernilai 1.
c) ADATE merupakan bit pengatur aktivasi picu otomatis operasi ADC.Bernilai awal
0. Jika 1,operasi ADC akan dimulai pada saat transisi positif sinyal picu yang
dipilih. Pemilihan sinya picu menggunakan bit ADTS pada register SFIOR
d) ADIF merupakan bit penanda akhir suatu konversi ADC. Bernilai awal 0. Jika
bernilai 1,maka suatu saluran telah selesai dan data siap diakses

Petunjuk Praktikum AVR-Triwiyanto

Page 49

e) ADIE merupakan bit pengatur aktivasi interupsi yang berhubungan denan akhir
konversi ADC. Bernilai awal 0. Jika bernilai 1 sebuah interupsi akan dieksekusi.
f) ADPS[2..0] merupakan bit pengatur clock ADC. Bernilai awal 000. Detail nilai bit
dapat dilihat tabel berikut :
Tabel 2.8 Konfigurasi Clock ADC

Inisialisasi SFIOR
Register SFIOR (Special Function IO Register) merupakan register 8 bit pengatur
sumber picu konversi ADC, apakah dari picu internal atau dari picu eksternal.
Susunannya sebagai berikut :

Gambar 5.7. Register-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 mode free running dan tidak ada interupsi yang dihasilkan. Detailnya dapat
ditujukkan tabet berikut.
Tabel Konfigurasi mode ADC
Petunjuk Praktikum AVR-Triwiyanto

Page 50

Atmega 8535 telah include analog-to-digiatal (A/D) converter dengan resolusi 10 bit
yang dapat juga di program dengan 8 bit.
Kali ini kita akan juga akan belajar menggunakan codeWizard CvAVR. Dengan
menggunakan codewizard ini mempermudah kita dalam pengaturan register pada
program kita.
Lakukan pemilihan tipe mikrokontroller dan clock yang digunakan, pilih enable
ADC, pilih 8 bit atau 10 bit

Gambar 5.8. Konfigurasi ADC pada codevision

Petunjuk Praktikum AVR-Triwiyanto

Page 51

#include <mega8535.h>
#define ADC_VREF_TYPE 0x40
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete while
((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// Declare your global variables here
void main(void)
{
PORTA=0x00;
DDRA=0x00;
// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: On
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x84;
SFIOR&=0xEF; //do nothing
SFIOR|=0x10; //do nothing
while (1)
{
// Place your code here
};
}

Berikut merupakan contoh ADC dengna display LCD

Petunjuk Praktikum AVR-Triwiyanto

Page 52

#include <mega8535.h>
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ; //PORTC
#endasm
#define ADC_VREF_TYPE 0x40
char
lcd_buffer[33]; unsigned int
dataADC; void inisialisasi_LCD() {// LCD
module initialization
lcd_init
(16);
lcd_gotoxy (0,0);
lcd_putsf (" Diploma III "); lcd_gotoxy (0,1);
lcd_putsf
(" TEM Surabaya "); delay_ms (1000);
}
void inisialisasi_ADC()
{
// ADC initialization
// ADC Clock frequency: 750,000 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: On
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x84;
SFIOR&=0xEF;
SFIOR|=0x10;
}

Petunjuk Praktikum AVR-Triwiyanto

Page 53

// Read the AD conversion result


unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void main(void)
{
inisialisasi_ADC();
inisialisasi_LCD(); while(1)
{ dataADC=read_adc (0); //baca adc0 10bit (0-1024)
lcd_clear
();
lcd_gotoxy
(0,0);
sprintf
(lcd_buffer,"ADC0=%i",dataADC);
lcd_puts
(lcd_buffer);
delayms
(100);
};
}

ADC pada mikrokontroler ini diakses 10bit, maka resolusi setiap bitnya bila kita
menggunakan referensi tegangan 5volt sebagai berikut.
Resolusi ADC

Resolusi ADC

Resolusi ADC

1
x
10
2
4.88mV

1
2 nbit

Vref

Hasil konversi ADC dihitung dengan menggunakan rumus sebagai berikut

.
Hasil konversi =

Penjelasan program
Petunjuk Praktikum AVR-Triwiyanto

Page 54

inisialisasi_ADC
Listing berikut adalah inisialisasi_ADC. Program ini mengatur mode kerja ADC,
yaitu mengisi ADMUX dengan 0x20 yang berarti ADC bekerja dengan tegangan
referensi yang terhubung ke pin AVCC. Dan dengan format data ADCH-ADCL karna bit
ADLAR=0. Berikut adalah listing fungsi inisialisasi ADC.

void inisialisasi_ADC()
{
// ADC initialization
// ADC Clock frequency: 750,000 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: On
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x84;
SFIOR&=0xEF;
SFIOR|=0x10;
}
Fungsi baca_adc
Berikut adalah fungsi pembacaan ADC 10bit. Fungsi ini adalah fungsi dengan
nilai balik. Sehingga saat fungsi ini dipanggil akan menghasilkan nilai balik sesuai
dengan data pada ADCW.
// Read the AD conversion result unsigned int
read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10; return
ADCW;
}
Pada fungsi ini, ADMUX diisikan dengan adc_input dan di-or-kan dengan
Petunjuk Praktikum AVR-Triwiyanto

Page 55

ADC_VREF_TYPE.

Seperti

yang telah didefinisikan sebelumnya konstanta

ADC_VREF_TYPE bernilai 0x40 sedangkan adc_input merupakan argument dati fungsi


read_adc.

Gambar 5.9. Koneksi tegangan analog pada ATMEGA8535

IV.

Peralatan
1. Modul Trainer
2. 1 set PC
3. Catu Daya +5V

V.

Prosedure Percobaan

1. Percobaan ADC display LED

Petunjuk Praktikum AVR-Triwiyanto

Page 56

Pada percobaan ini data ADC diambil dan ditampilkan ke LED, dan pada
modul ini LED
terhubung ke
PORTC

R8
220

D8

Gambar 5.10. Koneksi tegangan analog pada ATMEGA8535

a. Pilih adc pada code wizard, dan lakukan setting seperti


pada gambar berikut

Petunjuk Praktikum AVR-Triwiyanto

Page 57

Gambar 5.11. Konfigurasi ADC pada ATMEGA8535

b. Lakukan generate program, dan editing program berikut:

Petunjuk Praktikum AVR-Triwiyanto

Page 58

/* ADC1.C DIGUNAKAN UNTUK MEMBACA ADC CH 0 */


/* DITAMPILKAN KE LED PORT C
*/
#include <mega8535.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void main(void)
{
DDRC = 0xFF;
// ADC Voltage Reference: AREF pin
ADMUX=ADC_VREF_TYPE & 0xff;
// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Auto Trigger Source: Free Running
ADCSRA=0xA3;
// Setting free running mode
SFIOR&=0x0F;
while(1)
{
PORTC = baca_adc(0);
delay_ms(100);
}
}

2. Percobaan ADC Display 7 Segmen


Pada percobaan ini data ADC dikonfigurasikan dengan resolusi 10 bit, hasil
peengambilan data adc, ditampilkan ke 7 segmen, dalam bentuk ribuan,
ratusan, puluhan dan satuan.
Petunjuk Praktikum AVR-Triwiyanto

Page 59

Gambar 5.12. Driver dan decoder pada 7 segmen

a. Pilih adc pada code wizard, dan lakukan setting seperti


pada gambar berikut

Petunjuk Praktikum AVR-Triwiyanto

Page 60

Gambar 5.13. Konfigurasi ADC, PORTC dan PORTD pada codevision

Petunjuk Praktikum AVR-Triwiyanto

Page 61

b. Lakukan generate program, dan editing program berikut:


/* ADC1.C DIGUNAKAN UNTUK MEMBACA ADC CH 0 */
/* DITAMPILKAN KE 7 SEGMENT PORT C
*/
#include <mega8535.h>
#include <delay.h> #define
mode_ADC 0x00
int ubah; int sat,pul,rat,rib; unsigned int data;
unsigned int baca_adc (unsigned char pin_adc)
// this is very important declaration uint
{
ADMUX
=pin_adc
|
mode_ADC;
ADCSRA |=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA |= 0x10;
return
ADCW;
}
void ubah_ke_format7segment()
//fungsi untuk mengubah kedalam format 7segment
{
if (ubah==0){ubah=0xc0;}
if (ubah==1){ubah=0xf9;}
if
(ubah==2){ubah=0xa4;}
if
(ubah==3){ubah=0xb0;}
if
(ubah==4){ubah=0x99;}
if
(ubah==5){ubah=0x92;}
if
(ubah==6){ubah=0x82;}
if
(ubah==7){ubah=0xf8;}
if
(ubah==8){ubah=0x80;}
if
(ubah==9){ubah=0x90;}
}
void tampil_7segment()
{

Petunjuk Praktikum AVR-Triwiyanto

Page 62

PORTC=rib;//mengirimkan data kedigit5


PORTD.5=0;
PORTD.6=0;
PORTD.7=0;
delay_ms(20);
PORTC=rat;//mengirimkan data kedigit6
PORTD.5=1;
PORTD.6=0;
PORTD.7=0;
delay_ms(20);
PORTC=pul;//mengirimkan data kedigit7
PORTD.5=0;
PORTD.6=1;
PORTD.7=0
delay_ms(20);
PORTC=sat;//mengirimkan data kedigit8
PORTD.5=1;
PORTD.6=1;
PORTD.7=0;
delay_ms(20);
//lamanya waktu scanning ditentukan oleh intruksi delay
}
void main(void)
{
DDRD = 0XFF;
DDRC = 0xFF;
ADMUX=mode_ADC;
ADCSRA=0x85;
while(1)
{
data = baca_adc(0); sat = data % 10;
// sat =
sisa dari data dibagi 10 pul = data / 10; pul = pul
% 10;
rat = data / 100; rat = rat
% 10; rib = data / 1000;
ubah=sat;
ubah_ke_format7segment();

sat=ubah;
Petunjuk Praktikum AVR-Triwiyanto

Page 63

//
ubah=pul;
ubah_ke_format7segment();
pul=ubah;
//
ubah=rat;
ubah_ke_format7segment();
rat=ubah;
//
ubah=rib;
ubah_ke_format7segment();
rib=ubah;
//
tampil_7segment();
}
}

3. Pengaturan Nyala LED dengan input analog ADC


Pada percobaan ini menggunakan ADC dengan mode interupsi, data ADC 10 bit diambil
dan dikonversikan ke tegangan, hasil konversi dibandingan dengan dua nilai, sebagai
berikut:
Bila tegangan > 4 volt maka display LED, D0=ON yang lain padam Bila
tegangan < 2 volt maka display LED, D7=ON yang lain padam
Selain kondisi tersebut, maka semua LED padam

a. Pengaturan pada codevision

Petunjuk Praktikum AVR-Triwiyanto

Page 64

Gambar 5.14. Konfigurasi ADC dengan mode interupsi dan PORTC pada codevision

b. Listing Program
#include <mega8535.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
// ADC interrupt service routine interrupt
[ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data=ADCW;
// Place your code here if
(adc_data > (4*1023)/5)
{
PORTC= 0b11111110;
}
else if (adc_data < (2*1023)/5)
{
Petunjuk Praktikum AVR-Triwiyanto

Page 65

PORTC= 0b01111111;
}
else
{
PORTC=0b11111111;
}
}
// Declare your global variables here
void main(void)
{
PORTC=0x00;
DDRC=0xFF;

// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AREF pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8B;
SFIOR&=0xEF;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}

4. Display data ADC ke LCD Karakter


Pada percobaan ini, ADC yang digunakan adalah tipe 8 bit, dan data decimal akan
dimanipulasi sebelum ditampilkan pada LCD Karakter 2 x16. Pada percobaan ADC
ini akan menggunakan Channel 0, dengan inputan berasal dari Potensio, yang
difungsikan sebagai pembagi tegangan.
Petunjuk Praktikum AVR-Triwiyanto

Page 66

a. Konfigurasi codevision

b. Listing Program
#include <mega8535.h> #include
<stdio.h>.
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
#define heater PORTB.0;//simulasi heater di hubungkan dg PORTB.0
#define ADC_VREF_TYPE 0x40
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40;
delay_us(10);
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
unsigned char buff[33];
Petunjuk Praktikum AVR-Triwiyanto

Page 67

void lcd_putint(unsigned int dat)


{
sprintf(buff,"%d ",dat);
lcd_puts(buff);
}
void main(void)
{
unsigned int suhu;
float adc;
DDRB=0xff;
PORTB=0x00;
// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x85;
SFIOR&=0xEF;
// LCD module initialization
lcd_init(16); while
(1)
{
// Place your code here adc =
read_adc(0); adc=adc/255;
suhu=adc*175; suhu=suhu-12;
if (suhu<27)heater=1; // simulasi
if (suhu>32)heater=0; // simulasi
lcd_putsf("Suhu= ");
lcd_putint(suhu);
delay_ms(1000); lcd_clear();
};
}

5. Simulasi Thermometer Digital


Pada percobaan ini, akan disimulasikan thermometer digital dengan memanfaatkan
fasilitas ADC pada ATMEGA8535 melalui channel 0, dengan resolusi 10 bit. Pada
aplikasi ini, ADC diaktifkan dengan menggunakan mode free running. Data ADC 10
bit ditampilkan pada LCD Karakter, dengan data maksimal 0 500,0 oC. Untuk
merubah data decimal ke FLOAT. Konfersi dilakukan dengan menggunakan
persamaan sebagai berikut:
Petunjuk Praktikum AVR-Triwiyanto

Page 68

Merubah dari data decimal ke suhu:


suhu_c=(float)SUHU*500/1023;
Merubah dari float ke array: ftoa(suhu_c,1,sementara);
a. Konfigurasi codevision

b. Listing Program
int SUHU; char
sementara[8];
float suhu_c;
//
#include <stdlib.h>
#include <lcd.h>
#include <delay.h>
#include <mega8535.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm

Petunjuk Praktikum AVR-Triwiyanto

Page 69

#define ADC_VREF_TYPE 0x00


// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10; return
ADCW;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
Petunjuk Praktikum AVR-Triwiyanto

Page 70

Petunjuk Praktikum AVR-Triwiyanto

Page 71

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
Petunjuk Praktikum AVR-Triwiyanto

Page 72

SFIOR=0x00;

Petunjuk Praktikum AVR-Triwiyanto

Page 73

// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AREF pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: Free Running
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0xA3;
SFIOR&=0x0F;
// LCD module initialization
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("LAB.MIKRO - TEM");
lcd_gotoxy(0,1);
lcd_putsf("SENSOR SUHU LM35");
delay_ms(1000);
while (1)
{
lcd_clear( );
SUHU= read_adc(0);
suhu_c=(float)SUHU*500/1023;//rumus untuk mengubah kedalam derajat celcius
lcd_gotoxy(0,0);
lcd_putsf("LAB MIKRO - TEM");
ftoa(suhu_c,1,sementara);//float to array, mengubah tipe data float ke
//tipe data array yg kan ditampilkan di LCD
lcd_gotoxy(0,1) ; lcd_puts(sementara); lcd_gotoxy(5,1) ;
lcd_putchar(0xdf);//menampilkan karakter
derajat lcd_putsf("C"); delay_ms(100);
};
}

Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk
PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan
b. Rencanakan flowchart untuk masing-masing percobaan tersebut
diatas
Petunjuk Praktikum AVR-Triwiyanto

Page 74

c. Jelaskan masing-masing program tersebut diatas.


d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu
e. Lakukan

simulasi

untuk

rangkaian

tersebut

diatas

dengan

menggunakan PROTEUS, dan PASTE gambar tersebut pada Laporan


praktikum 2. Buatlah rangkuman mengenai LCD karakter 2 x16

PERCOBAAN 6
Petunjuk Praktikum AVR-Triwiyanto

Page 75

KEYPAD

J7
1
2
3
4
5
6
7
8

PB0
PB1
PB2
PB3
PB4
PB5
PB6
PB7

N8

1 2 3

COR

4 5 6

MEN

7 8 9 |
CAN 0 ENT |

CO

1. Percobaan Keypad dengan display LED


Pada percobaan ini keypad terhubung ke PORTB dan display ke LED, setiap
penekanan tombol pada keypad maka akan ditunjukkan perubahan kondisi pada
LED.
a. Konfigurasi pada codevision

Gambar 6.1. Konfigurasi PORTB dan PORTC


Petunjuk Praktikum AVR-Triwiyanto

Page 76

b. Listing Program
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
// Declare your global variables here
unsigned char dt, dtkey; void
detek_key(void);
void main(void)
{
// LCD module initialization while
(1)
{
// Place your code here
detek_key();
PORTC=dtkey;
delay_ms(5);
};
}
void detek_key(void) {
PORTB.4=0;
dt=(~PINB & 0x0F);
switch (dt)
{
case 1: dtkey=0x1;
break;
case 2: dtkey=0x4;
break;
case 4:
dtkey=0x7;
break;
case 8: dtkey=0xa;

Petunjuk Praktikum AVR-Triwiyanto

Page 77

break;
};
PORTB.4=1; PORTB.5=0;
dt=(~PINB & 0x0F);
switch (dt) {
case 1:
dtkey=0x2;
break;
case 2: dtkey=0x5;
break;
case 4:
dtkey=0x8;
break;
case 8: dtkey=0x0;
break;
};
PORTB.5=1; PORTB.6=0;
dt=(~PINB & 0x0F);
switch
(dt) {
case 1: dtkey=0x3;
break;
case 2:
dtkey=0x6;
break;
case
4:
dtkey=0x9;
break;
case 8:
dtkey=0xb;
break;
};
PORTB.6=1; PORTD.7=0;
dt=(~PINB & 0x0F);
switch
(dt)
{
case 1: dtkey=0xc;
break;
case 2:
dtkey=0xd;
break;
case 4: dtkey=0xe;
break;
case 8:
dtkey=0xf;
break;
};

PORTB.7=1;
Petunjuk Praktikum AVR-Triwiyanto

Page 78

6.2. Percobaan Keypad dengan 7 Segmen


Pada percobaan ini, setiap penekanan tombol pada keypad, data akan didisplaykan ke
7 segmen. Pada percobaan ini perlu dilakukan konfigurasi pada interface 7 segmen
yang terhubung ke PORTC dan PORTD, dan keypad terhubung ke PORTB dengan
konfigurasi seperti pada percobaan 6.1.
a. Konfigurasi pada codevision

Gambar 6.2. Konfigurasi PORTC dan PORTD pada 7 Segmen

b. Listing Program
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>

Petunjuk Praktikum AVR-Triwiyanto

Page 79

// Alphanumeric LCD Module functions


#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
// Declare your global variables here
unsigned char dt, dtkey; void
detek_key(void); void convert();
unsigned char data;
void main(void)
{
PORTB=0xFF;
DDRB=0xF0;
PORTC=0x00;
DDRC=0xFF;
// LCD module initialization while
(1)
{
// Place your code here
detek_key();
data=dtkey;
convert();
PORTD.5=0;
PORTD.6=0;
delay_ms(5);
};
}
void detek_key(void) {
PORTB.4=0;
dt=(~PINB & 0x0F);
switch (dt)
{
case 1: dtkey=0x1;
break;

Petunjuk Praktikum AVR-Triwiyanto

Page 80

case 2: dtkey=0x4;
break;
case 4: dtkey=0x7;
break;
case 8: dtkey=0xa;
break;
};
PORTB.4=1; PORTB.5=0;
dt=(~PINB & 0x0F);
switch (dt) {
case 1:
dtkey=0x2;
break;
case 2: dtkey=0x5;
break;
case 4: dtkey=0x8;
break;
case 8: dtkey=0x0;
break;
};
PORTB.5=1; PORTB.6=0;
dt=(~PINB & 0x0F);
switch (dt) {
case 1:
dtkey=0x3;
break;
case 2: dtkey=0x6;
break;
case 4: dtkey=0x9;
break;
case 8: dtkey=0xb;
break;
};
PORTB.6=1; PORTD.7=0;
dt=(~PINB & 0x0F);
switch (dt)
{
case 1: dtkey=0xc;
break;
case 2: dtkey=0xd;
break;

Petunjuk Praktikum AVR-Triwiyanto

Page 81

case 4: dtkey=0xe;
break;
case 8:
dtkey=0xf;
break;
};
PORTB.7=1;
}

void convert(){ switch(data)


{
//
pg fe dcba
case 0:
PORTC=0b11000000;break;
case 1:
PORTC=0b11111001;break;
case 2:
PORTC=0b10100100;break;
case 3:
PORTC=0b10110000;break;
case 4:
PORTC=0b10011001;break;
case 5:
PORTC=0b10010010;break;
case 6:
PORTC=0b10000010;break;
case 7:
PORTC=0b11111000;break;
case 8:
PORTC=0b10000000;break;
case 9:
PORTC=0b10010000;break;
default:
PORTC=0xff;
}
}

Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk
PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan
b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas
c. Jelaskan masing-masing program tersebut diatas.
d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu
e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum
2. Buatlah rangkuman untuk fungsi TIMER/COUNTER pada AVR ATMEGA8535
(lihat datasheet)
Petunjuk Praktikum AVR-Triwiyanto

Page 82

PERCOBAAN 8
COUNTER

Timer/Counter pada AT Mega 8535 terdiri dari 3 buah. Yaitu Timer/Counter0 ( 8bit ),
Timer/Counter1 ( 16 bit ), dan Timer/Counter2 ( 8 Bit ).
Timer/Counter0
Timer/Counter 0 adalah 8-bit Timer/Counter yang multifungsi. Deskripsi untuk
Timer/Counter 0 pada ATmega 8535 adalah sebagai berikut:
a. Sebagai Counter 1 kanal.
b. Timer di-nol-kan saat match compare (auto reload).
c. Dapat menghasilkan gelombang PWM dengan glitch-free.
d. Frekuensi generator.
e. Prescaler 10 bit untuk timer.
f. Interupsi timer yang disebabkan timer overflow dan match compare.
Pengaturan Timer/Counter 0 diatur oleh TCCR0 (Timer/Counter kontrol
Register0) yang dapat dilihat pada Gambar 2.5.

Gambar 8.1. Register TCCR0


Penjelasan untuk tiap bit-bitnya:
a. Bit 7 FOC0: Force Output Compare.
Petunjuk Praktikum AVR-Triwiyanto

Page 83

b. Bit 6,3 WGM0:WGM00:Waveform generation Unit.


Bit ini mengontrol kenaikan isi counter, sumber nilai maksimum counter dan tipe
jenis Timer/Counter yang dihasilkan, yaitu mode normal, clear timer, mode
compare match, dan dua tipe dari PWM (Pulse Width Modulation). Tabel
2.2 berikut adalah setting pada bit ini untuk menghasilkan mode tertentu.
Tabel 8.1 Konfigurasi Bit WGM01 dan WGM00

Mode 0 (Normal): Timer/counter 0 berfungsi sebagai pencacah tungggal yang dapat


mencacah dari 0x00 sampai dengan 0xff. Setelah mencapai nilai maximum yaitu 0xff
maka register counter (TCNT0) akan reset atau kembali 0x00.
Mode 1: Timer/counter 0 berfungsi sebagai phase correct PWM (PCP). Mode ini
digunakan untuk menghasilkan sinyal PWM dimana nilai register counter (TCNT0) yang
mencacah naik dan turun secara terus menerus akan selalu dibandingkan dengan
register pembanding 0CR0. Hasil pembandingan register TCNT0 dan OCR0 digunakan
untuk membangkitkan sinyal PWM yang dikeluarkan pada pin OC0 seperti gambar

Petunjuk Praktikum AVR-Triwiyanto

Page 84

Gambar 8.2. Konfigurasi sinyal PWM

Frekuensi dan duty cycle PWM yang dihasilkan pada mode ini adalah
foc0= fosc/(N*512)
D=OCR0/255

*100%

Dimana
foc0= frekuensi output 0C0 mode PCP fosc=frekuensi
kristal
N=scala clock Tabel 2.6

Mode 2: Timer/counter 0 sebagai clear timer on compare match (CTC). Maksudnya adalah
register counter (TCNT0) akan mencacah naik kemudian akan direset atau kembali
manjadi 0x00 pada saat nilai TCNT0 sama dengan OCR0. Dengan mengatur keluaran
OC0 bergulir (toggle) dapat membangkitkan gelombang kotak dengan frekuensi:
Petunjuk Praktikum AVR-Triwiyanto

Page 85

foc0=fosc/(2*N* (1+OCR0))
0CR0= isi register 0CR0
Mode 3: timer /counter berfungsi sebagai fast PWM. Mode ini hampir sama dengan
mode phase correct PWM, hanya perbedaaanya adalah register TCNT0 mencacah naik
saja dan tidak pernah mencacah turun

Gambar 8.3. Konfigurasi PWM mode 3

Frekuensi dan duty cycle PWM yang dihasilkan pada mode fast PWM ini foc0=
fosc/(N*256)
D=OCR0/255 *100%
c. Bit 5, 4 COM01:COM00: Compare Match Output Mode.
Bit ini mengontrol pin OC0 (Output Compare pin). Apabila kedua bit ini nol atau
clear maka pin OC0 berfungsi sebagai pin biasa tetapi bila salah satu bit set.
Maka fungsi pin ini tergantung pada setting bit pada WGM00 dan WGM01.

Petunjuk Praktikum AVR-Triwiyanto

Page 86

Berikut Tabel 2.3 sampai dengan Tabel 2.5 adalah tabel setting bit ini sesuai
setting bit pada WGM00 dan WGM01.
Tabel 8.2. Konfigurasi Bit COM01 dan COM00 Compare Output Mode non PWM

Tabel 8.3. Konfigurasi Bit COM01 dan COM00 Compare Output Mode Fast PWM

Tabel 8.4. Konfigurasi Bit COM01 dan COM00 Compare Output Mode Phase
Correct PWM

d. Bit 2, 1, 0 CS02; CS01, CS00: Clock Select.


Ketiga bit ini untuk memilih sumber detak yang akan digunakan oleh
Timer/Counter, Tabel 2.6 berikut menampilkan konfigurasi pemilihan sumber
detak.
Petunjuk Praktikum AVR-Triwiyanto

Page 87

Tabel 8.5. Konfigurasi Bit Clock Select untuk memilih sumber detak

TCNTO (Timer/Counter Register 0)


Register TCNT0 berfungsi untuk menyimpan data cacahan timer/counter0. Karena
ukuran register TCNT0 hanya 8bit maka hanya dapat melakukan cacahan 0x00-0xff.
OCR0 (Output Compare Register0)
Register OCR0 berfungsi untuk menyimpan data pembanding yang akan selalu
dibandingkan dengan isi register TCNT0. Jika TCNT0 sama dengan OCR0 maka akan
terjadi event sesuai dengan mode yang telah ditentukan pada register TCCR0.

Timer/Counter1
Timer/Counter1 adalah 16-bit Timer/Counter yang memungkinkan program
pewaktuan lebih akurat.
Berbagai fitur dari Timer/Counter1 sebagai berikut:
a. Desain 16 bit (juga memungkinkan 16 bit PWM).
b. Dua unit compare .
c. Dua unit register pembanding.
d. Satu unit input capture.
Petunjuk Praktikum AVR-Triwiyanto

Page 88

e. Timer dinolkan saat match compare (autoreload).


f. Dapat menghasilkan gelombang PWM dengan glitch-free.
g. Periode PWM yang dapat diubah-ubah.
h. Pembangkit frekuensi.
i. Empat buah sumber interupsi (TOV1, OCF1A, OCF1B dan ICF1).
Pengaturan Timer/Counter 1 diatur melalui register TCCR1A yang dapat dilihat pada
Gambar 2.6.

Gambar 8.3. Register TCCR1A

Penjelasan untuk tiap bit-bitnya:


a. Bit 7:6 COM1A1:0: Compare Output Mode untuk channel A.
Bit 5:4 COM1B1:0: Compare Output Mode untuk channel B.
Register COM1A1:0 dan COM1B1:0 mengontrol kondisi Pin Output
Compare (OC1A dan OC1B). Jika salah satu atau kedua bit pada register
COM1A1:0 ditulis menjadi satu maka kaki pin OC1A tidak berfungsi normal
sebagai port I/O. Begitu juga pada register COM1B1:0 ditulis menjadi satu maka
kaki pin OC1B juga tidak berfungsi normal sebagai port I/O. Fungsi pada pin

Petunjuk Praktikum AVR-Triwiyanto

Page 89

OC1A dan OC1B tergantung pada setting bit pada register WGM13:0 diset
sebagai mode PWM atau mode non-PWM.
b. Bit 3 FOC1A: Force Output Compare untuk channel A.
Bit 2 FOC1B: Force Output Compare untuk channel B.
c. Bit 1:0 WGM1 1:0: Waveform Generation Mode.
Dikombinasikan dengan bit WGM13:2 yang terdapat pada register
TCCR1B, bit ini mengontrol urutan pencacah dari counter, sumber maksimum
(TOP) nilai counter, dan tipe dari gelombang yang dibangkitkan. Mode yang
dapat dilakukan antara lain: mode normal, mode Clear Timer on Compare Match
(CTC) dan tiga tipe mode PWM.
Setingan mode dapat dilihat pada tabel berikut:

Tabel 8.6. Konfigurasi Bit Compare Output Mode non PWM

Tabel 8.7. Konfigurasi Bit Compare Output Mode Fast PWM

Petunjuk Praktikum AVR-Triwiyanto

Page 90

Tabel 8.8. Konfigurasi Bit Compare Output Mode Phase Correct dan Frequency
Correct PWM

Tabel 8.9. Konfigurasi mode PWM

Petunjuk Praktikum AVR-Triwiyanto

Page 91

Pengaturan Timer/Counter 1 juga diatur melalui register TCCR1B yang dapat dilihat
pada Gambar 2.7.

Gambar 2.7 Register TCCR1B


Penjelasan untuk tiap bit-bitnya:
a. Bit 7 ICNC1: Input Capture Noise Canceller.
b. Bit 6 ICES1: Input Capture Edge Select.
c. Bit 5 : Tidak digunakan.
d. Bit 4:3 WGM13:2: Waveform Generation Mode.
Petunjuk Praktikum AVR-Triwiyanto

Page 92

e. Bit 2:0 CS12:0: Clock Select.


Ketiga bit ini

mengatur sumber detak yang digunakan untuk

Timer/Counter1. Untuk setingannya dapat dilihat pada Tabel 2.11.


Tabel 8.10 Konfigurasi bit Clock Select untuk memilih sumber detak

Timer/Counter2
Timer/ counter2 sama persis dengan timer/counter 0.
Timer/Counter 2 adalah 8-bit Timer/Counter yang multifungsi. Deskripsi untuk
Timer/Counter 0 pada ATmega 16 adalah sebagai berikut:
a. Sebagai Counter 1 kanal.
b. Pewaktu di-nol-kan saat match compare (autoreload).
c. Dapat mengahasilkan gelombang PWM dengan glitch-free.
d. Frekuensi generator.
e. Prescaler 10 bit untuk pewaktu.
Petunjuk Praktikum AVR-Triwiyanto

Page 93

f. Intrupsi timer yang disebabkan timer overflow dan match compare.

Pengaturan Timer/Counter 2 diatur oleh TCCR2 (Timer/Counter kontrol Register 0)


yang dapat dilihat pada Gambar 2.8.

Gambar 2.8 Register TCCR2


Penjelasan untuk tiap bit-bitnya:
a. Bit 7 FOC2: Force Output Compare.
b. Bit 6,3 WGM21:WGM20: Waveform Generation Unit.
Bit ini mengontrol kenaikan dari counter, sumber dari nilai maksimum counter,
dan tipe dari jenis Timer/Counter yang dihasilkan yaitu mode normal, clear timer,
mode compare match, dan dua tipe dari PWM (Pulse Width Modulation). Berikut
tabel seting pada bit ini untuk menghasilkan mode tertentu.
Tabel 8.11 Konfigurasi Bit WGM21 dan WGM20

c. Bit 5, 4 COM01:COM00: Compare Match Output Mode.


Petunjuk Praktikum AVR-Triwiyanto

Page 94

Bit ini mengontrol pin OC0 (Output Compare pin). Apabila kedua bit ini nol atau
clear maka pin OC0 berfungsi sebagai pin biasa tetapi bila salah satu bit set.
Maka fungsi pin ini tergantung dari seting bit pada WGM00 dan WGM01. Berikut
daftar tabel setting bit ini sesuai seting bit pada WGM00 dan WGM01.
d. Bit 2, 1, 0 CS22; CS21, CS20: Clock Select.
Ketiga bit ini untuk memilih sumber detak yang akan digunakan oleh
Timer/Counter .

Tabel 8.12 Konfigurasi Bit COM21 dan COM20 Compare Output Mode nonPWM

Tabel 8.13 Konfigurasi Bit COM21 dan COM20 Compare Output Mode Fast PWM

Tabel 8.14 Konfigurasi Bit COM21 dan COM20 Compare Output ModePhase Correct
PWM
Petunjuk Praktikum AVR-Triwiyanto

Page 95

Tabel 8.15 Konfigurasi Bit Clock Select untuk memilih sumber detak

Masing-masing timer/counter memiliki register tertentu yang digunakan untuk mengatur


mode dan cara kerja nya tetapi ada dua register yang digunakan bersamaan yaitu
Register TIMSK dan TIFR
Register TIMSK

Bit0 Timer/Counter0 Overflow Interrupt Enable


jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan enable
interupsi overflow Timer/Counter0
Petunjuk Praktikum AVR-Triwiyanto

Page 96

Bit1- Timer/Counter0 Output Compere Match Interrupt Enable


jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan enable
Interupsi Output Compere Match
Bit2- Timer/Counter1 Overflow Interrupt Enable
jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan
enable interupsi overflow Timer/Counter1
Bit3- Timer/Counter1 Output Compere B Match Interrupt Enable
Bit4- Timer/Counter1 Output Compere A Match Interrupt Enable
Bit5- Timer/Counter1 Input Capture interupt enable
Bit6- Timer/Counter2 overflow interupt enable
Bit7- Timer/Counter2 Output Compere Match Interrupt Enable Register
TIFR

Bit0 Timer/Counter0 Overflow Flag


Bit akan bernilai satu jika Timer/Counter0 Overflow. Bit dapat dinolkan lagi
dengan memberikan logika satu ke bit Flag ini.
Bit1- Output Comapre Flag 0
Bit akan berniali satu jika nilai pada Timer/Counter0 sama dengan nilai pada
OCR0 Output Comapre

IC1
PB0
PB1

1
2

PB0(XCK/T0)

PA0(ADC0)

40
39

PA0
PA1

PB2

PB1(T1)

PA1(ADC1)

38

PA2

Petunjuk Praktikum AVR-Triwiyanto

Page 97

PB2(INT2/AIN0) PA2(ADC2)

PA3 PB4
PA3(ADC3)

36

PB4(SS)

37

PB3(OC0/AIN1)

PA4 PB5

PA4(ADC4)

35

PA5

PB6

PB5(MOSI)

PA5(ADC5)

34

PA6

PB7

PB6[MISO)

PA6(ADC6)

33

PA7

PB7[SCK)

PA7(ADC7)

32

AREF

VCC 10 RESET AREF 31 GND GND 11 VCC AGND 30


VCC
XTAL212

GND

XTAL113 XTAL2

AVCC

29

PC7

PC7(TOSC2)

28

PC6

PC6(TOSC1)

27

PC5

PD0 14

XTAL1

PD1 15

PD0(RXD)

PC5

26

PC4

PD2 16

PD1(TXD)

PC4

25

PC3

PD3 17

PD2(INT0)

PC3

24

PC2

PD4 18

PD3(INT1)

PC2

23

PC1

PD5 19

PD4(OC1B)

PC1(SDA)

22

PC0

PD6 20

PD5(OC1A) PC0(SCL)
PD6(ICP)
PD7(OC2)

21

PD7

ATMEGA8535-DIL40

8.1. Percobaan COUNTER Display LED


#include<mega8535.h> void main()
{
PORTC=0xFF;
DDRC=0xFF;
TCCR0=0b00000110; TCNT0=0; while(1)
{PORTC=~TCNT0;}
}

8.2. Percobaan Counter dengan Display 7 Segmen


Petunjuk Praktikum AVR-Triwiyanto

Page 98

Pada percobaan ini, akan menggunakan fungsi COUNTER pada TIMER0 dengan
mengatur sumber clock pada T0 atau PB0, sehingga pada saat ada transisi High to Low
maka akan menaikkan isi register TCNT0. Agar nilai TCNT0 dapat ditampilkan pada 7
segmen maka harus dilakukan pembagian nilai decimal ke Ratusan, Puluhan dan
Satuan. Karena counter yang digunakan adalah TIMER0 8 bit, maka nilai cacahan yang
dimungkinkan adalah 000 sampai dengan 255.
a. Konfigurasi pada codevision

Gambar Konfigurasi TIMER 0 sebagai Counter

Petunjuk Praktikum AVR-Triwiyanto

Page 99

Gambar Konfigurasi PORTC sebagai output dan konfigurasi PORTD sebagai output
pada PORTD.5, 6 dan 7.
b. Listing program.
#include <mega8535.h> #include
<delay.h>
int
ubah;
int
sat,pul,rat;
unsigned int data;
// Declare your global variables here
void ubah_ke_format7segment()
//fungsi untuk mengubah kedalam format 7segment
{
if (ubah==0){ubah=0xc0;}
if (ubah==1){ubah=0xf9;}
if
(ubah==2){ubah=0xa4;}
if
(ubah==3){ubah=0xb0;}
if
(ubah==4){ubah=0x99;}
if
(ubah==5){ubah=0x92;}
if
(ubah==6){ubah=0x82;}
if
(ubah==7){ubah=0xf8;}
if
(ubah==8){ubah=0x80;}
if
(ubah==9){ubah=0x90;}
Petunjuk Praktikum AVR-Triwiyanto

Page 100

}
void tampil_7segment()
{
PORTC=rat;//mengirimkan data kedigit6
PORTD.5=1;
PORTD.6=0;
PORTD.7=0;
delay_ms(10);
PORTC=pul;//mengirimkan data kedigit7
PORTD.5=0;
PORTD.6=1;
PORTD.7=0;
delay_ms(10);
PORTC=sat;//mengirimkan data kedigit8
PORTD.5=1;
PORTD.6=1;
PORTD.7=0;
delay_ms(10);
//lamanya waktu scanning ditentukan oleh intruksi delay
}

void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
Petunjuk Praktikum AVR-Triwiyanto

Page 101

DDRC=0xFF;

Petunjuk Praktikum AVR-Triwiyanto

Page 102

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In //
State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0b11100000;
// Timer/Counter 0 initialization
// Clock source: T0 pin Falling Edge
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x06;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh //
OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
Petunjuk Praktikum AVR-Triwiyanto

Page 103

TCNT2=0x00;
OCR2=0x00;

Petunjuk Praktikum AVR-Triwiyanto

Page 104

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
while(1)
{
data = TCNT0;
sat = data % 10;
// sat = sisa dari data dibagi 10
pul = data / 10;
pul = pul % 10;
rat = data / 100;
rat = rat % 10;
//
ubah=sat;
ubah_ke_format7segment();
sat=ubah;
//
ubah=pul;
ubah_ke_format7segment();
pul=ubah;
//
ubah=rat;
ubah_ke_format7segment();
rat=ubah;
//
tampil_7segment();
}
}

Petunjuk Praktikum AVR-Triwiyanto

Page 105

8.3. Percobaan Couanter dengan LCD Karakter


Buatlah pemrograman untuk percobaan tersebut.

Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk
PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan
b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas
c. Jelaskan masing-masing program tersebut diatas.
d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu
e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum
2. Buatlah rangkuman IC RTC 1307 (lihat datasheet)

Petunjuk Praktikum AVR-Triwiyanto

Page 106

PERCOBAAN 7
TIMER

Pada ATmega8535 terdapat 3 buah timer, yaitu Timer0 (8 bit), Timer1 (16 bit)
dan Timer2 (8 bit). Untuk perbedaan dan cara kerja masing-masing timer,
temanteman dapat membacanya pada datasheet. Disini saya akan coba
membahas Timer0 dan Timer1 saja.
Perhitungan untuk Timero dan Timer1 adalah sebagai berikut:

!" #$%&' ()*+,- ./01 atau


"
# !" 2 $%& - "
()*+,

.!34

Keterangan:
TCNT
: Nilai yang diberikan pada register timer (TCNT)

: frekuensi clock (crystal) yang digunakan


89:;<=
: waktu timer yang dinginkan untuk overflow n
: Jumlah bit pada TIMER/COUNTER
N
: Prescaler (1, 8,64, 256, 1024 )
567

Contoh 1:
Rencanakan sebuah Timer dengan menggunakan timer1 16 bit yang dapat bekerja
selama 1 detik, dengan frekuensi clock sebesar 1 MHz dan prescaler 64, tentukan nilai
TCNT1H dan TCNT1L.

C.

TCNT

#65.536& '
D

TCNT

49.911

Petunjuk Praktikum AVR-Triwiyanto

Page 107

TCNT

C2F7h

Sehingga didapatkan nilai TCNT1L = F7h dan TCNT1H = C2


Konfigurasi pada codevision, clock value didapatkan dengan pembagian, f clock 1MHz
dibagi dengan prescaler 64 sehingga didapatkan frekuensi clock ke TIMER/COUNTER
15,625 kHz.

Gambar 7.1. Konfigurasi pada codevision pada TIMER1


Contoh 2:
Rencanakan program untuk Timer dengan menggunakan TIMER0 8 bit. Yang
digunakan sebagai pembangkit waktu 0.1 detik, dengan frekuensi clock 1 MHz dan
prescaler 1024.

C.

TCNT

#256& '

TCNT
TCNT

158,34
9Eh

Petunjuk Praktikum AVR-Triwiyanto

Page 108

Sehingga didapatkan nilai TCNT0 =9Eh

Konfigurasi pada codevision, clock value didapatkan dengan pembagian, f clock 1MHz
dibagi dengan prescaler 1024 sehingga didapatkan frekuensi clock ke
TIMER/COUNTER 0,977 kHz.

Gambar 7.2.
pada
pada

Konfigurasi
codevision
TIMER0

R8
220

Petunjuk Praktikum AVR-Triwiyanto

Page 109

D8

7.1. Percobaan Waktu Tunda Display LED


Pada percobaan ini, akan dibangkitkan waktu tunda untuk menghidupkan 8 buah LED
secara flip-flop, terus menerus, dengan waktu tunda yang dibangkitkan dari penggunaan
TIMER 0, mode interupsi.
a. Konfigurasi pada codevision

b. Listing program

Petunjuk Praktikum AVR-Triwiyanto

Page 110

#include<mega8535.h> unsigned
char led=0x00;
interrupt [TIM0_OVF] void timer0_overflow(void)
{
TCNT0=0x00; led=~led;
PORTC=led;
}
void main(void){
DDRC=0xff;
PORTC=0xff;
TCNT0=0x00;
TCCR0=0x05;
TIMSK=0x01;
TIFR=0x00; #asm("sei")
while(1)
{
}
}

Percobaan 7.2. Geser LED dengan waktu Tunda


Pada percobaan ini sebuah LED akan digeser ke kiri dengan waktu tunda yang
diberikan dari TIMER0.
a. Konfigurasi codevision ( sama dengan percobaan 7.1)

b. Listing Program
#include <mega8535.h> unsigned
char led=0xfe;
interrupt [TIM0_OVF] void timer0_overflow(void)
{

Petunjuk Praktikum AVR-Triwiyanto

Page 111

TCNT0=0x00; // setting inisial counter0 led<<=1;


led|=1;

// geser data led ke kiri 1 kali

// led di-OR-kan dengan data 1 if (led==0xff)

{led=0xfe; }
PORTC=led; // keluarkan data led ke port C
}
void main (void)
{
DDRC=0xff; // port C sebagai output
PORTC=led;
TCNT0=0x00;

// setting inisial counter0

TCCR0=0x05;

// setting skala clock

TIMSK=0x01;

// aktifkan interrupt timer0

TIFR=0x00;
#asm ("sei");

// hapus bendera interrupt timer0


while(1)

{PORTC=led;
}
}

7.3. Percobaan Timer pada Pembuatan Jam Digital Detik


Pada percobaan ini akan dibuat simulasi jam digital dengan angka mulai dari 00 sampai
dengan 99, bila nilai data =100, maka akan kembali lagi ke 00. Program ini
menggunakan system interupsi yang dibangkitkan dari TIMER 1, 16 bit. Satu kali
interupsi yang dibangkitkan adalah sebesar 1 detik, dan menaikkan nilai data. Data
ditampilkan pada LCD Karakter.

a. Konfigurasi codevision
Petunjuk Praktikum AVR-Triwiyanto

Page 112

b. Listing program
#include <mega8535.h>
#include
<stdlib.h>
unsigned char temp[6];
int data;
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
TCNT1H=0x0b; TCNT1L=0xdc;
data++; //setelah 1 detik increament data

Petunjuk Praktikum AVR-Triwiyanto

Page 113

}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;

Petunjuk Praktikum AVR-Triwiyanto

Page 114

TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16.56 kHz
// Mode: Normal top=FFFFh // OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0xC2;
TCNT1L=0xF7;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off

Petunjuk Praktikum AVR-Triwiyanto

Page 115

// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
if (data==100)
{
lcd_clear();
data=0;
}
lcd_gotoxy(0,0);
lcd_putsf(" Lab Mikro-TEM ");
itoa(data,temp); //menampilkan di LCD
lcd_gotoxy(0,1);
lcd_puts(temp);
};
}

7.4. Percobaan Timer pada Pembuatan Jam Digital, Detik, Menit, Jam
Pada percobaan ini, dibuat jam digital dengan waktu detik, menit dan jam yang
ditampilkan pada LCD karakter. Pada percobaan ini menggunakan TIMER1 16 bit yang
Petunjuk Praktikum AVR-Triwiyanto

Page 116

memberikan interupsi setiap 1 detik, sehingga data detik akan increment, dilanjutkan
dengan increment pada menit dan jam.
a. Konfigurasi codevision

b. Listing Program
unsigned char temp[6]; int detik=0,
menit=0, jam=12, indeks=6;
#include <mega8535.h>
#include <stdlib.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
// Timer 1 overflow interrupt service routine

Petunjuk Praktikum AVR-Triwiyanto

Page 117

interrupt [TIM1_OVF] void timer1_ovf_isr(void)


{
// Reinitialize Timer 1 value
TCNT1H=0xD23A >> 8;
TCNT1L=0xD23A & 0xff;
detik++;
}
void jam_digital()
{
if (detik==60)
{
lcd_clear();
detik=0;
menit++;
}
if (menit==60)
{
lcd_clear();
menit=0;
jam++;
}
if (jam==24)
{
lcd_clear();
jam=0;
}
}
void tampil_lcd()
{
lcd_gotoxy(0,0);
LAB-MIKRO TEM ");

lcd_putsf("

itoa(jam,temp); //menampilkan JAM di


LCD
lcd_gotoxy(0,1);
lcd_puts(temp);

Petunjuk Praktikum AVR-Triwiyanto

Page 118

itoa(detik,temp); //menampilkan DETIK di


LCD
lcd_gotoxy(6,1);
lcd_puts(temp);
lcd_gotoxy(5,1); //menampilkan :
lcd_putsf(":");
itoa(menit,temp); //menampilkan MENIT di
LCD
lcd_gotoxy(3,1);
lcd_puts(temp);
lcd_gotoxy(2,1); //menampilkan :
lcd_putsf(":");
}
void set_jam()
{
if (PINB.0==0 && indeks==6)
{
TIMSK=0x00; //MENGHENTIKAN
TIMER
delay_ms(300);
indeks=5;
while (PINB.0==1 && indeks==5)
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
jam=jam+10;
if (jam>=24)
{
jam=23;
}
}
if (PINB.2==0)
{
delay_ms(300);
jam=jam-10;
if (jam<=9)
{

Petunjuk Praktikum AVR-Triwiyanto

Page 119

lcd_clear();
(jam<0)
jam=0;

if
{
}
}

}
}
}
if (PINB.0==0 && indeks==5)
{
delay_ms(300);
indeks=4;
while (PINB.0==1 && indeks==4)
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
jam=jam+1;
if
(jam>=24)
{
jam=23;
}
}
if (PINB.2==0)
{
delay_ms(300);
jam=jam-1;
(jam<=9)
lcd_clear();
(jam<0)

if
{
if
{
jam=0;
}

}
}
}
}
Petunjuk Praktikum AVR-Triwiyanto

Page 120

if (PINB.0==0 && indeks==4)


{
delay_ms(300);
indeks=3;
while (PINB.0==1 && indeks==3)
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
menit=menit+10;
if (menit>=60)
{
menit=59;
}
}
if (PINB.2==0)
{
delay_ms(300);
menit=menit-10;
if
(menit<=9)
{
lcd_clear();
if
(menit<0)
{
menit=0;
}
}
}
}
}
if (PINB.0==0 && indeks==3)
{
delay_ms(300);
indeks=2;
while (PINB.0==1 && indeks==2)
{
tampil_lcd();
Petunjuk Praktikum AVR-Triwiyanto

Page 121

if (PINB.1==0)
{
delay_ms(300);
menit=menit+1;
if (menit>=60)
{
menit=59;
}
}
if (PINB.2==0)
{
delay_ms(300);
menit=menit-1;
if
(menit<=9)
{
lcd_clear();
if
(menit<0)
{
menit=0;
}
}
}
}
}
if (PINB.0==0 && indeks==2)
{
delay_ms(300);
indeks=1;
while (PINB.0==1 && indeks==1)
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
detik=detik+1;
if
(detik>=60)
{
detik=59;
}
}

Petunjuk Praktikum AVR-Triwiyanto

Page 122

if (PINB.2==0)
{
delay_ms(300);
detik=detik-1;
if
(detik<=9)
{
lcd_clear();
if
(detik<0)
{
detik=0;
}
}
}
}
}
if (PINB.0==0 && indeks==1)
{
delay_ms(300);
indeks=0;
while (PINB.0==1 && indeks==0)
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
detik=detik+1;
if
(detik>=60)
{
detik=59;
}
}
if (PINB.2==0)
{
delay_ms(300);
detik=detik-1;
if (detik<=9)
{

Petunjuk Praktikum AVR-Triwiyanto

Page 123

lcd_clear();
(detik<0)
detik=0;

if
{
}
}

}
}
indeks=6;
TIMSK=0x04;
delay_ms(450);
}
}

//MEMULAI

LAGI

TIMER

void main(void)
{
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0xff;
DDRD=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal
top=FFFFh // OC1A output:
Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0xD2;
TCNT1L=0x3A;
Petunjuk Praktikum AVR-Triwiyanto

Page 124

ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
//
LCD
lcd_init(16);

module

initialization

// Global enable interrupts


#asm("sei")
while (1)
{
jam_digital();
tampil_lcd();
set_jam();
};
}

Petunjuk Praktikum AVR-Triwiyanto

Page 125

Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk
PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan
b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas
c. Jelaskan masing-masing program tersebut diatas.
d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu
e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum
PERCOBAAN 9
P W M (Pulse Width Modulation)

PWM (Pulse Width Modulation) atau modulasi lebar pulsa adalah salah satu
keunggulan Timer/Counter yang terdapat pada Atmega8535. Ketiga jenis Timer/Counter
pada Atmega8535 dapat menghasilkan pulsa PWM. Pulsa PWM adalah sederetan
pulsa yang lebar pulsanya dapat diatur. Pulsa PWM berfungsi mengatur kecepatan
motor DC, mengatur gelap terang LED dan aplikasi lainnya. PWM adalah Timer mode
Output Compare yang canggih. Mode PWM Timer juga dapat mencacah turun yang
berlawanan dengan mode Timer lainnya yang hanya mencacah naik. Pada mode PWM
tersebut, Timer mencacah naik hingga mencapai nilai TOP, yaitu 0xFF (255) untuk
PWM 8 bit dan 0x3FF (1023) untuk PWM 10 bit atau 0x1ff untuk PWM 9bit.
Timer/Counter 0 dan Timer/Counter 2 hanya memiliki PWM 8 bit, sedangkan pada
Timer/Counter 1 memiliki 8 bit, 9bit dan PWM 10 bit. Pemilihan mode PWM diatur oleh
register-register Timer/counter seperti yang sudah di jelaskan sebelumnya. PWM
dengan timer/counter1
timer/counter1 dapat digunakan untuk membangkitkan 2 channel PWM yang
masingmasing berdiri sendiri atau tidak tergantung satu sama lain. Berikut adalah
contoh listing program PWM 10bit. Keluaran OC1A merupakan PWM A dan keluaran
OC1B merupakan PWM B.
Percobaan
Petunjuk Praktikum AVR-Triwiyanto

Page 126

#include <mega8535.h> void


main(void)
{
DDRD=0xff;
//inisialisasi timer1 sebagai fast pwm 10bit
TCCR1A=0xA3;
TCCR1B=0X0B;
TCNT1=0x0000;
OCR1A=0x0100; //setting duty cycle 25% (PWMA)
OCR1B=0x0300; //setting duty cycle 75% (PWMB)
while(1);} penjelasan:
secara garis besar, cara kerja mode fast pwm 10-bit pada program diatas adalah
dengan membandingkan isi register TCNT1 dengan register OCR1A dan OCR1B untuk
menghasilkan keluaran PWM. Isi register TCNT1 akan mencacah naik setiap interval
waktu tertentu detak clock kristal sesuai pengaturan register TCCR1B sampai bernilai
maksimum 0x03ff (1023). Selama nilai register TCNT1 lebih kecil dari data pembanding
yaiut OCR1A atau OCR1B maka keluaran pin OC1A dan OC1B akan high dan jika
TCNT1 sudah melebihi data pembanding OCR1A atau OCR1B maka keluaran OC1A
dan OC1B akan low. Jika nilai TCNT1 sudah mencapai maksimum yaitu 0x03ff maka
nilai TCNT1 akan reset kembali ke 0x0000.
Pada program diatas TCCR1A diisi 0xA3 berarti mode fast PWM 10bit dengan pola
keluaran OC1A dan OC1B adalah high selama TCNT1 lebih kecil dari OCR1A-OCR1B
dan low setelah TCNT1 melebihi OCR1A-OCR1B. Register TCCR1B diisi 0x0b berarti
sekala clock 64. Sehingga jika kristal yang digunakan 8MHZ maka fpwm=fosc / (N *
(1+TOP)) fpwm= 8000000 / (64*(1+1023)) fpwm=122Hz
Petunjuk Praktikum AVR-Triwiyanto

Page 127

atau dinyatakan periode adalah


Tpwm=1/fpwm
Tpwm=(1+TOP) *Tosc *N
Tpwm=(1+1023) * 0.125us *64
Tpwm=8.192ms
Duty cycle = OCR1A /TOP *100%
256/1023 *100% =25%
OCR1B /TOP *100% ==

Petunjuk Praktikum AVR-Triwiyanto

768/1023 *100% =75%

Page 128

JISP
1
2
3
4
5

RST

pinb.7
pinb.6
pinb.5

Percobaan 10.1. Setting PWM


#include <stdio.h>
#include <mega8535.h>
#include <delay.h>
void InisialisasiPWM();
Petunjuk Praktikum AVR-Triwiyanto

Page 129

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;
}

Percobaan 10.2. Control PWM 8bit dengan ADC


#include <mega8535.h>
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm

Petunjuk Praktikum AVR-Triwiyanto

Page 130

#define ADC_VREF_TYPE

0x60 unsigned

char data1,data2;
char

lcd_buffer[33];

Petunjuk Praktikum AVR-Triwiyanto

Page 131

void inisialisasi_PORT()
{
//PORT initialization as input or output
DDRA=DDRB=0x00;
DDRC=DDRD=0xFF;

//input
//output

PORTB=0xff;//pull up
}
void inisialisasi_PWM_on()
{
TCCR1A=0xA1;
TCCR1B=0x0c;
}
void inisialisasi_PWM_off()
{
TCCR1A=0x00;
TCCR1B=0x00;
}

void pwm1(unsigned char satu)


{
OCR1AL=satu;
PORTD.0=0; PORTD.1=1;
}

void pwm2(unsigned char dua)


{
OCR1BL=dua;

Petunjuk Praktikum AVR-Triwiyanto

Page 132

Petunjuk Praktikum AVR-Triwiyanto

Page 133

PORTD.2=1; PORTD.3=0;
}

void inisialisasi_LCD()
{
// LCD module initialization lcd_init
(16);
}
unsigned char read_adc(unsigned char input_adc)
{
ADMUX=input_adc|ADC_VREF_TYPE;
ADCSRA|=0x40; while ((ADCSRA &
0x10)==0); ADCSRA|=0x10; return ADCH;
}

void inisialisasi_ADC()
{
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x87;
}
void main(void)
{
//Panggil Fungsi inisialisasi_PORT();
inisialisasi_ADC();

Petunjuk Praktikum AVR-Triwiyanto

Page 134

inisialisasi_LCD();

inisialisasi_PWM_on(); while(1){

data1=read_adc(0); data2=read_adc(1); pwm1(data1);


pwm2(data2);

if(PINB.0==0) {inisialisasi_PWM_off();
lcd_clear();

lcd_putsf("pwm off");

delay_ms(100);
}
else

{inisialisasi_PWM_on();

lcd_putsf("fast PWM 8-bit");

lcd_gotoxy(0,1);

sprintf(lcd_buffer,"PWM1=%i",data1);
lcd_gotoxy(8,1);
lcd_puts(lcd_buffer);

lcd_clear();

lcd_puts(lcd_buffer);
sprintf(lcd_buffer,"PWM2=%i",data2);

delay_ms(100);

};
}}

Petunjuk Praktikum AVR-Triwiyanto

Page 135

PERCOBAAN 10
INTERUPSI
Interrupt adalah suatu kejadian atau peristiwa yang menyebabkan mikrokontroler
berhenti sejenak untuk melayani interrupt tersebut.
Yang harus diperhatikan untuk menguanakan interupsi adalah, kita harus tau
sumbersumber interupsi, vektor layanan interupsi dan yang terpenting rutin lyanan
interupsi, yaitu subrutin yang akan dikerjakan bila terjadi interupsi .
Interrupt Service Routine.
Analoginya adalah sebagai berikut, seseorang sedang mengetik laporan, mendadak
telephone berdering dan menginterrupsi orang tersebut sehingga menghentikan
Petunjuk Praktikum AVR-Triwiyanto

Page 136

pekerjaan mengetik dan mengangkat telephone. Setelah pembicaraan telephone yang


dalam hal ini adalah merupakan analogi dari Interrupt Service Routine selesai maka
orang tersebut kembali meneruskan pekerjaanya mengetik. Demikian pula pada sistem
mikrokontroler yang sedang menjalankan programnya, saat terjadi interrupt, program
akan berhenti sesaat, melayani interrupt tersebut dengan menjalankan program yang
berada pada alamat yang ditunjuk oleh vektor dari interrupt yang terjadi hingga selesai
dan kembali meneruskan program yang terhenti oleh interrupt tadi. Seperti yang terlihat
Gambar di bawah, sebuah program yang seharusnya berjalan terus lurus, tiba-tiba
terjadi interrupt dan harus melayani interrupt tersebut terlebih dahulu hingga selesai
sebelum ia kembali meneruskan pekerjaannya.

AVR menyediakan beberapa sumber interupsi yang berbeda. Tiap-tiap interupsi


dan reset memiliki vektor program yang berbeda. Semua interupsi didasari

satu

bit

tunggal yang harus diberi logika tinggi sebagai Global Interrupt Enable pada Status
Register untuk mengaktifkan interupsi.
Atmega8535 menyediakan 21 macam sumber interupsi yang masing-masing
memiliki alamata vektor interupsi seperti pada tabel 19. Setiap interupsi yang aktif akan
dilayani segera setelah terjadi permintaan interupsi, tapi jika dalam waktu bersamaan

Petunjuk Praktikum AVR-Triwiyanto

Page 137

terjadi lebih dari satu interupsi maka perioritas yang akan diselesaikan terlebih dahulu
adalah interupsi yang memiliki urut lebih kecil sesuai tabel 19 berikut.

Pada AVR terdapat 3 pin interupsi eksternal, yaitu INT0,INT1,dan INT2. Interupsi
eksternal dapat dibangkitkan apabila ada perubahan logika baik transisi naik (rising
edge) maupun transisi turun (falling edge) pada pin interupsi. Pengaturan kondisi
keadaan yang menyebabkan terjadinya interupsi eksternal diatur oleh 2 buah register
I/O yaitu MCUCR dan register MCUCSR
Petunjuk Praktikum AVR-Triwiyanto

Page 138

MCUCR ( MCU Control Register), mengatur pemicu interupsi dan fungsi MCU secara
umum.

Bit penyusunnya:
Bit ISC11 dan ISC10 bersama-sama menentukan kodisi yang dapat menyebakan
interupsi eksternal pada pin INT1. Dan Bit ISC01 dan ISC00 bersama-sama
menentukan kodisi yang dapat menyebakan interupsi eksternal pada pin INT0.
keadaan selengkapnya terlihat pada table berikut :
ISCx1

ISCx0

Pemicu interupsi

Level rendah pada pin INT0 atau INT1

Perubahan level pada pin INT0 atau INT1

Transisi turun pada pin INT0 atau INT1

Transisi naik pada pin INT0 atau INT1

MCUCSR ( MCU Control and Status Register)

Bit 6 ISC2 : interrupt sense control INT2


Untuk interupsi INT2 hanya memiliki satu bit ISC, sehingga hanya memiliki 2 kondisi
pemicu interupsi yaitu:
0 = interupsi terjadi jika terjadi transisi turun pada pin INT2
1= interupsi terjadi jika terjadi transisi naik pada pin INT2
Petunjuk Praktikum AVR-Triwiyanto

Page 139

Untuk sumber interupsi INT2, perubahan/transisi sinyal yang dapat membangkitkan


intrupsi harus memiliki lebar pulsa minimal sekitar 50ns.
GICR
Pemilihan pengaktifan interupsi eksternal diatur oleh register GICR ( General Interrupt
Control Register ) yang terlihat pada gambar berikut :

Bit penyusunnya dapat dijelaskan sebagai berikut:


Bit INT1 adalah bit untuk mengaktifkan interupsi eksternal 1. Apabila bit tersebut
diberi logika 1 dan bit I pada SREG (status register) juga satu , maka interupsi
eksternal 1 akan aktif.
Bit INT0 adalah bit untuk mengaktifkan interupsi eksternal 0. Apabila bit tersebut
diberi logika 1 dan bit I pada SREG (status register) juga satu , maka interupsi
eksternal 0 akan aktif.
Bit INT2 adalah bit untuk mengaktifkan interupsi eksternal 2. Apabila bit tersebut
diberi logika 1 dan bit I pada SREG (status register) juga satu , maka interupsi
eksternal 2 akan aktif.

SREG (Status Register)


Digunakan untuk menyimpan informasi dan hasil operasi aritmatika terakhir. Data
SREG selalu berubah setiap instruksi atau operasi pad ALU dan datanya tidak otomatis
tersimpan apabila terjadi instruksi percabangan baik karena interupsi maupun lompatan.

Petunjuk Praktikum AVR-Triwiyanto

Page 140

Bit 7 I : Global interrupt enable


Bit I digunakan untuk mengaktifkan interupsi secara umum (interupsi global). Jika bit I
bernilai 1 maka interupsi secara umum aktif, tetapi jika 0 maka tidak satupun interupsi
yang aktif.

R8
220

D8

10.1. Percobaan Interupsi LED

Pada percobaan ini, dua buah interupsi yang dibangkitkan secara eksternal dari INT0
dan INT1 akan merubah kondisi LED yang terhubung pada PORTC. Bila terjadi
Petunjuk Praktikum AVR-Triwiyanto

Page 141

interupsi pada INTO maka kondisil LED adalah : 11110000, sebaliknya bila terjadi
inteerupsi pada INT1 maka kondisi LED adalah : 00001111.

a. Konfigurasi pada Codevision

b. Listing Program
//INTERUPSI EKSTERNAL 0 DAN EKSTERNAL 1
#include<mega8535.h>
void main()
{
DDRC=0xff;
PORTC=0xff;
DDRD=0xff;
PORTD=0xff;
GICR=0b11000000;
#asm("sei")
while(1)
{;}
}

Petunjuk Praktikum AVR-Triwiyanto

Page 142

interrupt [2] void interupsi_ext0(void)


{
PORTC=0xF0;
}
interrupt [3] void interupsi_ext1(void)
{
PORTC=0x0F;
}

10.2. Percobaan Interupsi dengan LED


Pada percobaan ini akan menggunakan tiga buah interupsi eksternal INT0, INT1
dan INT2, masing-masing interupsi akan menampilkan LED yang berbeda-beda.
a. Konfigurasi pada Codevision

b. Listing Program.
#include <mega8535.h>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
Petunjuk Praktikum AVR-Triwiyanto

Page 143

// Place your code here


PORTC=0xf0;
}
// External Interrupt 1 service routine interrupt
[EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
PORTC=0x0f;
}
// External Interrupt 2 service routine
interrupt [EXT_INT2] void ext_int2_isr(void)
{
// Place your code here
PORTC=0x55;
}
// Declare your global variables here
void main(void)
{
PORTD=0x00;
DDRD=0x00;
DDRC=0xff;
PORTC=0xff;
// External Interrupt(s) initialization
// INT0: On // INT0 Mode: Low level
// INT1: On // INT1 Mode: Low level
// INT2: On // INT2 Mode: Falling Edge
GICR|=0xE0; //aktifkan semua external interupsi
MCUCR=0x00; //level rendah INT0 dan INT1
MCUCSR=0x00;//Falling edge, transisi turun
GIFR=0xE0;
// Global enable interrupts
#asm("sei")
while (1)
{
};}
Petunjuk Praktikum AVR-Triwiyanto

Page 144

PERCOBAAN 11
Serial communication

USART (universal synchronous and asynchronous serial receiver and transmitter) juga
merupakan salah satu mode komunikasi serial yang dimiliki atmega8535. USART
memiliki fleksibilitas yang tinggi, yang dapat digunakan untuk melakukan transfer data
baik antar mikrokontroller maupun dengan modul-modul ekternal termasuk PC yang
memiliki fitur UART.
USART memungkinkan transmisi data baik secara synchronous maupun asynchronous
sehingga dengan demikian USART pasti kompatible dengan UART. Pada atmega8535,
secara umum pengaturan mode komunikasi baik synchronous maupun asynchronous
adalah sama. Perbedaan hanyalah terletak pada sumber clock saja. Jika pada mode
asynchronous masing-masing peripheral memiliki sumber clock sendiri maka pada
mode synchronous hanya ada satu clock sumber yang digunakan bersama-sama.
Dengan demikian secara hardware untuk mode asynchronous hanya membutuhkan 2
pin yaitu TXD dan RXD sedangkan untuk asynchronous harus 3pin yaitu TXD,RXD, dan
XCK.

Petunjuk Praktikum AVR-Triwiyanto

Page 145

USART Data Register (UDR)


Digunakan sebagai buffer untuk menyimpan data baik yang akan dikirimkan maupun
yang diterima dalam komunikasi USART.

KONFIGURASI TIMER/COUNTER DAN INTERRUPT


Gambar dan table berikut ini dikutipkan dari datasheet ATMega 8525:

Pengaturan sumber clock (hal. 85)

Petunjuk Praktikum AVR-Triwiyanto

Page 146

Pahami Timing Diagram!

Register-register penting lain (hal. 85)

Petunjuk Praktikum AVR-Triwiyanto

Page 147

Petunjuk Praktikum AVR-Triwiyanto

Page 148

Berikut adalah contoh program komunikasi 2 buah mikrokontroller

Pada program ini, mikrokontroller1 akan mengirimkan data sesuai penekanan tombol
pada PORTA, dan mikrokontroller2 menerima data kemudian mengeluarkan ke PORTA.
Dalam penyambungan antara 2 mikrokontroller ini, TXD mikro1 dihubungkan dengan
RXD mikro2 dan RXD mikro1 dihubungkan dengan TXD mikro2.

Program mikrokontroller1
#include<mega8535.h> #include<delay.h>
const long int osilator = 8000000; unsigned long
int UBRR;

unsigned char data; void

inisialisasiuart (unsigned long int baud_rate)


{
UBRR=(osilator/(16*baud_rate))-1;
UBRRL=UBRR;
UBRRH=UBRR>>8;
UCSRB=0b00011000;
UCSRC=0x8e;

Petunjuk Praktikum AVR-Triwiyanto

Page 149

void

kirim()
{
while(!(UCSRA & 0x20)); UDR=data;
}
void check()
{
while(!(UCSRA & 0x20));
UDR='*';
}
void main(void){
DDRA=0x00; PORTA=0xff;
inisialisasiuart(9600); while(1){
data=PINA;
check(); kirim();
}
}
Program mikrkontroller2
#include<mega8535.h>
#include<delay.h> const long int
osilator = 8000000; unsigned
long int UBRR;

unsigned

char data,check; void


inisialisasiuart (unsigned long int
baud_rate)
{
UBRR=(osilator/(16*baud_rate))-1;
Petunjuk Praktikum AVR-Triwiyanto

Page 150

UBRRL=UBRR;
UBRRH=UBRR>>8;
UCSRB=0b00011000;
UCSRC=0x8e;
}

unsigned

char terima_byte(void)
{
while(!(UCSRA & 0x80)); return
UDR;
}
void main(void){
DDRA=0xff; PORTA=0;
inisialisasiuart(9600);
while(1){

ulangi:

check=terima_byte();
if(check=='*')goto lanjut;
else{goto ulangi;}; lanjut:
data=terima_byte();
PORTA=data;
}
}
Komunikasi dengan komputer
Komunikasi komputer dengan mikrokontroller membutuhkan hardware tambahan yaitu
dengan menggunakan max232 yang berfungsi sebagai penyama level tegangan antara
komputer dan mikrokontroller. Sedangkan tuk penyambungannya sama yaitu TXD mikro
dengan RXD komputer dan sebaliknya. Berikut contoh program kirim data serial
komputer yang disimulasikan dengan proteus melalui virtual terminal.
Petunjuk Praktikum AVR-Triwiyanto

Page 151

#include<mega8535.h>
#include<stdio.h> #include<delay.h> const long
int osilator=8000000; unsigned long int UBRR;
unsigned char data; unsigned char pesan[
]={"\n TEST SERIAL\n\r"};
/*fungsi Inisialisasi UART*/ void InisialisasiUART (
unsigned long int baud_rate)
{
UBRR=(osilator/(16*baud_rate))-1;
UBRRL=UBRR;
UBRRH=UBRR>>8;
UCSRB=0b00011000;
UCSRC=0x8e;
}
void inisialisasi_io()
{
DDRA=0x00; //input
PORTA=PORTB=0xff; //pull up
DDRC=DDRB=DDRD=0xff; //output
PORTD=PORTC=0xff;
Petunjuk Praktikum AVR-Triwiyanto

Page 152

}
void KirimByte( unsigned char data)
{
while (!(UCSRA & 0x20));// tunggu data yang lalu selesai
UDR = data;
}
void tampilan(){
putsf("*********************************************");
putchar(13); putsf(" program terminal komunikasi
serial UART "); putchar(13); putsf(" Micro club ");
putchar(13);

putsf(" Selamat Datang... ");

putchar(13);
}

void send_message()
{
int i=0;
for(i=0;i<15;i++)

UDR=pesan[i];
while(!UCSRA.5)
{;}
}
}
void main(void){ inisialisasi_io();
InisialisasiUART(9600);
while(1){ data='u';
Petunjuk Praktikum AVR-Triwiyanto

Page 153

KirimByte(data);
send_message();
tampilan(); delay_ms(100);
}
}

PERCOBAAN 12
REAL TIME CLOCK

1.

REAL TIME CLOCK


Real Time Clock berhubungan dengan waktu mulai dari detik, menit, jam, hari,

tanggal, bulan dan tahun. Tetapi IC RTC ini juga bisa dipakai untuk menyimpan data di
dalam internal RAM RTC ini, di mana data tersebut tidak bisa hilang meskipun supply
diputus, hal ini karena di dalam
IC RTC tersebut ada battery-nya yang selalu hidup untuk menjalankan clock-nya
jadi waktu (clock) tetap berjalan meskipun supply dimatikan. IC RTC ini masih
mempunyai kelebihan bisa dipakai sebagai timer atau alarm. Untuk hitungan detik,
menit, jam, hari, tanggal, bulan dan tahun dengan tahun kabisat yang valid sampai 2100
karena compensation valid up to 2100. Mode yang dipilih juga bisa 12 or 24 hour clock
with AM dan PM in 12 hour mode.
Petunjuk Praktikum AVR-Triwiyanto

Page 154

RTC 1307 menggunakan teknik I2C yaitu memakai 2 jalur untuk keperluan
transfer data secara seri, sedangkan SPI dan MicroWire memakai 3 jalur. Semua teknik
mempunyai 1 jalur untuk Clock, I2C hanya punya satu jalur data 2 arah, sedangkan SPI
dan MicroWire mempunyai 2 jalur data satu arah, masing-masing untuk jalur data
masuk dan jalur data keluar.
Komunikasi dengan protokol I2C pada RTC 1307 mempunyai cara yang sama
seperti mengakses eeprom serial tipe 24C04 misalnya. Pertama kirim start-bit, alamat
RTC(0xC0) dengan bit R/W low, kemudian nomor register yang ingin diakses.

2.

KONFIGURASI PIN
Untuk lebih jelas mengenai fungsi dan kegunaan dari IC ini terlebih dahulu akan

dijelaskan fungsi dari tiap-tiap pin pada IC keluarga DS1307, di mana diketahui bahwa
IC DS1307 memiliki 8 pin atau kaki, seperti pada Gambar 1.

Gambar 1.

Pin-pin IC DS1307 (Dallas, 2004)

Fungsi dari tiap pin RTC DS1307 antara lain :


1. X1, X2
Terhubung dengan kaki kristal 32768kHz
Petunjuk Praktikum AVR-Triwiyanto

Page 155

2. Vbat
Terhubung dengan battery 3,3 volt
3. GND, Vcc
Input tegangan Vcc adalah +5V.
4. SQW (Square Wave Output)
Pin SQW dapat mengeluarkan sinyal salah satu dari 13 taps yang disediakan oleh
15 tingkat pembagi internal dari RTC.
5. SCL
Pin SCL mengeluarkan sinyal clock. Pin ini harus diberi resistor Pull Up.
6. SDA
Pin SCL mengeluarkan sinyal data

VCC
VCC
10k
R29

PD3

R30
10k
U4

Y2
ZTA

1
2
6

J5
2
1

VCC

3
8

X1
X2
SCLK

DS1307
SDA
SQW/OUT

PD2

VBAT
VCC

CON2

9.1. Percobaan RTC dengan display LED


#include <mega8535.h>
#include <ds1307.h>
#include <delay.h>
#include <stdio.h>
#include <i2c.h>
Petunjuk Praktikum AVR-Triwiyanto

Page 156

// I2C Bus functions


#asm
.equ __i2c_port=0x12 ;PORTD
.equ __sda_bit=2
.equ __scl_bit=3
#endasm
void main(void)
{
unsigned char jam, menit, detik, tanggal, bulan, tahun;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
DDRC=0xFF;
DDRD=0xFF;
// I2C Bus initialization i2c_init();
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0 rtc_init(0,0,0);
rtc_set_time(8,19,0); // set jam 08:19:00
rtc_set_date(24,4,11); // set tanggal: 24 april 2011
while (1)
{
// Place your code here
rtc_get_time(&jam,&menit,&detik); // mengakses jam
rtc_get_date(&tanggal,&bulan,&tahun); //mengakses tanggal
;
Petunjuk Praktikum AVR-Triwiyanto

Page 157

PORTC=detik;
};
}
9.2. Percobaan RTC dengan display 7 Segmen
int data, ubah,menitsat, menitpul, detiksat, detikpul;
#include <mega8535.h>
#include <ds1307.h>
#include <delay.h>
#include <stdio.h>
// I2C Bus functions
#asm
.equ __i2c_port=0x12 ;PORTD
.equ __sda_bit=2
.equ __scl_bit=3
#endasm
#include <i2c.h>
void ubah_ke_format7segment()//fungsi untuk mengubah kedalam format 7segment
{
if (ubah==0){ubah=0xc0;}
if (ubah==1){ubah=0xf9;}
if
(ubah==2){ubah=0xa4;}
if
(ubah==3){ubah=0xb0;}
if
(ubah==4){ubah=0x99;}
if
(ubah==5){ubah=0x92;}
if
(ubah==6){ubah=0x82;}
if
(ubah==7){ubah=0xf8;}
if
(ubah==8){ubah=0x80;}
if
(ubah==9){ubah=0x90;}
}
void tampil_7segment()
{
PORTC=menitpul;//mengirimkan data kedigit5
Petunjuk Praktikum AVR-Triwiyanto

Page 158

PORTD.5=0;
PORTD.6=0;
delay_ms(10);
PORTC=menitsat;//mengirimkan data kedigit6
PORTD.5=1;
PORTD.6=0;
delay_ms(10);
PORTC=detikpul;//mengirimkan data kedigit7
PORTD.5=0;
PORTD.6=1;
delay_ms(10);
PORTC=detiksat;//mengirimkan data kedigit8
PORTD.5=1;
PORTD.6=1;
delay_ms(10);
//lamanya waktu scanning ditentukan oleh intruksi delay
}
void main(void)
{
unsigned char jam, menit, detik, tanggal, bulan, tahun;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
DDRC=0xFF;
DDRD=0xFF;
// I2C Bus initialization i2c_init();
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0 rtc_init(0,0,0);
rtc_set_time(8,19,0); // set jam 08:19:00
Petunjuk Praktikum AVR-Triwiyanto

Page 159

rtc_set_date(24,4,11); // set tanggal: 24


april 2011
while (1)
{
// Place your code here
rtc_get_time(&jam,&menit,&detik); // mengakses jam
rtc_get_date(&tanggal,&bulan,&tahun); //mengakses tanggal
data = detik;
detiksat = data % 10;
// sat = sisa dari
data dibagi 10
detikpul = data / 10;
data = menit;
menitsat = data % 10;
// sat = sisa dari data dibagi 10
menitpul = data / 10;
;
ubah=detiksat;
ubah_ke_format7segment();
detiksat=ubah;
;
ubah=detikpul;
ubah_ke_format7segment();
detikpul=ubah;
;
ubah=menitsat;
ubah_ke_format7segment();
menitsat=ubah;
;
ubah=menitpul;
ubah_ke_format7segment();
menitpul=ubah;
;
tampil_7segment();
delay_ms(10);
};
}

APLIKASI AVO METER DIGITAL

Petunjuk Praktikum AVR-Triwiyanto

Page 160

#include <mega8535.h>
#include <delay.h>
#include <stdio.h>

// Alphanumeric LCD Module functions


#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

#define ADC_VREF_TYPE 0x40


float data,data2,data3,data4,hasil; char
lcd_buffer[30];

// Read the AD conversion result unsigned int


read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;

Petunjuk Praktikum AVR-Triwiyanto

Page 161

// Wait for the AD conversion to complete


while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10; return ADCW;
}

void adc_init(){
// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: On
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x83;
SFIOR&=0xEF;
SFIOR|=0x10;
}

void io_init(){
DDRA=0x00;
DDRC=0xff;
}
void main(void)
Petunjuk Praktikum AVR-Triwiyanto

Page 162

{ io_init(); adc_init(); //
LCD module initialization
lcd_init(16);
PORTA.1=1;

while (1)
{
awal:
data=read_adc(0);
data2=read_adc(2);
data3=read_adc(3);
data4=read_adc(4);

if(PINA.1==0){
data=(float)data/1023*5;
hasil=(float)((float)400*data)-1000;
lcd_clear();

lcd_putsf("multimtr digital");

lcd_gotoxy(0,1);
sprintf(lcd_buffer,"R=%4.0f ohm",hasil);
lcd_puts(lcd_buffer);

delay_ms(50);

goto awal;
Petunjuk Praktikum AVR-Triwiyanto

Page 163

};

if(data==data2){data=data;};
if(data==data3){data=data*2;};
if(data==data4){data=data*4;};

data=(float)data/1023*5;
lcd_putsf("multimtr digital");

lcd_clear();
lcd_gotoxy(0,1);

sprintf(lcd_buffer,"Tegangan=%2.2f V",data);
lcd_puts(lcd_buffer);

delay_ms(50);

};
}

Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk
PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan
b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas
c. Jelaskan masing-masing program tersebut diatas.
d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu
e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum
RANGKAIAN PROGRAMMER

Petunjuk Praktikum AVR-Triwiyanto

Page 164

(AD
C3) PC3 (ADC2)
PC2 (ADC1)
PC1
A
D
C
0
)
P
C
0
A
G
N
D
AREF
AVCC
(SCK)
PB5
(MIS
O) PB4
(
OC2/MOSI)
PB3
S
S
/
O
C
1
B
) PB2 (OC1A) PB1

Petunjuk Praktikum AVR-Triwiyanto

Page 165

Membuat Project dengan CodeVisionAVR.


Pada penjelasan berikutnya, sebagai contoh digunakan modul AVR yang mempunyai
hubungan sebagai berikut:

PortA terhubung dengan 8 buah LED dengan operasi aktif high

PortB terhubung dengan 8 buah saklar dengan operasi aktif high

PortC terhubung dengan LCD alphanumeric 16 kolom x 2 baris

Jalankan aplikasi CodeVisionAVR dengan cara melakukan klik ganda pada shortcut
ikon CodeVisionAVR yang terbentuk pada Desktop.

Gambar 16. Ikon CodeVisionAVR pada Desktop

Sebuah Splash Screen akan muncul seperti ditunjukkan oleh Gambar 17. Informasi
tentang versi yang dipakai dan keterangan evaluation akan terlihat.

Petunjuk Praktikum AVR-Triwiyanto

Page 166

Gambar 17. Tampilan Splash Screen


Beberapa detik kemudian IDE dari CodeVisionAVR akan muncul seperti yang
ditunjukkan oleh Gambar 18.

Gambar 18. IDE CodeVisionAVR

Untuk memulai membuat project baru, pada menubar, pilih File New, seperti yang
ditunjukkan oleh Gambar 19.
Petunjuk Praktikum AVR-Triwiyanto

Page 167

Gambar 19. Membuat file baru

Anda harus membuat sebuah project sebagai induk desain dengan memilih Project, lalu
klik tombol OK seperti pada Gambar 20.

Gambar 20. Membuat project baru

Berikutnya Anda akan ditanya apakah akan menggunakan CodeWizardAVR. Tentu saja lebih
menyenangkan bila Anda memilih jawaban ya dengan cara menekan tombol Yes seperti
pada Gambar 21.

Petunjuk Praktikum AVR-Triwiyanto

Page 168

Gambar 21. Memilih untuk menggunakan CodeWizardAVR

Tampilan CodeWizardAVR yang sederhana namun lengkap ditunjukkan oleh Gambar


22. Pilih Chip dengan IC yang Anda gunakan. Sebagai contoh Anda memilih Chip
ATmega8535. Tab-tab pada CodeWizardAVR menunjukkan fasilitas yang dimiliki oleh
chip yang Anda pilih. Cocokkan pula frekuensi kristal yang Anda gunakan pada bagian
Clock. Pengisian frekuensi clock digunakan oleh software untuk menghitung rutin-rutin
seperti delay agar diperoleh perhitungan yang cukup akurat.

Gambar 22. CodeWizardAVR pada tab Chip


Petunjuk Praktikum AVR-Triwiyanto

Page 169

Berikutnya Anda akan menginisialisasi Port A yang terhubung dengan LED. LED
merupakan modul output. Pada tab Port bagian Port A, ubah bagian Data Direction
menjadi OUT dengan nilai output sama dengan 0 seperti pada Gambar 23. Artinya Port
A digunakan sebagai port output dengan nilai awal nol setelah kondisi reset. Kemudian
lakukan inisialisasi Port B seperti pada Gambar 24. Port B tersambung dengan saklar
sebagai modul input. Pada sub-tab Port B, yakinkan Data Direction pada posisi IN
dengan resistor pullup internal yang disingkat dengan huruf P. Dengan mengaktifkan
resistor pull-up internal, Anda tidak perlu menambahkan resistor pull-up pada saklar.

Gambar 23. Seting Port A sebagai pin output

Petunjuk Praktikum AVR-Triwiyanto

Page 170

Gambar 24. Seting Port B sebagai pin input dengan pull-up resistor
LCD alphanumeric yang dihubungkan dengan Port C haruslah mempunyai
pengkawatan seperti yang ditunjukkan oleh Gambar 25. Pada tab LCD, pilihlah Port C.

Gambar 25. Seting LCD pada Port C

Petunjuk Praktikum AVR-Triwiyanto

Page 171

Karena pada contoh ini tidak digunakan fasilitas lain maka seting CodeWizardAVR siap
disimpan dalam file. Pada menu CodeWizardAVR, pilih File Generate, Save and Exit,
seperti yang ditunjukkan oleh Gambar 26.

Gambar 26. Menyimpan seting


Agar file yang dihasilkan tidak berantakan, buatlah sebuah folder baru, misalnya folder
bernama my project, seperti yang ditunjukkan oleh Gambar 27.

Petunjuk Praktikum AVR-Triwiyanto

Page 172

Gambar 26. Membuat folder baru

Kemudian masuk kedalam folder tersebut untuk menyimpan file-file yang dihasilkan
oleh CodeWizardAVR. Yang pertama Anda diminta untuk memberikan nama file C yang
dihasilkan. Misalnya beri nama coba, lalu klik tombol Save. Lebih jelas pada Gambar
27. File tersebut nantinya akan mempunyai akhiran .C.

Gambar 27. Menyimpan file pertama

Yang kedua Anda diminta untuk memberikan nama file project yang dihasilkan.
Misalnya beri nama coba, lalu klik tombol Save. Lebih jelas pada Gambar 28. File
tersebut nantinya akan mempunyai akhiran .prj.

Petunjuk Praktikum AVR-Triwiyanto

Page 173

Gambar 28. Menyimpan file kedua


Yang terakhir Anda diminta untuk memberikan nama file project CodeWizard yang
dihasilkan. Misalnya beri nama coba, lalu klik tombol Save. Lebih jelas pada Gambar
29. File tersebut nantinya akan mempunyai akhiran .cwp.

Gambar 29. Menyimpan file ketiga

Petunjuk Praktikum AVR-Triwiyanto

Page 174

Setelah ketiga file disimpan maka pada Project Navigator akan muncul nama project
beserta file C-nya. Secara bersamaan isi file C akan dibuka pada jendela editor seperti
ditunjukkan oleh Gambar 30.

Gambar 30. Project baru telah siap dalam hitungan detik


Sekarang Anda coba untuk menyisipkan instruksi utama. Instruksi ini ditambahkan pada
badan program file coba.c seperti yang ditunjukkan oleh Gambar 31.

Gambar 31. Menambahkan inti program

Petunjuk Praktikum AVR-Triwiyanto

Page 175

Program tambahan tersebut bertujuan untuk menampilkan kata-kata pada LCD


kemudian menampilkan nilai pada saklar pada LED yang terpasang. Jika nanti saklar
iaktifkan maka LED yang bersesuaian akan aktif pula. Kemudian pilih menu Project
Compile untuk melakukan kompilasi seperti yang ditunjukkan oleh Gambar 32. Lalu
kotak dialog seperti ditunjukkan Gambar 33 akan muncul. Klik tombol OK.

Gambar 32. Melakukan kompilasi

Petunjuk Praktikum AVR-Triwiyanto

Page 176

Gambar 33. Informasi hasil kompilasi


Program yang Anda buat siap untuk ditransfer kedalam mikrokontroler. Sebelumnya
Anda harus melakukan seting pada programmernya. Pada menu pilih Setting
Programmer, seperti pada Gambar 34.

Gambar 34. Melakukan seting pada programmer

Petunjuk Praktikum AVR-Triwiyanto

Page 177

Pilihlah programmer sesuai dengan yang Anda gunakan. Pada Gambar 35 ditunjukkan
menggunakan programmer Kanda Systems STK200+/300 sebagai contoh. Programmer
ini menggunakan kabel paralel yang terhubung dengan port paralel pada komputer
Anda.

Gambar 35. Menggunakan programmer STK200+/300

Kemudian pilih menu Project

Configure, seperti yang ditunjukkan oleh Gambar 36.

Kotak dialog pada Gambar 37 akan muncul, pada tab After Make, pilih Program the
Chip. Lalu klik tombol OK.

Petunjuk Praktikum AVR-Triwiyanto

Page 178

Gambar 36. Melakukan konfigurasi project

Gambar 37. Memilih opsi Program the Chip After Make

Setelah melakukan seting, lakukan make project dengan memilih menu Project Make,
seperti ditunjukkan oleh Gambar 38. Apabila tidak ada kesalahan maka kotak dialog
Petunjuk Praktikum AVR-Triwiyanto

Page 179

informasi seperti pada Gambar 39 akan muncul. Klik tombol Program untuk mentransfer
program kedalam mikrokontroler.

Gambar 38. Melakukan make project

Gambar 39. Kotak dialog informasi hasil make

Petunjuk Praktikum AVR-Triwiyanto

Page 180

Apabila muncul kotak dialog seperti pada Gambar 40 menandakan telah terjadi suatu
hal yang menyebabkan proses transfer gagal. Penyebabnya adalah: suplai tegangan
mikrokontroler dan programmer belum dinyalakan, tipe programmer tidak sama dengan
yang digunakan, alamat port paralel tidak cocok, atau mikrokontrolernya rusak.

Gambar 40. Gagal melakukan transfer program

Bila kerusakan seperti yang ditampilkan oleh Gambar 40 telah diperbaiki atau bila tidak
ada kerusakan maka proses transfer atau yang umum disebut dengan proses download
akan berlangsung seperti yang ditunjukkan oleh Gambar 41.

Gambar 41. Proses transfer ke mikrokontroler

Coba Anda perhatikan yang terjadi dengan modul yang terpasang, apakah pada LCD
muncul tulisan seperti yang telah Anda program dan bila saklar diubah posisinya maka
LED yang bersesuaian akan menyala. Bila Anda ingin menambahkan instruksi lain

Petunjuk Praktikum AVR-Triwiyanto

Page 181

maka Anda dapat melakukan penyuntingan program pada file .C-nya. Kemudian
lakukan kompilasi dan make project berikutnya proses download.
Contoh Program Jam Digital

#include <mega8535.h>
#asm
.equ __lcd_port=0x15
#endasm
/* now you can include the LCD Functions */
#include <lcd.h>
#include <delay.h> #include
<stdio.h>
#define sw_ok
PINB.0
#define sw_cancel
PINB.1
#define sw_up
PINB.2
#define sw_down
PINB.3
unsigned char detik=0,menit=0,jam=0;
unsigned char buffer1=0,buffer2=0,buffer3=0;
long int data; unsigned char lcd_buffer[33];
void inisialisasi_tim0_on()
{
TCNT0=0x00;
// setting inisial counter0
TCCR0=0x05;
TIMSK=0x01; // aktifkan interrupt timer0
TIFR=0x00;
// hapus bendera interrupt timer0
#asm ("sei");
}
void inisialisasi_tim0_off(){
TCCR0=0x00;
#asm ("cli");
}
void atur()
{
Petunjuk Praktikum AVR-Triwiyanto

Page 182

lcd_clear(); lcd_gotoxy(0,1);
lcd_putsf("atur== ");
buffer1=detik;
buffer2=menit;
buffer3=jam;
set1:
if(sw_cancel==0){goto selesei;};
if(sw_ok==0){delay_ms(500);goto set2;};
if(sw_up==0){buffer1++;delay_ms(50);};
if(sw_down==0){buffer1--;delay_ms(50);};
if(buffer1>=60){buffer1=0;}; lcd_gotoxy(7,1);
lcd_putsf("detik"); lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i : %i",buffer3,buffer2,buffer1);
lcd_puts(lcd_buffer); goto set1; set2:
if(sw_cancel==0){goto set1;};
if(sw_ok==0){delay_ms(500);goto set3;};
if(sw_up==0){buffer2++;delay_ms(50);};
if(sw_down==0){buffer2--;delay_ms(50);};
if(buffer2>=60){buffer2=0;}; lcd_gotoxy(7,1);
lcd_putsf("menit"); lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i : %i",buffer3,buffer2,buffer1);
lcd_puts(lcd_buffer); goto set2; set3:
if(sw_cancel==0){goto set2;};
if(sw_ok==0){delay_ms(500);goto selesei;};
if(sw_up==0){buffer3++;delay_ms(50);};
if(sw_down==0){buffer3--;delay_ms(50);};
if(buffer3>=12){buffer3=0;}; lcd_gotoxy(7,1);
lcd_putsf("jam "); lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i :
%i",buffer3,buffer2,buffer1);
lcd_puts(lcd_buffer); goto set3; selesei:
menit=detik=jam=data=0;
menit=buffer2;
jam=buffer3;
lcd_clear();
inisialisasi_tim0_on();
data=(int)buffer1*10;
return;
}
void main()
{
DDRB=0x00; PORTB=0xff;
Petunjuk Praktikum AVR-Triwiyanto

Page 183

lcd_init(16);
inisialisasi_tim0_on();
lcd_clear(); while(1)
{
if(PINB.3==0){inisialisasi_tim0_off();delay_ms(500);atur();}
detik=data/10;
if(detik>=60) {detik=0;data=0;menit=menit+1;};
if(menit>=60){menit=0;jam=jam+1;}; if(jam>=12){jam=0;};
lcd_clear(); lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i : %i",jam,menit,detik);
lcd_puts(lcd_buffer); delay_ms(100);
}
}
interrupt [TIM0_OVF] void timer0_overflow(void)
{
TCNT0=0x00;
data=data+1;
}

Petunjuk Praktikum AVR-Triwiyanto

Page 184

Anda mungkin juga menyukai