petunjuk praktikum avr-codevision

181
Petunjuk Praktikum AVR-Triwiyanto Page 1 Microcontroller ATMEGA8535 Trainer Kit Experiment Manual P E T U N J U K P R A K T I K U M MIKROKONTROLLER AVR Oleh: Triwiyanto Media Pengembangan Mikrokontroler AVR dengan CodeVision JURUSAN TEKNIK ELEKTROMEDIK POLTEKKES KEMENKES SURABAYA 2011

Upload: faela-maana-shufa

Post on 28-Dec-2015

446 views

Category:

Documents


7 download

DESCRIPTION

petunjuk praktikum AVR-CodeVision,LED,push button,seven segment,lcd 2x16

TRANSCRIPT

Petunjuk Praktikum AVR-Triwiyanto Page 1

Microcontroller ATMEGA8535 Trainer Kit

Experiment Manual

P E T U N J U K P R A K T I K U M MIKROKONTROLLER AVR

Oleh:

Triwiyanto

Media Pengembangan

Mikrokontroler

AVR dengan CodeVision

JURUSAN TEKNIK ELEKTROMEDIK

POLTEKKES KEMENKES SURABAYA

2011

Petunjuk Praktikum AVR-Triwiyanto Page 2

PERCOBAAN 1

L E D

I. Pendahuluan

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 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.

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

Petunjuk Praktikum AVR-Triwiyanto Page 3

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) sebagai kondisi transisi.

Tabel Konfigurasi Pin Port

Tabel diatas menunjukkan

konfigurasi pin pada port-

port mikrokontroler. Bit 2 –

PUD = Pull-up Disable, bila bit diset bernilai 1 maka pull-up pada port I/O akan

dimatikan walaupun register DDxn dan PORTxn dikonfigurasikan untuk menyalakan

pull-up (DDxn=0, PORTxn=1).

Codevision AVR

Petunjuk Praktikum AVR-Triwiyanto Page 4

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 di-

compile agar diperoleh bentuk hexadesimal dengan bentuk file *.hex. bentuk hexa inilah

yang akan dapat di download ke mikrokontroller.

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

Petunjuk Praktikum AVR-Triwiyanto Page 5

Langkah selanjutnya yaitu, membuat file tempat penulisan source code yang ber

ektensi .c. yaitu, pilih File > New > Pilih Source > OK.

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.

Petunjuk Praktikum AVR-Triwiyanto Page 6

Fungsi Delay

Menghasilkan delay dalam program-C. Berada pada header delay.h yang harus di-

Includekan 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.

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

PC

7

PC

0

R5220

PC

4

R6220

D4

LED

PC

3

PC

2

PC

5

D8

LED

R8220

R2220

D7

LED

D1

LED

R7220

PC

1

R4220

PC

6

VCC

D5

LED

J3 CON2

12

D6

LED

R1220

D2

LED

R3220

D3

LED

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

Petunjuk Praktikum AVR-Triwiyanto Page 9

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. 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)

Petunjuk Praktikum AVR-Triwiyanto Page 10

PERCOBAAN 2

S W Push Button

I. Pendahuluan

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

Petunjuk Praktikum AVR-Triwiyanto Page 11

Gambar 2.1. Rangkaian LED terhubung ke PORTC

Gambar 2.2. Rangkaian Push Button terhubung ke PORTB

PC

7

PC

0

R5220

PC

4

R6220

D4

LED

PC

3

PC

2

PC

5

D8

LED

R8220

R2220

D7

LED

D1

LED

R7220

PC

1

R4220

PC

6

VCC

D5

LED

J3 CON2

12D6

LED

R1220

D2

LED

R3220

D3

LEDP

B1

PB

5

SW

3

PB

3S

W4

SW

5

PB

2

PB

0

SW

2

PB

6

PB

4

SW

6

PB

7

SW

1

SW

8

SW

7

Petunjuk Praktikum AVR-Triwiyanto Page 12

(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

1. Percobaan Input/Ouput

Pada percobaan ini PORTB difungsikan sebagai input dan PORTC

difungsikan sebagai output.

Petunjuk Praktikum AVR-Triwiyanto Page 13

#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 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; //PB as output

PORTC= 0x00; //keep all LEDs off

DDRB = 0x00; //PC as input

PORTB.0 = 1; //enable pull ups for

PORTB.1 = 1; //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 ENABLE OUTPUT C B A G1 /G2A /G2B Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7

0 0 0 1 0 0 0 1 1 1 1 1 1 1

0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 1 1 1 1

0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1

1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 0 1

1 1 1 1 0 0 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

dihidupkan. Agar display tampak nyala secara bersamaan maka ketiga display

tersebut harus dihidupkan secara bergantian dengan waktu tunda tertentu.

Petunjuk Praktikum AVR-Triwiyanto Page 17

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 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 Display g f e d c b a

1 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1

0 1 0 0 1 0 0 2

0 1 1 0 0 0 0 3 :

: 0 0 0 1 0 0 0 A

0 0 0 0 0 1 1 b 1 0 0 0 1 1 0 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

VCC

PC

3

Y4

PC

0

PC

5P

C6

Y2PD7

PC

4

PC

5

PC

5

Y6

PC

6

Y7

Y7

Q8

2N

5322

3

2

1

PC

6

PC

2Y5

PC

2 Y0

Q22N

53223

2

1

SEGMENT1

CO

NN

SO

CK

ET

5x2

1 2 3 4 5

10

9 8 7 6

e d cm

2c dot

g fcm

1 a b

PC

1

R19220

PC

3SEGMENT8

CO

NN

SO

CK

ET

5x2

1 2 3 4 5

10

9 8 7 6

e d cm

2c dot

g fcm

1 a b

Q1

2N

53223

2

1

VCC

PD5

R18220

PC

72

R31 1K

Y0

R25220

VCCP

C0

J13

CON2

12

Y6

PC

4

PC

1

SEGMENT2

CO

NN

SO

CK

ET

5x2

1 2 3 4 5

10

9 8 7 6

e d cm

2c dot

g fcm

1 a b

U2

74LS138

123

645

15141312111097

ABC

G1G2AG2B

Y0Y1Y2Y3Y4Y5Y6Y7

Y3P

C3

PC

0

PC

4

Y1

PC

1

PD6

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();

}

}

2. Percobaan Display 7 segmen increment data 0 sd 9

Petunjuk Praktikum AVR-Triwiyanto Page 21

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

Petunjuk Praktikum AVR-Triwiyanto Page 24

b. Listing program

#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; // sat = sisa dari data dibagi 10

dataPul = dataTemp / 10;

dataTemp=dataSat;

convert();

PORTD.5=1;

PORTD.6=0;

delay_ms(30);

dataTemp=dataPul;

convert();

PORTD.5=0;

PORTD.6=0;

Petunjuk Praktikum AVR-Triwiyanto 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

1 VSS Ground voltage

2 VCC +5V

3 VEE Contrast voltage

4 RS

Register Select

0 = Instruction Register

1 = Data Register

5 R/W

Read/ Write, to choose write or read mode

0 = write mode

1 = read mode

6 E

Enable

0 = start to lacht data to LCD character

1= disable

7 DB0 LSB

8 DB1 -

9 DB2 -

10 DB3 -

Petunjuk Praktikum AVR-Triwiyanto Page 28

11 DB4 -

12 DB5 -

13 DB6 -

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.

Petunjuk Praktikum AVR-Triwiyanto Page 29

Beberapa perintah dasar yang harus dipahami adalah inisialisasi LCD Character,

Function Set Mengatur interface lebar data, jumlah dari baris dan ukuran font karakter

KONTROL DATA

RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

0 pulse 0 0 0 1 DL N F X X

CATATAN:

X : Don’t 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

0 pulse 0 0 0 0 0 0 1 I/D S

Catatan:

I/D: Increment/ decrement dari alamat DDRAM dengan 1 ketika kode karakter dituliskan

ke DDRAM.

I/D = “0”, decrement

I/D= “1”, increment

Petunjuk Praktikum AVR-Triwiyanto Page 30

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

KONTROL DATA

RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

0 pulse 0 0 0 0 0 1 D C B

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

0 pulse 0 0 0 0 0 0 0 0 1

Petunjuk Praktikum AVR-Triwiyanto Page 31

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

0 pulse 0 0 0 0 1 D/C R/L X X

Catatan : x = Dont care

D/C R/L Note

0 0 Geser posisi kursor ke kiri

0 1 Geser posisi kursor ke kanan

1 0 Geser keseluruhan display ke kiri

1 1 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.

Petunjuk Praktikum AVR-Triwiyanto Page 32

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

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.

Petunjuk Praktikum AVR-Triwiyanto Page 33

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

/* 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)

Petunjuk Praktikum AVR-Triwiyanto Page 34

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

#include <mega8535.h>

#include <delay.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

//

Petunjuk Praktikum AVR-Triwiyanto Page 35

#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

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

Petunjuk Praktikum AVR-Triwiyanto Page 36

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 }

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

Petunjuk Praktikum AVR-Triwiyanto Page 37

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

#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

Petunjuk Praktikum AVR-Triwiyanto Page 38

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

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

Petunjuk Praktikum AVR-Triwiyanto Page 39

5. Percobaan Cetak Karakter Interaksi dengan Saklar

Pada percobaan ini interaksi cetak karakter dilakukan dengan penekanan pada

sebuah saklar yang terhubung pada PORTB.

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

Petunjuk Praktikum AVR-Triwiyanto Page 40

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.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);

}

}

Petunjuk Praktikum AVR-Triwiyanto Page 42

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

Petunjuk Praktikum AVR-Triwiyanto Page 43

PERCOBAAN 5

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.

Petunjuk Praktikum AVR-Triwiyanto Page 44

III. Dasar Teori

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.

Petunjuk Praktikum AVR-Triwiyanto Page 45

Gambar 5.1. Diagram blok ADC

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

Petunjuk Praktikum AVR-Triwiyanto Page 46

Gambar 5.4. Konfigurasi saat ADLAR sama dengan satu

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

Petunjuk Praktikum AVR-Triwiyanto Page 48

Tabel pemilihan bit saluran pembacaan ADC (lanjutan)

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

Petunjuk Praktikum AVR-Triwiyanto Page 49

d) ADIF merupakan bit penanda akhir suatu konversi ADC. Bernilai awal 0. Jika

bernilai 1,maka suatu saluran telah selesai dan data siap diakses

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

Petunjuk Praktikum AVR-Triwiyanto Page 50

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

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

Petunjuk Praktikum AVR-Triwiyanto Page 51

Gambar 5.8. Konfigurasi ADC pada codevision

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

Petunjuk Praktikum AVR-Triwiyanto Page 52

SFIOR&=0xEF; //do nothing SFIOR|=0x10; //do nothing while (1) { // Place your code here }; }

Berikut merupakan contoh ADC dengna display LCD

#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 = 1 x Vref 2 nbit

Resolusi ADC = 1 x 5 2 10

Resolusi ADC = 4.88mV

Hasil konversi ADC dihitung dengan menggunakan rumus sebagai berikut

Hasil konversi = ���.����

����

Penjelasan program

inisialisasi_ADC

Petunjuk Praktikum AVR-Triwiyanto Page 54

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

Petunjuk Praktikum AVR-Triwiyanto Page 55

Pada fungsi ini, ADMUX diisikan dengan adc_input dan di-or-kan dengan

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

PA2

XTAL1

IC1

ATMEGA8535-DIL40

3

1213

2

16171819

1110

876

3635343332

37

1

45

9

1415

20 21

403938

31302928272625242322

PB2(INT2/AIN0)

XTAL2XTAL1

PB1(T1)

PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)

GNDVCC

PB7[SCK)PB6[MISO)PB5(MOSI)

PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)

AREF

PA3(ADC3)

PB0(XCK/T0)

PB3(OC0/AIN1)PB4(SS)

RESET

PD0(RXD)PD1(TXD)

PD6(ICP) PD7(OC2)

PA0(ADC0)PA1(ADC1)PA2(ADC2)

AGNDAVCC

PC7(TOSC2)PC6(TOSC1)

PC5PC4PC3PC2

PC1(SDA)PC0(SCL)

VCC

PA0

PD4PD5PD6

PC6

VCC

AREF

PB5

XTAL2 PC7

VCC

PA4

PB0

R41

POT

13

2

PA7

PB1

PC4

PA3

R38

POT

13

2

PD1PC3

R43

POT1

32

PD0

PD3

PA5

VCC

PC0PD7

GND

PA1

VCC

PB4

PB2

VCC

PB6

PD2

PA6

PC2

PB7

PB3

PC5

GND

R40

POT

13

2

PC1

Petunjuk Praktikum AVR-Triwiyanto Page 56

1. Percobaan ADC display LED

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

modul ini LED terhubung ke PORTC

Gambar 5.10. Koneksi tegangan analog pada ATMEGA8535

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

berikut

Gambar 5.11. Konfigurasi ADC pada ATMEGA8535

PC

7

PC

0

R5220

PC

4

R6220

D4

LED

PC

3

PC

2

PC

5

D8

LED

R8220

R2220

D7

LED

D1

LED

R7220

PC

1

R4220

PC

6

VCC

D5

LED

J3 CON2

12

D6

LED

R1220

D2

LED

R3220

D3

LED

Petunjuk Praktikum AVR-Triwiyanto Page 57

b. Lakukan generate program, dan editing program berikut:

/* 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);

}

}

Petunjuk Praktikum AVR-Triwiyanto Page 58

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.

Gambar 5.12. Driver dan decoder pada 7 segmen

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

berikut

VCC

PC

3

Y4

PC

0

PC

5P

C6

Y2PD7

PC

4

PC

5

PC

5

Y6

PC

6

Y7

Y7

Q8

2N

5322

3

2

1

PC

6

PC

2

Y5

PC

2 Y0

Q2

2N

53223

2

1SEGMENT1

CO

NN

SO

CK

ET

5x2

1 2 3 4 5

10

9 8 7 6

e d cm

2c dot

g fcm

1 a b

PC

1

R19220

PC

3

SEGMENT8

CO

NN

SO

CK

ET

5x2

1 2 3 4 5

10

9 8 7 6

e d cm

2c dot

g fcm

1 a b

Q1

2N

53223

2

1

VCC

PD5

R18220

PC

72

R31 1K

Y0

R25220

VCC

PC

0

J13

CON2

12

Y6

PC

4

PC

1

SEGMENT2

CO

NN

SO

CK

ET

5x2

1 2 3 4 5

10

9 8 7 6

e d cm

2c dot

g fcm

1 a b

U2

74LS138

123

645

15141312111097

ABC

G1G2AG2B

Y0Y1Y2Y3Y4Y5Y6Y7

Y3

PC

3

PC

0

PC

4

Y1

PC

1

PD6

Petunjuk Praktikum AVR-Triwiyanto Page 59

Gambar 5.13. Konfigurasi ADC, PORTC dan PORTD pada codevision

Petunjuk Praktikum AVR-Triwiyanto Page 60

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 61

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();

Petunjuk Praktikum AVR-Triwiyanto Page 62

sat=ubah;

//

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

Petunjuk Praktikum AVR-Triwiyanto Page 63

a. Pengaturan pada codevision

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

Petunjuk Praktikum AVR-Triwiyanto Page 64

else if (adc_data < (2*1023)/5) { 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 65

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 66

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

Petunjuk Praktikum AVR-Triwiyanto Page 67

merubah data decimal ke FLOAT. Konfersi dilakukan dengan menggunakan

persamaan sebagai berikut:

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 68

#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 69

// 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; SFIOR=0x00;

Petunjuk Praktikum AVR-Triwiyanto Page 70

// 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 71

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

Petunjuk Praktikum AVR-Triwiyanto Page 72

PERCOBAAN 6

K E Y P A D

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

PB6PB5

1

5PB3

CAN

6PB4

COR

PB7

ENT

PB0 32

7

J7

CON8

12345678

MEN

|

|98

0

PB2PB1

4

Petunjuk Praktikum AVR-Triwiyanto Page 73

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 74

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;

};

Petunjuk Praktikum AVR-Triwiyanto Page 75

PORTB.7=1;

}

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 76

// 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 77

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 78

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 79

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 80

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 81

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

Petunjuk Praktikum AVR-Triwiyanto Page 82

keluaran OC0 bergulir (toggle) dapat membangkitkan gelombang kotak dengan

frekuensi:

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

Petunjuk Praktikum AVR-Triwiyanto Page 83

satu bit set. Maka fungsi pin ini tergantung pada setting bit pada WGM00 dan

WGM01. 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.

Petunjuk Praktikum AVR-Triwiyanto Page 84

Ketiga bit ini untuk memilih sumber detak yang akan digunakan oleh

Timer/Counter, Tabel 2.6 berikut menampilkan konfigurasi pemilihan sumber

detak.

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.

Petunjuk Praktikum AVR-Triwiyanto Page 85

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.

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

Petunjuk Praktikum AVR-Triwiyanto Page 86

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

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:

Petunjuk Praktikum AVR-Triwiyanto Page 87

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 88

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

Correct PWM

Tabel 8.9. Konfigurasi mode PWM

Pengaturan Timer/Counter 1 juga diatur melalui register TCCR1B yang dapat

dilihat pada Gambar 2.7.

Petunjuk Praktikum AVR-Triwiyanto Page 89

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.

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

Petunjuk Praktikum AVR-Triwiyanto Page 90

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.

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.

Petunjuk Praktikum AVR-Triwiyanto Page 91

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.

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 .

Petunjuk Praktikum AVR-Triwiyanto Page 92

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 93

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

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

Petunjuk Praktikum AVR-Triwiyanto Page 94

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

Petunjuk Praktikum AVR-Triwiyanto Page 95

8.1. Percobaan COUNTER Display LED

#include<mega8535.h>

void main()

{

PORTC=0xFF;

DDRC=0xFF;

TCCR0=0b00000110;

TCNT0=0;

while(1)

{PORTC=~TCNT0;}

}

XTAL1

PB1

PC5

PC7

PA0

PB7

PD3PD2

PA6

PD6

PA3

PD7PC0

VCC

PD0PC6

PA5

PC1

PB0

PD1

AREF

PB4

PC4

PB6

PB2

PB5

GND

IC1

ATMEGA8535-DIL40

3

1213

2

16171819

1110

876

3635343332

37

1

45

9

1415

20 21

403938

31302928272625242322

PB2(INT2/AIN0)

XTAL2XTAL1

PB1(T1)

PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)

GNDVCC

PB7[SCK)PB6[MISO)PB5(MOSI)

PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)

AREF

PA3(ADC3)

PB0(XCK/T0)

PB3(OC0/AIN1)PB4(SS)

RESET

PD0(RXD)PD1(TXD)

PD6(ICP) PD7(OC2)

PA0(ADC0)PA1(ADC1)PA2(ADC2)

AGNDAVCC

PC7(TOSC2)PC6(TOSC1)

PC5PC4PC3PC2

PC1(SDA)PC0(SCL)

XTAL2

PD5

PA1

PD4

PC3PC2

VCC

PA4

PA7

PA2

GND

Petunjuk Praktikum AVR-Triwiyanto Page 96

8.2. Percobaan Counter dengan Display 7 Segmen

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 97

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 98

} 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; DDRC=0xFF;

Petunjuk Praktikum AVR-Triwiyanto Page 99

// 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; TCNT2=0x00; OCR2=0x00;

Petunjuk Praktikum AVR-Triwiyanto Page 100

// 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 101

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 102

PERCOBAAN 7

T I M E R

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, teman-

teman 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)

�567 : 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 )

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.

TCNT #65.536& '� C �.���.���

D�

TCNT 49.911

TCNT C2F7h

Petunjuk Praktikum AVR-Triwiyanto Page 103

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.

TCNT #256& '� C �.���.���

����

TCNT 158,34

TCNT 9Eh

Petunjuk Praktikum AVR-Triwiyanto Page 104

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. Konfigurasi pada codevision pada TIMER0

Petunjuk Praktikum AVR-Triwiyanto Page 105

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

PC

7

PC

0

R5220

PC

4

R6220

D4

LED

PC

3

PC

2

PC

5

D8

LED

R8220

R2220

D7

LED

D1

LED

R7220

PC

1

R4220

PC

6

VCC

D5

LED

J3 CON2

12

D6

LED

R1220

D2

LED

R3220

D3

LED

Petunjuk Praktikum AVR-Triwiyanto Page 106

b. Listing program

#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 107

TCNT0=0x00; // setting inisial counter0

led<<=1; // geser data led ke kiri 1 kali

led|=1; // 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; // hapus bendera interrupt timer0

#asm ("sei");

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.

Petunjuk Praktikum AVR-Triwiyanto Page 108

a. Konfigurasi codevision

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 109

}

// 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 110

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 111

// 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 112

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 113

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

lcd_putsf(" LAB-MIKRO TEM ");

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

lcd_gotoxy(0,1);

lcd_puts(temp);

Petunjuk Praktikum AVR-Triwiyanto Page 114

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

Petunjuk Praktikum AVR-Triwiyanto Page 115

jam=jam-10;

if (jam<=9)

{

lcd_clear();

if (jam<0)

{

jam=0;

}

}

}

}

}

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;

if (jam<=9)

{

lcd_clear();

if (jam<0)

{

Petunjuk Praktikum AVR-Triwiyanto Page 116

jam=0;

}

}

}

}

}

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;

}

}

}

}

}

Petunjuk Praktikum AVR-Triwiyanto Page 117

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

{

delay_ms(300);

indeks=2;

while (PINB.0==1 && indeks==2)

{

tampil_lcd();

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)

Petunjuk Praktikum AVR-Triwiyanto Page 118

{

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)

{

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;

Petunjuk Praktikum AVR-Triwiyanto Page 119

if (detik>=60)

{

detik=59;

}

}

if (PINB.2==0)

{

delay_ms(300);

detik=detik-1;

if (detik<=9)

{

lcd_clear();

if (detik<0)

{

detik=0;

}

}

}

}

indeks=6;

TIMSK=0x04; //MEMULAI LAGI TIMER

delay_ms(450);

}

}

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.

Petunjuk Praktikum AVR-Triwiyanto Page 120

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

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 module initialization

lcd_init(16);

// Global enable interrupts

#asm("sei")

while (1)

{

jam_digital();

tampil_lcd();

set_jam();

};

}

Petunjuk Praktikum AVR-Triwiyanto Page 121

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

Petunjuk Praktikum AVR-Triwiyanto Page 122

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 masing-

masing 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

#include <mega8535.h>

void main(void)

{

DDRD=0xff;

//inisialisasi timer1 sebagai fast pwm 10bit

Petunjuk Praktikum AVR-Triwiyanto Page 123

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

atau dinyatakan periode adalah

Petunjuk Praktikum AVR-Triwiyanto Page 124

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% == 768/1023 *100% =75%

Petunjuk Praktikum AVR-Triwiyanto Page 125

Percobaan 10.1. Setting PWM

#include <stdio.h>

#include <mega8535.h>

#include <delay.h>

void InisialisasiPWM();

int data1;

int data2;

void main (void)

5V

C3 100nF1

pinb.5

X1

5V

RST

R1

SW2

12

TIP9013

TIP3055

U1

ATMEGA8535

3

1213

2

16171819

1110

876

3635343332

37

1

45

9

1415

20 21

403938

31302928272625242322

PB2(INT2/AIN0)

XTAL2XTAL1

PB1(T1)

PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)

GNDVCC

PB7[SCK)PB6[MISO)PB5(MOSI)

PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)

AREF

PA3(ADC3)

PB0(XCK/T0)

PB3(OC0/AIN1)PB4(SS)

RESET

PD0(RXD)PD1(TXD)

PD6(ICP) PD7(OC2)

PA0(ADC0)PA1(ADC1)PA2(ADC2)

AGNDAVCC

PC7(TOSC2)PC6(TOSC1)

PC5PC4PC3PC2

PC1(SDA)PC0(SCL)

D2

DIODE

D1

DIODE

12V2

JISP

12345

pinb.7

C2 22pF

TIP9013

5V

pinb.7

pinb.6

470 TIP3055

pinb.6

470

MG2

MOTOR DC

12

MG2

MOTOR DC

12

RST

pinb.5

12V2

C1 22pF

Petunjuk Praktikum AVR-Triwiyanto Page 126

{

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

#define ADC_VREF_TYPE 0x60

unsigned char data1,data2;

char lcd_buffer[33];

Petunjuk Praktikum AVR-Triwiyanto Page 127

void inisialisasi_PORT()

{

//PORT initialization as input or output

DDRA=DDRB=0x00; //input

DDRC=DDRD=0xFF; //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 128

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 129

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_clear();

lcd_putsf("fast PWM 8-bit");

lcd_gotoxy(0,1);

sprintf(lcd_buffer,"PWM1=%i",data1);

lcd_puts(lcd_buffer);

lcd_gotoxy(8,1);

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

lcd_puts(lcd_buffer);

delay_ms(100);

} ;

}}

Petunjuk Praktikum AVR-Triwiyanto Page 130

Petunjuk Praktikum AVR-Triwiyanto Page 131

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 sumber-

sumber 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

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.

Petunjuk Praktikum AVR-Triwiyanto Page 132

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

terjadi lebih dari satu interupsi maka perioritas yang akan diselesaikan terlebih dahulu

adalah interupsi yang memiliki urut lebih kecil sesuai tabel 19 berikut.

Petunjuk Praktikum AVR-Triwiyanto Page 133

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 134

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

0 0 Level rendah pada pin INT0 atau INT1

0 1 Perubahan level pada pin INT0 atau INT1

1 0 Transisi turun pada pin INT0 atau INT1

1 1 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

Petunjuk Praktikum AVR-Triwiyanto Page 135

‘1’= interupsi terjadi jika terjadi transisi naik pada pin INT2

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 136

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.

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

interupsi pada INTO maka kondisil LED adalah : 11110000, sebaliknya bila terjadi

inteerupsi pada INT1 maka kondisi LED adalah : 00001111.

PC

7

PC

0

R5220

PC

4

R6220

D4

LED

PC

3

PC

2

PC

5

D8

LED

R8220

R2220

D7

LED

D1

LED

R7220

PC

1

R4220

PC

6

VCC

D5

LED

J3 CON2

12

D6

LED

R1220

D2

LED

R3220

D3

LED

Petunjuk Praktikum AVR-Triwiyanto Page 137

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) {;} } interrupt [2] void interupsi_ext0(void) { PORTC=0xF0; } interrupt [3] void interupsi_ext1(void) { PORTC=0x0F; }

Petunjuk Praktikum AVR-Triwiyanto Page 138

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) { // 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

Petunjuk Praktikum AVR-Triwiyanto Page 139

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 140

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.

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:

Petunjuk Praktikum AVR-Triwiyanto Page 141

• Pengaturan sumber clock (hal. 85)

Pahami Timing Diagram!

• Register-register penting lain (hal. 85)

Petunjuk Praktikum AVR-Triwiyanto Page 142

Petunjuk Praktikum AVR-Triwiyanto Page 143

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;

Petunjuk Praktikum AVR-Triwiyanto Page 144

UCSRB=0b00011000;

UCSRC=0x8e;

}

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;

Petunjuk Praktikum AVR-Triwiyanto Page 145

unsigned long int UBRR;

unsigned char data,check;

void inisialisasiuart (unsigned long int baud_rate)

{

UBRR=(osilator/(16*baud_rate))-1;

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;

Petunjuk Praktikum AVR-Triwiyanto Page 146

}

}

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.

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

Petunjuk Praktikum AVR-Triwiyanto Page 147

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;

}

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

}

Petunjuk Praktikum AVR-Triwiyanto Page 148

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

KirimByte(data);

send_message();

tampilan();

delay_ms(100);

}

}

Petunjuk Praktikum AVR-Triwiyanto Page 149

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.

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.

Petunjuk Praktikum AVR-Triwiyanto Page 150

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

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.

Petunjuk Praktikum AVR-Triwiyanto Page 151

5. SCL

Pin SCL mengeluarkan sinyal clock. Pin ini harus diberi resistor Pull Up.

6. SDA

Pin SCL mengeluarkan sinyal data

9.1. Percobaan RTC dengan display LED

#include <mega8535.h>

#include <ds1307.h>

#include <delay.h>

#include <stdio.h>

#include <i2c.h>

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

VCC

Y2

ZTAPD3

VCC

R3010k

R2910k

VCC

U4 DS1307

7

5126

38

SQW/OUT

SDAX1X2SCLK

VBATVCC

PD2

J5

CON2

12

Petunjuk Praktikum AVR-Triwiyanto Page 152

// 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

;

PORTC=detik;

};

}

9.2. Percobaan RTC dengan display 7 Segmen

int data, ubah,menitsat, menitpul, detiksat, detikpul;

#include <mega8535.h>

Petunjuk Praktikum AVR-Triwiyanto Page 153

#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

PORTD.5=0;

PORTD.6=0;

delay_ms(10);

PORTC=menitsat;//mengirimkan data kedigit6

PORTD.5=1;

Petunjuk Praktikum AVR-Triwiyanto Page 154

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 155

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

};

}

Petunjuk Praktikum AVR-Triwiyanto Page 156

APLIKASI AVO METER DIGITAL

#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

Petunjuk Praktikum AVR-Triwiyanto Page 157

ADCSRA|=0x40;

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

Petunjuk Praktikum AVR-Triwiyanto Page 158

DDRC=0xff;

}

void main(void)

{

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;

Petunjuk Praktikum AVR-Triwiyanto Page 159

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;

};

if(data==data2){data=data;};

if(data==data3){data=data*2;};

if(data==data4){data=data*4;};

data=(float)data/1023*5;

lcd_clear();

lcd_putsf("multimtr digital");

lcd_gotoxy(0,1);

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

lcd_puts(lcd_buffer);

delay_ms(50);

Petunjuk Praktikum AVR-Triwiyanto Page 160

};

}

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

Petunjuk Praktikum AVR-Triwiyanto Page 161

RANGKAIAN PROGRAMMER

Membuat Project dengan CodeVisionAVR.

Pada penjelasan berikutnya, sebagai contoh digunakan modul AVR yang mempunyai

hubungan sebagai berikut:

VCC

R268

VCC

+ C14U7

D1 3V6

VCC

R168

R6

10k

D4

LED

J5

CON5

12345

VCC

C5

22p

C3100n

R51k

VCC

JP4

USB

1 2 3 4

VCCY112M

C4 22p

VC

C

IC1

ATmega8-DIL28

123456789

1011121314 15

16171819202122232425262728

PC6 (RESET)PD0 (RxD)PD1 (TxD)PD2 (INT0)PD3 (INT1)PD4 (XCK/T0)VCCGNDPB6 (XT1/TOSC1)PB7 (XT2/TOSC2)PD5 (T1)PD6 (AIN0)PD7 (AIN1)PB0 (ICP) (OC1A) PB1

(SS/OC1B) PB2(OC2/MOSI) PB3

(MISO) PB4(SCK) PB5

AVCCAREFAGND

(ADC0) PC0(ADC1) PC1(ADC2) PC2(ADC3) PC3

(SDA/ADC4) PC4(SCL/ADC5) PC5

VCC

VCC

D2 3V6

R3

2k2

Petunjuk Praktikum AVR-Triwiyanto Page 162

• 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.

Gambar 17. Tampilan Splash Screen

Petunjuk Praktikum AVR-Triwiyanto Page 163

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.

Gambar 19. Membuat file baru

Petunjuk Praktikum AVR-Triwiyanto Page 164

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.

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

Petunjuk Praktikum AVR-Triwiyanto Page 165

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

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

Petunjuk Praktikum AVR-Triwiyanto Page 166

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 167

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

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.

Petunjuk Praktikum AVR-Triwiyanto Page 168

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.

Gambar 26. Membuat folder baru

Petunjuk Praktikum AVR-Triwiyanto Page 169

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 170

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 171

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 172

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 173

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 174

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 175

Gambar 36. Melakukan konfigurasi project

Gambar 37. Memilih opsi “Program the Chip” After Make

Petunjuk Praktikum AVR-Triwiyanto Page 176

Setelah melakukan seting, lakukan make project dengan memilih menu Project � Make,

seperti ditunjukkan oleh Gambar 38. Apabila tidak ada kesalahan maka kotak dialog

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

program kedalam mikrokontroler.

Gambar 38. Melakukan make project

Petunjuk Praktikum AVR-Triwiyanto Page 177

Gambar 39. Kotak dialog informasi hasil make

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

Petunjuk Praktikum AVR-Triwiyanto Page 178

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

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(){

Petunjuk Praktikum AVR-Triwiyanto Page 179

TCCR0=0x00;

#asm ("cli");

}

void atur()

{

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

Petunjuk Praktikum AVR-Triwiyanto Page 180

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;

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

}

Petunjuk Praktikum AVR-Triwiyanto Page 181

}

interrupt [TIM0_OVF] void timer0_overflow(void)

{

TCNT0=0x00;

data=data+1;

}