Top Banner
1 BAB 1 SOFTWARE COMPILER CODEVISION AVR 1.1 PENGENALAN CodeVisionAVR merupakan salah satu software gratis yang berfungsi sebagai text editor dalam menulis baris perintah sekaligus sebagai compiler yang dapat mengubah file sumber menjadi file hexa. Software CodeVisionAVR versi demo dapat di unduh dari http://www.hpinfotech.ro/html/cvavr.htm atau dari CD yang terdapat pada buku ini. CodeVisionAVR menyediakan berbagai fasilitas yang memudahkan pengguna. Salah satunya adalah CodeWizardAVR yang memberikan kemudahan dalam melakukan konfigurasi fungsi-fungsi pin dan fitur yang yang ingin digunakan. Pengguna dapat membuat dan menjalankan program yang ditulis, kemudian mengujinya langkah demi langkah sehingga pengguna dapat mengamati perubahan data pada setiap register dan port I/O. Selain itu juga CodeVisionAVR menyediakan toolbar yang memudahkan pengguna untuk melakukan berbagai interaksi yang diinginkan dan juga memiliki arena kerja yang cukup leluasa. 1.2 INSTALASI Agar pengguna dapat menggunakan software CodeVisionAVR maka para pengguna harus meng-instal-nya terlebih dahulu. Adapun proses instalasi software CodeVisionAVR ini cukup mudah. 1. Klik dua kali master program CodeVisionAVR yang ada di CD buku ini. 2. Ikuti langkah-langkah yang diminta dan lakukan perubahan seperlunya. 3. Setelah selesai, program dapat langsung dijalankan. 1.3 MEMBUAT PROGRAM BARU Membuat program baru menggunakan CodeVisionAVR tidaklah sulit. Adapun langkah-langkah yang harus dilakukan adalah sebagai berikut: 1. Jalankan program CodeVisionAVR. Dengan cara klik dua kali pada Icon CodeVisionAVR seperti pada gambar 1.1. Gambar 1.1 Icon CodeVisionAVR 2. Pada saat jalankan program CodeVisionAVR maka layar kosong tampak seperti pada gambar 1.2. Gambar 1.2 Tampilan CodeVisionAVR
66

97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

Nov 22, 2014

Download

Documents

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

1

BAB 1

SOFTWARE COMPILER CODEVISION AVR

1.1 PENGENALAN

CodeVisionAVR merupakan salah satu software gratis yang berfungsi sebagai text editor dalam menulis baris

perintah sekaligus sebagai compiler yang dapat mengubah file sumber menjadi file hexa. Software CodeVisionAVR versi

demo dapat di unduh dari http://www.hpinfotech.ro/html/cvavr.htm atau dari CD yang terdapat pada buku ini.

CodeVisionAVR menyediakan berbagai fasilitas yang memudahkan pengguna. Salah satunya adalah

CodeWizardAVR yang memberikan kemudahan dalam melakukan konfigurasi fungsi-fungsi pin dan fitur yang yang

ingin digunakan. Pengguna dapat membuat dan menjalankan program yang ditulis, kemudian mengujinya langkah demi

langkah sehingga pengguna dapat mengamati perubahan data pada setiap register dan port I/O.

Selain itu juga CodeVisionAVR menyediakan toolbar yang memudahkan pengguna untuk melakukan berbagai

interaksi yang diinginkan dan juga memiliki arena kerja yang cukup leluasa.

1.2 INSTALASI

Agar pengguna dapat menggunakan software CodeVisionAVR maka para pengguna harus meng-instal-nya terlebih

dahulu. Adapun proses instalasi software CodeVisionAVR ini cukup mudah.

1. Klik dua kali master program CodeVisionAVR yang ada di CD buku ini.

2. Ikuti langkah-langkah yang diminta dan lakukan perubahan seperlunya.

3. Setelah selesai, program dapat langsung dijalankan.

1.3 MEMBUAT PROGRAM BARU

Membuat program baru menggunakan CodeVisionAVR tidaklah sulit. Adapun langkah-langkah yang harus

dilakukan adalah sebagai berikut:

1. Jalankan program CodeVisionAVR. Dengan cara klik dua kali pada Icon CodeVisionAVR seperti pada gambar 1.1.

Gambar 1.1 Icon CodeVisionAVR

2. Pada saat jalankan program CodeVisionAVR maka layar kosong tampak seperti pada gambar 1.2.

Gambar 1.2 Tampilan CodeVisionAVR

Page 2: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

2

3. Klik Menu File dan pilih New, maka tampil jendela pilihan seperti pada gambar 1.3.

Gambar 1.3 Jendela Pilihan Tipe File

4. Untuk membuat program baru pilihlah Project kemudian klik OK, maka muncul pertanyaan yang menanyakan

apakah kita ingin menggunakan CodeWizardAVR seperti pada gambar 1.4 berikut, kemudian pilih Yes.

Gambar 1.4 Jendela Confirm CodeWizardAVR

5. Jendela CodeWizardAVR tampil seperti gambar 1.5. Pada tab Chip, lakukan konfigurasi seperti pada gambar 1.5.

Gambar 1.5 CodeWizardAVR pada tab Chip

Page 3: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

3

6. Selanjutnya pilih tab Ports, lalu lakukan pengaturan seperti pada gambar 1.6.

Gambar 1.6 CodeWizardAVR pada tab Ports

7. Kemudian pilih menu File lalu pilih Generat, Save and Exit. Lalu kita diminta menyimpan tiga jenis file secara

berurut. Dianjurkan simpan ketiga file tersebut dalam sebuah folder yang sama.

8. Setelah selesai, maka program CodeVisionAVR akan tampak seperti gambar 1.7, yang menunjukan bahwa sudah

terdapat program yang telah dikonfigurasi dan siap digunakan atau disisipkan program tambahan.

Gambar 1.7 Program CodeVisionAVR yang terkonfigurasi

Page 4: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

4

9. Kemudian sisipkan program utama seperti yang tampak pada gambar 1.8 berikut.

Gambar 1.8 Menyisipkan program utama

10. Setelah selesai kita dapat melakukan kompilasi pada program dengan cara pilih menu Project lalu pilih Build All

atau Ctrl+F9.

11. Jika program sudah benar atau tidak terdapat kesalahan, maka akan tampil jendela informasi seperti gambar 1.9

berikut ini.

Gambar 1.10 Jendela Informasi

12. Kemudian klik OK, dan program siap di download ke rangkaian.

Langlah-langkah diatas adalah proses untuk menghasilkan file dengan bahasa mesin yaitu file dengan ekstensi hexa

(*.hex). File ini dibutuhkan untuk diisi (download) ke IC mikrokontroler, karena mikrokontroler hanya mengerti bahasa

mesin. Tahap-tahap ini akan terus dilakukan setiap membuat program baru.

Page 5: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

5

BAB 2

SOFTWARE PROTEUS 7 PROFESSIONAL

2.1 PENGENALAN

Pada umumnya setiap pegguna yang baru mulai belajar mengalami kesulitan untuk mempelajari mikrokontroler

apabila tidak ada pendukung secara langsung seperti pengajar dan peralatan yang memadai. Untuk itu dibutuhkan suatu

sarana yang dapat digunakan untuk mencoba suatu rangkaian mikrokontroler. Salah satunya adalah software Proteus 7

Professional.

Software Proteus 7 Professional ini tidak free, maka pada CD saya hanya bisa memberikan Proteus 7 Professional

versi demo. Penggunaannya tidak jauh berbeda dengan Proteus 7 Professional. Proteus 7 Professional memiliki program

yang dapat berfungsi untuk mensimulasikan rangkaian mikrokontroler seolah-olah pengguna berhadapan dengan

rangkaian yang sesungguhnya. Software Proteus terdiri dari dua program utama yaitu ARES dan ISIS. Dimana masing-

masing program memiliki fungsi yang berbeda. ARES biasa digunakan untuk membuat layout PCB (Printed Circuit

Board), sedangkan ISIS biasa digunakan untuk menggambar schematic rangkaian serta mensimulasikan program.

Pada buku ini hanya menggunakan program ISIS yang digunakan untuk mensimulasikan rangkaian mikrokontroler.

Sedangkan untuk membuat layoutnya silahkan anda pilih sesuai selera mau menggunakan software mana.

2.2 INSTALASI

Untuk instalasi program, tidak jauh berbeda dengan cara menginstal program lain pada umumnya. Yang diinstal

disini adalah software Proteus-nya, namun pada penggunaannya kita hanya akan menggunakan program ISIS-nya saja

yang dapat digunakan sebagai simulator, agar rangkaian mikrokontrolernya tampak seperti rangkaian sesungguhnya.

Adapun proses instalasi nya adalah sebagai berikut :

1. Klik dua kali master program Proteus 7 Professional versi Demo yang ada di CD buku ini atau download dari

http://www.labcenter.co.uk/download/prodemo_download.cfm

2. Ikuti langkah-langkah yang diminta dan lakukan perubahan seperlunya jika dibutuhkan.

3. Setelah selesai, program dapat langsung dijalankan.

2.3 TAMPILAN PROGRAM

Pada software Proteus, kita menggunakan program ISIS yang berfungsi sebagai simulator. Pada program ISIS

banyak sekali fasilitas yang disajikan dan akan memakan banyak waktu jika harus menjelaskan semuanya. Oleh karena

itu saya hanya akan menjelas beberapa saja yang diperlukan. Secara umum tampilan program ISIS pada Software Proteus

7 Professional adalah sebagai berikut :

Gambar 2.1 Tampilan Program ISIS

Keterangan :

1. Editing Window.

2. Overview Window.

3. Object Selector.

1 2

3

Page 6: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

6

2.4 MEMBUAT SIMULASI PROGRAM

Dalam membuat simulasi program tidaklah sulit. Namun ada beberapa tahap yang harus dilalui. Secara garis besar

ada 3 tahap, yaitu :

Pemilihan komponen yang akan digunakan.

Peletakan komponen dan penyusunan rangkaian.

Download program pada rangkaian.

Namun sebelum pengguna membuat schematic rangkaian, pengguna harus paham prinsip kerja dari rangkaian yang

ingin dibuat, sehingga pengguna dapat memeriksa kesalahan sedini mungkin pada rangkaian jika terdapat error atau

ketidaksesuaian prinsip kerja pada rangkaian. Untuk mensimulasikan rangkaian mikrokontroler menggunakan program

ISIS ini, pengguna tidak perlu membuat schematic secara ”lengkap”, tapi cukup membuat rangkaian input/output-nya

saja seperti pada gambar-gambar schematic yang nanti akan anda temukan pada contoh-contoh rangkaian.

Pada rangkaian sebenarnya kita menggunakan IC mikrokontroler ATMega8535, tetapi pada simulator tidak terdapat

IC ATMega8535, maka kita menggunakan IC mikrokontroler yang sekelas dengan ATMega8535 yaitu AT90S8535 dan

untuk seterusnya kita akan menggunakan IC tersebut dalam membuat simulasi-simulasi rangkaian pada buku ini.

Berikut ini adalah langkah-langkah membuat simulasi program menggunakan program ISIS :

1. Siapkan gambar rangkaian yang ingin disimulasikan. Contohnya seperti gambar 2.2 berikut.

Gambar 2.2 Rangkaian ATMega8535

2. Jalankan program ISIS dan buka lembar baru. Tampak seperti gambar 2.3 berikut.

Gambar 2.3 Tampilan Jendela baru

Component Mode

Terminal Mode

Page 7: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

7

3. Pilih komponen yang akan digunakan, klik Component Mode kemudian tekan tombol Pick Devices. Seperti gambar

2.4 berikut. Dan cari komponen IC Mikrokontroler AT90S8535 dan komponen LED.

Gambar 2.4 Tombol Pick Devices

4. Pilih kategori, dan ambil komponen yang dibutuhkan dengan cara klik dua kali nama komponen yang dipilih seperti

gambar 2.5 berikut.

Gambar 2.5 Jendela Pick Devices

5. Setelah semua komponen terkumpul di bagian Object Selector, klik OK.

6. Pilih toolbar Terminal Mode, ambil komponen Power dan letakkan pada rangkaian, atur posisi komponen pada

Editing Window. Seperti gambar 2.6 berikut.

Gambar 2.6 Posisi komponen

Page 8: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

8

7. Hubungkan jalur pada masing-masing komponen sesuai gambar rangkaian sehingga tampak seperti gambar 2.7.

Gambar 2.7 Hubungan Jalur Komponen

8. Gambar rangkaian tidak perlu lengkap seperti aslinya. Yang penting input dan output rangkaian terhubung dengan

komponen yang diinginkan seperti contoh gambar 2.7. Setelah selesai, rangkaian siap disimulasikan dan lihatlah

tampilan yang dihasilkan pada gambar simulasi.

Gambar 2.8 Jendela Edit Component

9. Klik dua kali IC mikrokontroler pada rangkaian, akan muncul jendela Edit Component. Pada bagian Program File,

klik lambang folder, maka akan muncul jendela Select File Name, pilih program LED.HEX yang telah dibuat dan

berhasil di compile sebelumnya. Klik Open, lalu Klik OK.

10. Jalankan simulasi rangkaian dengan cara menekan tombol Play pada bagian sudut kiri bawah.

11. Jika LED pada rangkaian berkedap-kedip, maka berarti rangkaian anda telah berhasil disimulasikan.

Page 9: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

9

BAB 3

APLIKASI LAMPU LED

LED (Light Emitting Diode) adalah komponen semikonduktor yang dapat mengemisikan cahaya ketika dialiri arus

listrik. Penggunaan LED sudah sangat populer sehingga banyak digunakan diindustri perangkat elektronika. LED

mempunyai banyak kelebihan yaitu penggunaan arus yang kecil dan dapat menghasilkan cahaya yang bermacam-macam,

sehingga LED banyak digunakan sebagai indikator dan lampu display.

Gambar 3.1 Contoh bentuk dan warna LED

3.1 ANIMASI LED.

Aplikasi lampu LED (Light Emitting Diode) adalah aplikasi yang paling sederhana dan yang paling dasar dalam

mempelajari dasar pengontrolan menggunakan mikrokontroler. Maka dianggap penting sekali memahami prinsip kerja

dari LED ini.

LED terdiri dari 2 kaki yaitu anoda dan katoda, dimana LED akan menyala jika arus mengalir dari anoda ke katoda.

Pada apliksi lampu LED kali ini, kita akan menghubungkan LED ke mikrokontroler melalui Port A. Seperti pada gambar

3.3.

Gambar 3.2 Simbol LED (Light Emitting Diode)

Rangkaian Simulasi Animasi LED.

Gambar 3.3 Rangkaian Lampu Flip-flop

Kedelapan LED kita hubungkan ke PortA dengan menghubungkan semua pin Anoda dari LED ke sumber positif

dari tegangan atau biasa disebut Common Anoda (CA). Maka untuk menyalakan LED, data pada PortA harus diberi data

‟0‟.

Page 10: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

10

Tugas Program Aplikasi LED.

Buatlah program baru dengan CodeWizardAVR seperti konfigurasi berikut, kemudian edit program seperti pada gambar.

Program 1. Aplikasi Lampu LED

Page 11: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

11

Program 2. Animasi Lampu LED Flip-Flop

Program 3. Animasi LED Bergeser

Page 12: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

12

BAB 4

APLIKASI 7 SEGMENT NON-MULTIPLEX

Aplikasi 7 segment sering kita temukan pada keseharian kita terutama pada peralatan elektronik. Biasanya digunakan

untuk menampilkan channel atau track pada televisi atau VCD, pada aplikasi lampu lalu lintas di perempatan jalan dan

pada sistem antriandi Bank atau tempat pelayanan umum lainnya. Pada bab ini akan membahas aplikasi menggunakan 7

segment secara sederhana.

Aplikasi 7 segment Non-Multiplex disini dimaksudkan cara penggunaan 7 segment secara sendiri-sendiri atau

independent. Sebuah 7 segment memiliki 8 buah pin yang masing-masing dihubungkan dengan 1 buah port pada

mikrokontroler. Masing-masing port akan mengontrol 1 buah 7 segment yang digunakan untuk menampilkan 1 digit

angka seperti pada gambar 4.1.

Rangkaian Simulasi 7 Segment Non-Multiplex tanpa decoder

Gambar 4.1 Rangkaian 7 Segment Non-Multiplex

Tugas Program Aplikasi LED.

Buatlah program baru dengan CodeWizardAVR seperti konfigurasi berikut, kemudian edit program seperti pada gambar.

Program 1. Aplikasi 7 Segment 1 digit

Page 13: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

13

Program 2. Aplikasi 7 Segment 2 digit

#include <mega8535.h>

#include <delay.h>

void satuan()

{

PORTC=0x40;

delay_ms(500);

PORTC=0x79;

delay_ms(500);

PORTC=0x24;

delay_ms(500);

PORTC=0x30;

delay_ms(500);

PORTC=0x19;

delay_ms(500);

PORTC=0x12;

delay_ms(500);

PORTC=0x02;

delay_ms(500);

PORTC=0x78;

delay_ms(500);

PORTC=0x00;

delay_ms(500);

PORTC=0x10;

delay_ms(500);

}

void main(void)

{

PORTA=0x00;

DDRA=0xFF;

PORTC=0x00;

DDRC=0xFF;

while (1)

{

PORTA=0x40;

satuan();

PORTA=0x79;

satuan();

PORTA=0x24;

satuan();

PORTA=0x30;

satuan();

PORTA=0x19;

satuan();

PORTA=0x12;

satuan();

PORTA=0x02;

satuan();

PORTA=0x78;

satuan();

PORTA=0x00;

satuan();

PORTA=0x10;

satuan();

};

}

Rangkaian Simulasi 7 Segment Non-Multiplex tanpa decoder

Page 14: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

14

Decoder adalah suatu driver yang digunakan mengubah data. Untuk menampilkan angka pada 7 segment display

terkadang kita membutuhkan decoder BCD (Binary Coded Decimal) untuk membantu kita dalam memproses data.

Decoder ini biasanya digunakan untuk mengubah data desimal menjadi data biner. Decoder untuk jenis Common Anode

diperlukan keluaran aktip rendah (misalnya SN-7447) sedangkan untuk jenis Common Cathode diperlukan keluaran aktip

tinggi (misalnya SN-7448).

Teknik pemberian datanya agak berbeda dengan sebelumnya. Yakni dengan cara membagi dua bagian sebuah port

lalu mengontrol masing-masing bagian tanpa harus mengganggu data yang lain. Misalkan data terakhir pada 7 segment

adalah 34, berarti data PORTA =0x43. Kemudian mau diubah menjadi 35, berarti angka satuan menjadi angka 5 (4 5),

berarti kita hanya mengubah data pada LSB, sedangkan data MSB tetap. Caranya adalah sebagai berikut,

Data heksa Biner

LSB MSB

Tahap 1 PORTA =0x43; 0B 0100 | 0011 data sekarang / terakhir

Tahap 2 Kosongkan MSB 0000 | 0011 di AND -kan dengan data (0000 | 0011)

Dengan perintah PORTA&=0x03;

Tahap 3 Set MSB menjadi 0101 | 0011 di OR –kan dengan data (0101 | 0000)

Dengan perintah PORTA|=0x50;

Tugas Program Aplikasi LED.

Buatlah program baru dengan CodeWizardAVR seperti konfigurasi berikut, kemudian edit program seperti pada gambar.

Program 1. Aplikasi 7 Segment 1 digit

Puluhan

Satuan

Page 15: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

15

#include <mega8535.h>

#include <delay.h>

void main(void)

{

PORTA=0x00;

DDRA=0xFF;

while (1)

{

PORTA=0x0;

delay_ms(500);

PORTA=0x1;

delay_ms(500);

PORTA=0x2;

delay_ms(500);

PORTA=0x3;

delay_ms(500);

PORTA=0x4;

delay_ms(500);

PORTA=0x5;

delay_ms(500);

PORTA=0x6;

delay_ms(500);

PORTA=0x7;

delay_ms(500);

PORTA=0x8;

delay_ms(500);

PORTA=0x9;

delay_ms(500);

};

}

Program 2. Aplikasi 7 Segment 2 digit

#include <mega8535.h>

#include <delay.h>

void satuan()

{

PORTA&=0x0F;

PORTA |=0x00;

delay_ms(500);

PORTA&=0x0F;

PORTA |=0x10;

delay_ms(500);

PORTA&=0x0F;

PORTA |=0x20;

delay_ms(500);

PORTA&=0x0F;

PORTA |=0x30;

delay_ms(500);

PORTA&=0x0F;

PORTA |=0x40;

delay_ms(500);

PORTA&=0x0F;

PORTA |=0x50;

delay_ms(500);

PORTA&=0x0F;

PORTA |=0x60;

delay_ms(500);

PORTA&=0x0F;

PORTA |=0x70;

delay_ms(500);

PORTA&=0x0F;

PORTA |=0x80;

delay_ms(500);

PORTA&=0x0F;

PORTA |=0x90;

delay_ms(500);

}

void main(void)

{

PORTA=0x00;

DDRA=0xFF;

PORTC=0x00;

DDRC=0xFF;

while (1)

{

PORTA&=0xF0;

PORTA|=0x00;

satuan();

PORTA&=0xF0;

PORTA|=0x01;

satuan();

PORTA&=0xF0;

PORTA|=0x02;

satuan();

PORTA&=0xF0;

PORTA|=0x03;

satuan();

PORTA&=0xF0;

PORTA|=0x04;

satuan();

PORTA&=0xF0;

PORTA|=0x05;

satuan();

PORTA&=0xF0;

PORTA|=0x06;

satuan();

PORTA&=0xF0;

PORTA|=0x07;

satuan();

PORTA&=0xF0;

PORTA|=0x08;

satuan();

PORTA&=0xF0;

PORTA|=0x09;

satuan();

};

}

Page 16: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

16

BAB 5

APLIKASI 7 SEGMENT MULTIPLEX

5.1 Rangkaian Simulasi 7 Segment Multiplex Aplikasi 7 segment Multiplex merupakan penggunaan 7 segment secara paralel. 7 segment yang berjumlah 2 atau

lebih disusun sedemikian rupa sehingga masing-masing pin yang sama pada 7 segment terubung secara paralel terhadap

pin pada port mikrokontroler. Sehingga pada mikrokontroler hanya akan menggunakan 2 buah port apabila 7 segment

yang digunakan berjumlah maksimum 8 buah. Port pada mikrokontroler yang dihubungkan dengan pin pada 7 segment

digunakan untuk menetukan data yang akan ditampilkan. Sedangkan port yang terhubung pada common masing-masing

7 segment digunakan untuk mengontrol 7 segment mana yang akan aktif/menyala.

Rangkaian Simulasi 7 Segment Multiplex

Gambar 5.1 Rangkaian 7 Segment Multiplex

Tugas Program Aplikasi LED.

Buatlah program baru dengan CodeWizardAVR seperti konfigurasi berikut, kemudian edit program seperti pada gambar.

Gambar 5.2 Konfigurasi 7 Segment Multiplex

Program 1. Aplikasi 7 Segment 8 digit

#include <mega8535.h>

#include <delay.h>

void main(void)

{

PORTA=0xFF;

DDRA=0xFF;

PORTC=0x00;

DDRC=0xFF;

while (1)

{

PORTC=0x40;

delay_ms(500);

PORTC=0x79;

delay_ms(500);

PORTC=0x24;

delay_ms(500);

PORTC=0x30;

delay_ms(500);

PORTC=0x19;

delay_ms(500);

PORTC=0x12;

delay_ms(500);

PORTC=0x02;

delay_ms(500);

PORTC=0x78;

delay_ms(500);

PORTC=0x00;

delay_ms(500);

PORTC=0x10;

delay_ms(500);

};

}

Page 17: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

17

5.2 Aplikasi 7 Segment LCD dengan Decoder 7447

Aplikasi 7 segment menggunakan LCD display tidak berbeda dengan menggunakan 7 segment biasa, perbedaan

hanya terdapat pada bentuk dan ukuran saja.

Namun pada penjelasan kali ini hanya menambahkan komponen IC TTL sebagai decoder agar pemberian data

menjadi lebih mudah. 7 segment LCD Display ini sudah terdiri dari 8 buah 7 segment yang tersusun secara multiplex.

Sehingga kita cukup menggunakan 2 buah port yang akan dihubungkan dengan pin common pada LCD dan Pin Input

pada IC TTL. Untuk jelasnya bisa dilihat pada gambar 5.3.

Rangkaian Simulasi 7 Segment LCD dengan Decoder 7447

Gambar 5.3 Rangkaian 7 Segment LCD Multiplex dengan Decoder

Program 2. Aplikasi 7 Segment 8 digit dengan decoder

#include <mega8535.h>

#include <delay.h>

void main(void)

{

PORTA=0x00;

DDRA=0xFF;

PORTC=0x00;

DDRC=0xFF;

while (1)

{

PORTC=0x0;

delay_ms(500);

PORTC=0x1;

delay_ms(500);

PORTC=0x2;

delay_ms(500);

PORTC=0x3;

delay_ms(500);

PORTC=0x4;

delay_ms(500);

PORTC=0x5;

delay_ms(500);

PORTC=0x6;

delay_ms(500);

PORTC=0x7;

delay_ms(500);

PORTC=0x8;

delay_ms(500);

PORTC=0x9;

delay_ms(500);

};

}

Program 3. Aplikasi 7 Segment 8 digit dengan decoder

#include <mega8535.h>

#include <delay.h>

void main(void)

{

PORTA=0xFF;

DDRA=0xFF;

PORTC=0x00;

DDRC=0xFF;

while (1)

{

PORTA=0B00000001;

PORTC=0x0;

delay_ms(500);

PORTA=0B00000010;

PORTC=0x1;

delay_ms(500);

PORTA=0B00000100;

PORTC=0x2;

delay_ms(500);

PORTA=0B00001000;

PORTC=0x3;

delay_ms(500);

PORTA=0B00010000;

PORTC=0x4;

delay_ms(500);

PORTA=0B00100000;

PORTC=0x5;

delay_ms(500);

PORTA=0B01000000;

PORTC=0x6;

delay_ms(500);

PORTA=0B10000000;

PORTC=0x7;

delay_ms(500);

};

}

Page 18: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

18

BAB 6

APLIKASI LED DOT MATRIX

LED Dot Matrix merupakan salah satu aplikasi dari LED yang disusun secara Matrix dan dapat berfungsi untuk

menampilkan berbagai macam karakter. Terdapat berbagai macam tampilan yang dapat dihasilkan melalui LED Dot

Matrix.

Pada LED Dot Matrix 5x7 terdapat 5 pin kolom dan 7 pin baris yang digunakan untuk menentukan kondisi masing-

masing LED. Jika salah satu bagian menjadi input maka bagian yang lain harus sebagai output atau sebaliknya.

Maksudnya salah satu bagian akan menjadi tempat masuknya arus dan bagian yang lain akan menjadi tempat keluarnya

arus tergantung pada kondisi posisi Anoda/katoda LED yang terpasang didalamnya. Jika Anoda dari LED terpasang pada

bagian kolom maka semua pin pada bagian kolom merupakn tempat masuknya arus dan bagian baris merupakan tempat

keluarnya arus.

Apabila bagian kolom diberi arus atau diberi data 1 (high) maka kolom tersebut aktif atau LED pada kolom tersebut

siap menyala. LED yang menyala akan tergantung pada bagian baris yang diberi data 0 (low).

Rangkaian Simulasi

Gambar 4.4 Ranglaian LED Dot Matrix 5x7

Contoh Program.

Program 1. Menampilkan 1 Karakter pada LED Dot Matrix 5x7

#include <mega8535.h>

#include <delay.h>

void main(void)

{

PORTA=0x00;

DDRA=0xFF;

PORTC=0x00;

DDRC=0xFF;

while (1)

{

PORTA=0x01;

PORTC=0B00000011;

delay_ms(1);

PORTA=0x02;

PORTC=0B01110101;

delay_ms(1);

PORTA=0x04;

PORTC=0B01110110;

delay_ms(1);

PORTA=0x08;

PORTC=0B01110101;

delay_ms(1);

PORTA=0x10;

PORTC=0B00000011;

delay_ms(1);

};

}

Page 19: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

19

BAB 7

APLIKASI LCD DISPLAY 16X2

LCD Display 16x2 merupakan salah satu komponen display yang paling populer digunakan untuk berbagai aplikasi.

LCD Display memberikan kenyamanan dalam interface, selain lebih menarik LCD Display juga dapat menampilkan

berbagai macam karakter yang tidak dapat ditampilkan menggunakan 7 segment.

Lakukan konfigurasi CodeWizardAVR seperti gambar berikut.

Gambar 7.1 Konfigurasi LCD Display 16x2

Rangkaian Simulasi LCD Display 16x2

Gambar 7.3 Rangkaian Aplikasi LCD Display 16x2

Page 20: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

20

Contoh Program

Program 1. Penampil Karakter dengan LCD

#include <mega8535.h>

#include <stdio.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

// Declare your global variables here

unsigned int temp=15;

char buf[33];

void main(void)

{

// LCD module initialization

lcd_init(16);

while (1)

{

// Place your code here

lcd_gotoxy(0,0);

lcd_putsf("Sensor");

lcd_gotoxy(0,1);

sprintf(buf, "Data = %d",temp);

lcd_puts(buf);

};

}

Program 2. Penampil Data Variable yang berubah

#include <mega8535.h>

#include <stdio.h>

#include <delay.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

// Declare your global variables here

unsigned int temp=0;

char buf[33];

void main(void)

{

// LCD module initialization

lcd_init(16);

while (1)

{

// Place your code here

lcd_gotoxy(0,0);

sprintf(buf, "%d",temp);

lcd_puts(buf);

delay_ms(1000);

++temp;

};

}

Page 21: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

21

BAB 8

APLIKASI TOMBOL PUSH BUTTON

Tombol salah satu komponen yang paling sering digunakan pada aplikasi elektronik. Tombol biasa digunakan

sebagai pemilih, pengatur dan juga sebagai sensor yang kemudian diproses untuk mengerjakan sesuatu. Umumnya jenis

tombol ada 2 macam, yaitu tombol Push Button (Tombol Tekan) dan Tombol Toggle (On/Off). Terdapat berbagai

macam bentuk dan ukuran tombol dari yang kecil sampai yang besar, sehingga pengguna harus memilih tombol yang

sesuai tergantung kebutuhan. Contoh bentuk-bentuk tombol bias dilihat pada gambar 6.1 berikut.

Gambar 8.1 Macam-Macam Tombol

PUSH BUTTON

Tombol Push Button sering kita lihat dalam kehidupan sehari-hari pada peralatan elektronik, seperti radio, televisi,

keyboard dan kalkulator lain-lain. Biasanya tombol push button ini digunakan untuk memilih atau menetukan suatu

proses, misalnya memilih channel televisi atau mengetik komputer.

Gambar 8.2 Konfigurasi Tombol, 7 Segment dan LCD

Page 22: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

22

Rangkaian Aplikasi Tombol Push Button dan LED

Gambar 8.3 Aplikasi Tombol Push Button dan LED

Program Baca Masukan Tombol Push Button ke LED

#include <mega8535.h>

void main(void)

{

PORTA=0x00;

DDRA=0xFF;

PORTB=0xFF;

DDRB=0x00;

while (1)

{

// Place your code here

PORTA=PINB;

};

}

Rangkaian Aplikasi Tombol Push Button dan 7 Segment

Gambar 8.4 Aplikasi Tombol Push Button dan Seven Segment

Page 23: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

23

Program Baca Masukan Tombol Push Button ke 7 Segment

#include <mega8535.h>

void main(void)

{

PORTA=0x00;

DDRA=0xFF;

PORTB=0xFF;

DDRB=0x00;

while (1)

{

// Place your code here

if(PINB.0==0) PORTA=0x79;

if(PINB.1==0) PORTA=0x24;

if(PINB.2==0) PORTA=0x30;

if(PINB.3==0) PORTA=0x19;

if(PINB.4==0) PORTA=0x12;

if(PINB.5==0) PORTA=0x02;

if(PINB.6==0) PORTA=0x78;

if(PINB.7==0) PORTA=0x00;

if(PINB==255) PORTA=0x40;

};

}

Rangkaian Aplikasi Tombol Push Button dan LCD

Gambar 8.5 Aplikasi Tombol Push Button dan LCD

Program Baca Masukan Tombol Push Button ke LCD

#include <mega8535.h>

#include <stdio.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

// Declare your global variables here

unsigned int temp=15;

char buf[33];

void main(void)

{

Page 24: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

24

PORTB=0xFF;

DDRB=0x00;

// LCD module initialization

lcd_init(16);

while (1)

{

// Place your code here

if(PINB.0==0) temp=1;

if(PINB.1==0) temp=2;

if(PINB.2==0) temp=3;

if(PINB.3==0) temp=4;

if(PINB.4==0) temp=5;

if(PINB.5==0) temp=6;

if(PINB.6==0) temp=7;

if(PINB.7==0) temp=8;

if(PINB==255) temp=0;

lcd_gotoxy(0,0);

sprintf(buf, "Data = %d",temp);

lcd_puts(buf);

};

}

Page 25: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

25

BAB 9

TOMBOL MATRIX

Tombol matrix merupakan tombol push button yang disusun secara matrix sehingga tombol tampak menjadi susunan

tombol yang teratur. Kita ambil salah satu contoh tombol matrix 4x4. ini berarti tombol tersebut memiliki 4 baris dan 4

kolom. Sebuah tombol yang ditekan akan terhubung ke salah satu baris dan salah satu kolom yang nantinya akan

menghubungkan baris dan kolom tersebut sesuai letak tombol tersebut. Seperti yang ditunjukan oleh gambar 9.1.

Gambar 9.1 Rangkaian Tombol Matrix 4x4

Rangkaian Simulasi Tombol Matrix To LCD

Gambar 9.2 Rangkaian Tombol Matrix To LCD Display

Page 26: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

26

Gambar 9.3 Konfigurasi Keypad dan LCD

Contoh Program

Program Baca Masukan Tombol Matrix 4x4

#include <mega8535.h>

#include <stdio.h>

#include <delay.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

// Declare your global variables here

int key;

char buff[33];

unsigned char keypad( )

{

//Kolom 1==================

PORTD = 0b11110111;

if(PIND.7==0) {key=10; goto run;}

if(PIND.6==0) {key=15; goto run;}

if(PIND.5==0) {key=0; goto run;}

if(PIND.4==0) {key=14; goto run;}

//Kolom 2=================

PORTD = 0b11111011;

if(PIND.7==0) {key=13; goto run;}

if(PIND.6==0) {key=9; goto run;}

if(PIND.5==0) {key=8; goto run;}

if(PIND.4==0) {key=7; goto run;}

//Kolom 3=================

PORTD = 0b11111101;

if(PIND.7==0) {key=12; goto run;}

if(PIND.6==0) {key=6; goto run;}

if(PIND.5==0) {key=5; goto run;}

if(PIND.4==0) {key=4; goto run;}

//Kolom 4=================

Page 27: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

27

PORTD = 0b11111110;

if(PIND.7==0) {key=11; goto run;}

if(PIND.6==0) {key=3; goto run;}

if(PIND.5==0) {key=2; goto run;}

if(PIND.4==0) {key=1; goto run;}

run:

return key;

}

void main(void)

{

PORTD=0xF0;

DDRD=0x0F;

// LCD module initialization

lcd_init(16);

while (1)

{

// Place your code here

awal:

lcd_gotoxy(0,0);

lcd_putsf("Tekan Sembarang ");

set:

key=keypad();

lcd_gotoxy(0,1);

sprintf(buff,"%d ",key);

lcd_puts(buff);

delay_ms(5);

//key=keypad();

};

}

Rangkaian Simulasi Kalkulator

Gambar 9.4 Rangkaian Simulasi Kalkulator

Page 28: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

28

Gambar 9.5 Konfigurasi Keypad dan LCD

Contoh Program

Program Aplikasi Kalkulator

#include <mega8535.h>

#include <stdio.h>

#include <delay.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

// Declare your global variables here

int key=20,step,op,a1,b1,c;

char buff[33];

unsigned char keypad( )

{

//Kolom 1==================

PORTB = 0b11110111;

if(PINB.7==0) {key=10; goto run;} //tambah

if(PINB.6==0) {key=15; goto run;} //sama dengan = Enter

if(PINB.5==0) {key=0; goto run;}

if(PINB.4==0) {key=14; goto run;} //ON = Cancel

//Kolom 2=================

PORTB = 0b11111011;

if(PINB.7==0) {key=13; goto run;} //kurang

if(PINB.6==0) {key=9; goto run;}

if(PINB.5==0) {key=8; goto run;}

if(PINB.4==0) {key=7; goto run;}

//Kolom 3=================

PORTB = 0b11111101;

if(PINB.7==0) {key=12; goto run;} //kali

if(PINB.6==0) {key=6; goto run;}

if(PINB.5==0) {key=5; goto run;}

if(PINB.4==0) {key=4; goto run;}

Page 29: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

29

//Kolom 4=================

PORTB = 0b11111110;

if(PINB.7==0) {key=11; goto run;} //bagi

if(PINB.6==0) {key=3; goto run;}

if(PINB.5==0) {key=2; goto run;}

if(PINB.4==0) {key=1; goto run;}

run:

return key;

}

void main(void)

{

PORTB=0xF0;

DDRB=0x0F;

// LCD module initialization

lcd_init(16);

while (1)

{

if(step == 0)

{

key=keypad();

if(key < 10)

{

a1=key;

lcd_gotoxy(0,0);

sprintf(buff,"%d ",a1);

lcd_puts(buff);

step = 1;

}

else step=0;

}

if(step == 1)

{

key=keypad();

if(key == 10)

{

op=1; //Tambah

sprintf(buff,"+ ");

lcd_puts(buff);

step = 2;

}

if(key == 13)

{

op=2; //Kurang

sprintf(buff,"- ");

lcd_puts(buff);

step = 2;

}

if(key == 12)

{

op=3; //Kali

sprintf(buff,"* ");

lcd_puts(buff);

step = 2;

}

if(key == 11)

{

op=4; //Bagi

sprintf(buff,"/ ");

lcd_puts(buff);

Page 30: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

30

step = 2;

}

}

if(step == 2)

{

key=keypad();

if(key < 10)

{

b1=key;

sprintf(buff,"%d ",b1);

lcd_puts(buff);

step = 3;

}

else step=2;

}

if(step == 3)

{

if(op == 1)

{

c=a1+b1;

sprintf(buff,"= %d ",c);

lcd_puts(buff);

step = 4;

}

if(op == 2)

{

c=a1-b1;

sprintf(buff,"= %d ",c);

lcd_puts(buff);

step = 4;

}

if(op == 3)

{

c=a1*b1;

sprintf(buff,"= %d ",c);

lcd_puts(buff);

step = 4;

}

if(op == 4)

{

c=a1/b1;

sprintf(buff,"= %d ",c);

lcd_puts(buff);

step = 4;

}

step = 4;

}

if(step == 4)

{

key=keypad();

if(key == 14)

{

lcd_clear();

step = 0;

}

else step=4;

}

};

}

Page 31: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

31

BAB 10

APLIKASI DATA ANALOG PADA LCD DISPLAY

Aplikasi data analog sering digunakan pada sensor-sensor yang keluarannya seperti sensor suhu, kelembaban, asap

dan sensor lainnya. Pada rangkaian simulasi kita hanya menggunakan resistor variabel sebagai pengatur output analog

yang nantinya diproses oleh mikrokontroler dan kemudian ditampilkan melalui LCD Display.

Rangkaian Simulasi Analog pada LCD Display

Gambar 10.1 Aplikasi ADC to LCD Display

Gambar 10.2 Konfigurasi ADC dan LCD

Page 32: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

32

Contoh Program

Program Pembaca Data Analog 8 Channel

#include <mega8535.h>

#include <stdio.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

#include <delay.h>

#define ADC_VREF_TYPE 0x60

// Read the 8 most significant bits

// of the AD conversion result

unsigned char 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 ADCH;

}

// Declare your global variables here

unsigned char temp[30];

void main(void)

{

// Declare your local variables here

// ADC initialization

// ADC Clock frequency: 1000.000 kHz

// ADC Voltage Reference: AVCC pin

// ADC High Speed Mode: Off

// ADC Auto Trigger Source: None

// Only the 8 most significant bits of

// the AD conversion result are used

ADMUX=ADC_VREF_TYPE & 0xff;

ADCSRA=0x83;

SFIOR&=0xEF;

// LCD module initialization

lcd_init(16);

while (1)

{

// Place your code here

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC0 = %d ",read_adc(0));

lcd_puts(temp);

delay_ms(1000);

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC1 = %d ",read_adc(1));

Page 33: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

33

lcd_puts(temp);

delay_ms(1000);

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC2 = %d ",read_adc(2));

lcd_puts(temp);

delay_ms(1000);

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC3 = %d ",read_adc(3));

lcd_puts(temp);

delay_ms(1000);

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC4 = %d ",read_adc(4));

lcd_puts(temp);

delay_ms(1000);

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC5 = %d ",read_adc(5));

lcd_puts(temp);

delay_ms(1000);

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC6 = %d ",read_adc(6));

lcd_puts(temp);

delay_ms(1000);

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC7 = %d ",read_adc(7));

lcd_puts(temp);

delay_ms(1000);

};

}

Program Pemilih Channel Data Analog

#include <mega8535.h>

#include <stdio.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

#include <delay.h>

#define ADC_VREF_TYPE 0x60

// Read the 8 most significant bits

// of the AD conversion result

unsigned char 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 ADCH;

}

Page 34: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

34

// Declare your global variables here

unsigned char temp[30];

int x;

void main(void)

{

// Declare your local variables here

// Port B initialization

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

// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P

PORTB=0xFF;

DDRB=0x00;

// ADC initialization

// ADC Clock frequency: 1000.000 kHz

// ADC Voltage Reference: AVCC pin

// ADC High Speed Mode: Off

// ADC Auto Trigger Source: None

// Only the 8 most significant bits of

// the AD conversion result are used

ADMUX=ADC_VREF_TYPE & 0xff;

ADCSRA=0x83;

SFIOR&=0xEF;

// LCD module initialization

lcd_init(16);

while (1)

{

// Place your code here

if(x==0)

{

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC0 = %d ",read_adc(0));

lcd_puts(temp);

}

if(x==1)

{

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC1 = %d ",read_adc(1));

lcd_puts(temp);

}

if(x==2)

{

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC2 = %d ",read_adc(2));

lcd_puts(temp);

}

if(x==3)

{

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC3 = %d ",read_adc(3));

lcd_puts(temp);

}

if(x==4)

Page 35: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

35

{

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC4 = %d ",read_adc(4));

lcd_puts(temp);

}

if(x==5)

{

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC5 = %d ",read_adc(5));

lcd_puts(temp);

}

if(x==6)

{

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC6 = %d ",read_adc(6));

lcd_puts(temp);

}

if(x==7)

{

lcd_gotoxy(0,0);

sprintf(temp,"Data ADC7 = %d ",read_adc(7));

lcd_puts(temp);

}

if(PINB.0==0) x=0;

if(PINB.1==0) x=1;

if(PINB.2==0) x=2;

if(PINB.3==0) x=3;

if(PINB.4==0) x=4;

if(PINB.5==0) x=5;

if(PINB.6==0) x=6;

if(PINB.7==0) x=7;

};

}

Page 36: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

36

BAB 11

APLIKASI PULSE WIDTH MODULATION (PWM)

PWM (Pulse Width Modulation) merupakan metode untuk mengatur lebar pulsa suatu frekuensi. Salah satu fungsi

metode ini, dapat digunakan untuk mengontrol kecepatan putaran motor dc. Dengan mengatur lebar pulsa, akan

menghasilkan tegangan keluaran yang cukup linier sesuai besarnya duty cicle. Keluaran tegangan yang linier inilah yang

digunakan untuk menyulut driver agar motor bisa berputar. Semangkin besar duty cicle yang diberikan maka semangkin

besar juga tegangan keluarannya dan kecepatan motor akan semangkin cepat.

Gambar 11.1 Aplikasi PWM dan Motor DC

Gambar 11.2 CodeWizardAVR untuk PWM

Page 37: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

37

Contoh Program

Rangkaian Simulasi Analog dan PWM pada LCD Display

#include <mega8535.h>

#include <delay.h>

#include <stdio.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

// Declare your global variables here

char temp[5];

void main(void)

{

// Declare your local variables here

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: 3.906 kHz

// Mode: Fast PWM top=FFh

// OC0 output: Non-Inverted PWM

TCCR0=0x6D;

TCNT0=0x00;

OCR0=0x00;

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

while (1)

{

// Place your code here

OCR0=100;

lcd_gotoxy(0,0);

sprintf(temp,"Data PWM = %d ",OCR0);

lcd_puts(temp);

};

}

Page 38: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

38

Gambar 11.3 CodeWizardAVR untuk PWM, ADC dan LCD

Rangkaian Simulasi Analog dan PWM pada LCD Display

Gambar 11.4 Aplikasi ADC to LCD Display

Program PWM dengan Fast PWM 1

#include <mega8535.h>

#include <stdio.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

Page 39: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

39

#include <lcd.h>

#include <delay.h>

#define ADC_VREF_TYPE 0x60

// Read the 8 most significant bits

unsigned char 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 ADCH;

}

// Declare your global variables here

unsigned char temp[10];

void main(void)

{

// Port D initialization

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

// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T

PORTD=0x00;

DDRD=0x30;

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 7.813 kHz

// Mode: Fast PWM top=00FFh

// OC1A output: Non-Inv.

// OC1B output: Non-Inv.

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

TCCR1B=0x0D;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Analog Comparator initialization

// Analog Comparator: Off

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

ACSR=0x80;

Page 40: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

40

SFIOR=0x00;

// ADC initialization

// ADC Clock frequency: 62.500 kHz

// ADC Voltage Reference: AVCC pin

// ADC High Speed Mode: Off

// ADC Auto Trigger Source: None

// Only the 8 most significant bits of

// the AD conversion result are used

ADMUX=ADC_VREF_TYPE & 0xff;

ADCSRA=0x87;

SFIOR&=0xEF;

// LCD module initialization

lcd_init(16);

while (1)

{

// Place your code here

OCR1A = read_adc(0); //keluarkan data ADC ke PORTD.5 sebagai PWM

lcd_gotoxy(0,0);

sprintf(temp,"Nilai PWM = %d ", OCR1A);

lcd_puts(temp);

delay_ms(100);

};

}

Rangkaian Simulasi Analog dan PWM pada LCD Display

Gambar 11.5 Aplikasi ADC to LCD Display

Program PWM dengan Fast PWM 2

#include <mega8535.h>

#include <stdio.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

Page 41: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

41

#include <lcd.h>

#include <delay.h>

#define ADC_VREF_TYPE 0x60

// Read the 8 most significant bits

// of the AD conversion result

unsigned char 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 ADCH;

}

// Declare your global variables here

unsigned char temp[30];

void main(void)

{

// Port D initialization

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

// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T

PORTD=0x00;

DDRD=0x30;

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 7.813 kHz

// Mode: Fast PWM top=00FFh

// OC1A output: Non-Inv.

// OC1B output: Non-Inv.

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

TCCR1B=0x0D;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Analog Comparator initialization

// Analog Comparator: Off

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

ACSR=0x80;

SFIOR=0x00;

Page 42: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

42

// ADC initialization

// ADC Clock frequency: 62.500 kHz

// ADC Voltage Reference: AVCC pin

// ADC High Speed Mode: Off

// ADC Auto Trigger Source: None

// Only the 8 most significant bits of

// the AD conversion result are used

ADMUX=ADC_VREF_TYPE & 0xff;

ADCSRA=0x87;

SFIOR&=0xEF;

// LCD module initialization

lcd_init(16);

while (1)

{

// Place your code here

OCR1A = read_adc(0); //keluarkan data ADC ke PORTD.5 sebagai PWM

lcd_gotoxy(0,0);

sprintf(temp,"PWM1 = %d ", OCR1A); //PWM 1

lcd_puts(temp);

OCR1B = read_adc(1);

lcd_gotoxy(0,1);

sprintf(temp,"PWM2 = %d ", OCR1B); //PWM 2

lcd_puts(temp);

delay_ms(1000);

};

}

Page 43: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

43

BAB 12

APLIKASI TIMER

12.1 Mode Normal

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 akan membahas Timer0 dan

Timer1 saja. Sedangkan Timer2 memiliki perlakuan yang sama dengan Timer0.

Perhitungan untuk Timer0 dan Timer1 adalah sebagai berikut:

Ttimer0 = Tosc*(256-TCNT0)*N → (8 bit = 256)

Ttimer1 = Tosc*(65536-TCNT1)*N → (16 bit = 65536)

Tosc = 1/Fosc → pada aplikasi ini saya menggunakan kristal 12 MHz, sehingga:

Tosc = 1/12Mhz = 0,0000000833 detik

Dimana:

Ttimer0 = lamanya periode Timer0

Ttimer1 = lamanya periode Timer1

TCNT0 = Register Timer0

TCNT1 = Register Timer1

N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)

Tosc = periode clock

Fosc = frekuensi clock kristal

Sekarang kita akan membuat aplikasi timer yang ditampilkan pada LCD. LCD menampilkan suatu nilai yang akan

selalu bertambah setiap detik (menggunakan fitur timer), nilai awal yaitu 0 setelah 1 detik (menggunakan timer)

kemudian nilai tersebut akan naik menjadi 1, kemudian 2 dan seterusnya, jika sudah sampai 100 maka akan diset kembali

menjadi 0.

Gambar 12.1 Rangkaian Simulasi Timer

Menggunakan Timer1: Ttimer1 = Tosc*(65536-TCNT1)*N

Pada aplikasi diatas diinginkan lamanya timer adalah 1 detik (Ttimer1 = 1 detik) dan jika saya menggunakan kristal

12 MHz dan menggunakan skala clock N = 1024, maka didapat:

1 = 0,0000000833*(65536-TCNT1)*1024

TCNT1= 53817.25 53818

TCNT1= 53818 = D23A (dalam hexa)

Page 44: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

44

Dari perhitungan diatas didapat nilai 53818 atau dalam hexa D23A, nilai tersebut harus diisikan pada register

TCNT1 agar Timer 1 bernilai 1 detik.

Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:

Gambar 12.2 Configurasi CodeWizardAVR Timer1

Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat dari Fosc/N atau 12

Mhz/1024.

Berikut adalah listing program lengkapnya:

#include <mega8535.h>

#include <stdlib.h>

#asm

.equ __lcd_port=0×15 ;PORTC

#endasm

#include <lcd.h>

unsigned char temp[6];

int data;

// Timer 1 overflow interrupt service routine

interrupt [TIM1_OVF] void timer1_ovf_isr(void)

{

TCNT1H=0xD23A >> 8;

TCNT1L=0xD23A & 0xff;

data++; //setelah 1 detik increament data

}

void main(void)

{

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 11.719 kHz

// Mode: Normal top=FFFFh

Page 45: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

45

// 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=0×00;

TCCR1B=0×05;

TCNT1H=0xD2;

TCNT1L=0x3A;

ICR1H=0×00;

ICR1L=0×00;

OCR1AH=0×00;

OCR1AL=0×00;

OCR1BH=0×00;

OCR1BL=0×00;

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

TIMSK=0×04;

// 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(“Timer :”);

itoa(data,temp); //menampilkan di LCD

lcd_gotoxy(0,1);

lcd_puts(temp);

};

}

Menggunakan Timer0 :

Ttimer0 = Tosc*(256-TCNT0)*N

Dengan menggunakan Timer0, untuk aplikasi yang sama seperti diatas, sebenarnya timer0 ini tidak dapat

menghasilkan periode timer selama 1 detik dikarenakan keterbatasan jumlah bit yaitu hanya 8 bit (256) saja. Tetapi kita

masih dapat memanupulasi program agar dapat menghasilkan timer selama 1 detik, caranya dengan membuat timer

selama 10 ms kemudian dilakukan pengulangan sebanyak 100 kali, maka akan dihasilkan timer selama 1 detik.

10 ms * 100= 1 detik

Pada aplikasi ini diinginkan lamanya timer adalah 10 ms (Ttimer0 = 10 ms = 0.01 s) dan jika saya menggunakan kristal

12 MHz dan menggunakan skala clock/prescaler N = 1024, maka didapat:

0.01 = 0,0000000833*(256-TCNT0)*1024

TCNT0= 138 = 8A (dalam hexa)

Page 46: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

46

Dari perhitungan diatas didapat nilai 138 atau dalam hexa 8A, nilai tersebut harus diisikan pada register TCNT0 agar

Timer 0 bernilai 10 mili detik.

Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:

Gambar 12.3 Configurasi CodeWizardAVR Timer0

Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat dari Fosc/N atau 12

Mhz/1024.

Berikut adalah listing program lengkapnya:

#include <mega16.h>

#include <stdlib.h>

#asm

.equ __lcd_port=0×15 ;PORTC

#endasm

#include <lcd.h>

unsigned char temp[6], loop=0;

int data;

// Timer 0 overflow interrupt service routine

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

// Reinitialize Timer 0 value

TCNT0=0x8A;

loop++;

if (loop>=100)

{

data++;

loop=0;

}

}

void main(void)

{

// Timer/Counter 0 initialization

Page 47: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

47

// Clock source: System Clock

// Clock value: 11.719 kHz

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0×05;

TCNT0=0x8A;

OCR0=0×00;

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

TIMSK=0×01;

// 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(“ElectrO-cOntrOl”);

itoa(data,temp); //menampilkan di LCD

lcd_gotoxy(0,1);

lcd_puts(temp);

};

}

Page 48: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

48

12.2 Mode CTC

Pada mode CTC tidak jauh berbeda dengan mode Normal, perbedaan hanya terletak pada cara menghitung, tepatnya

mulai dan akhir perhitungan pada register TCNT0.

Perhitungan untuk Timer0 dan Timer1 adalah sebagai berikut:

Ttimer0 = Tosc*(1+OCR0)*N → (8 bit = 256)

Ttimer1 = Tosc*(1+OCR1A)*N → (16 bit = 65536)

Tosc = 1/Fosc → pada aplikasi ini saya menggunakan kristal 12 MHz, sehingga:

Tosc = 1/12Mhz = 0,0000000833 detik

Dimana:

Ttimer0 = lamanya periode Timer0

Ttimer1 = lamanya periode Timer1

OCR0 = Register Timer0 ( 0 – 255 )

OCR1A = Register Timer1 ( 0 – 65535 )

N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)

Tosc = periode clock

Fosc = frekuensi clock kristal

Sekarang kita akan membuat aplikasi timer yang ditampilkan pada LCD. LCD menampilkan suatu nilai yang akan

selalu bertambah setiap detik (menggunakan fitur timer), nilai awal yaitu 0 setelah 1 detik (menggunakan timer)

kemudian nilai tersebut akan naik menjadi 1, kemudian 2 dan seterusnya, jika sudah sampai 100 maka akan diset kembali

menjadi 0.

Menggunakan Timer1: Ttimer1 = Tosc*(1+OCR1A)*N

Pada aplikasi diatas diinginkan lamanya timer adalah 1 detik (Ttimer1 = 1 detik) dan jika saya menggunakan kristal

12 MHz dan menggunakan skala clock N = 1024, maka didapat:

1 = 0,0000000833*(1+OCR1A)*1024

1+OCR1A = 11718.75 11719

OCR1A = 11718 = 2DC6 (dalam hexa)

Dari perhitungan diatas didapat nilai 53818 atau dalam hexa D23A, nilai tersebut harus diisikan pada register

TCNT1 agar Timer 1 bernilai 1 detik.

Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:

Gambar 12.4 Configurasi CodeWizardAVR Timer1

Page 49: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

49

Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat dari Fosc/N atau 12

Mhz/1024.

Berikut adalah listing program lengkapnya:

#include <mega8535.h>

#include <stdlib.h>

#asm

.equ __lcd_port=0×15 ;PORTC

#endasm

#include <lcd.h>

unsigned char temp[6];

int data;

// Timer 1 overflow interrupt service routine

interrupt [TIM1_OVF] void timer1_ovf_isr(void)

{

TCNT1H=0xD23A >> 8;

TCNT1L=0xD23A & 0xff;

data++; //setelah 1 detik increament data

}

void main(void)

{

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 11.719 kHz

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: On

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0×00;

TCCR1B=0×05;

TCNT1H=0xD2;

TCNT1L=0x3A;

ICR1H=0×00;

ICR1L=0×00;

OCR1AH=0×00;

OCR1AL=0×00;

OCR1BH=0×00;

OCR1BL=0×00;

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

TIMSK=0×04;

// LCD module initialization

lcd_init(16);

// Global enable interrupts

#asm(“sei”)

while (1)

{

Page 50: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

50

if (data==100)

{

lcd_clear();

data=0;

}

lcd_gotoxy(0,0);

lcd_putsf(“Timer :”);

itoa(data,temp); //menampilkan di LCD

lcd_gotoxy(0,1);

lcd_puts(temp);

};

}

Menggunakan Timer0 :

Ttimer0 = Tosc*(256-TCNT0)*N

Dengan menggunakan Timer0, untuk aplikasi yang sama seperti diatas, sebenarnya timer0 ini tidak dapat

menghasilkan periode timer selama 1 detik dikarenakan keterbatasan jumlah bit yaitu hanya 8 bit (256) saja. Tetapi kita

masih dapat memanupulasi program agar dapat menghasilkan timer selama 1 detik, caranya dengan membuat timer

selama 10 ms kemudian dilakukan pengulangan sebanyak 100 kali, maka akan dihasilkan timer selama 1 detik.

10 ms * 100= 1 detik

Pada aplikasi ini diinginkan lamanya timer adalah 10 ms (Ttimer0 = 10 ms = 0.01 s) dan jika saya menggunakan kristal

12 MHz dan menggunakan skala clock/prescaler N = 1024, maka didapat:

0.01 = 0,0000000833*(256-TCNT0)*1024

TCNT0= 138 = 8A (dalam hexa)

Dari perhitungan diatas didapat nilai 138 atau dalam hexa 8A, nilai tersebut harus diisikan pada register TCNT0 agar

Timer 0 bernilai 10 mili detik.

Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:

Gambar 12.5 Configurasi CodeWizardAVR Timer0

Page 51: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

51

Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat dari Fosc/N atau 12

Mhz/1024.

Berikut adalah listing program lengkapnya:

#include <mega16.h>

#include <stdlib.h>

#asm

.equ __lcd_port=0×15 ;PORTC

#endasm

#include <lcd.h>

unsigned char temp[6], loop=0;

int data;

// Timer 0 overflow interrupt service routine

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

// Reinitialize Timer 0 value

TCNT0=0x8A;

loop++;

if (loop>=100)

{

data++;

loop=0;

}

}

void main(void)

{

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: 11.719 kHz

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0×05;

TCNT0=0x8A;

OCR0=0×00;

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

TIMSK=0×01;

// Analog Comparator initialization

// Analog Comparator: Off

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

ACSR=0×80;

SFIOR=0×00;

// LCD module initialization

lcd_init(16);

// Global enable interrupts

#asm(“sei”)

while (1)

{

if (data==100)

{

lcd_clear();

Page 52: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

52

data=0;

}

lcd_gotoxy(0,0);

lcd_putsf(“ElectrO-cOntrOl”);

itoa(data,temp); //menampilkan di LCD

lcd_gotoxy(0,1);

lcd_puts(temp);

};

}

Page 53: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

53

BAB 13

APLIKASI COUNTER

13.1 Menggunakan Timer

Counter0 Untuk aplikasi counter lebih mudah dibandingkan dengan timer, karena kita tidak harus lagi menghitung untuk

mendapatkan nilai dari register TCNT, tetapi secara otomatis register TCNT yang akan mencacah jika ada input yang

masuk.

Berikut adalah contoh aplikasi counter untuk menghitung menggunakan T0 dan ditampilkan pada LCD, input yang

digunakan berasal dari pushbutton.

Gambar 13.1 Rangkaian Simulasi Counter

Input untuk counter0 berasal dari pin T0 atau PB0 akan disimpan pada register TCNT0 kemudian ditampilkan ke

LCD. Counter0 hanya mampu mencacah sampai dengan nilai 256 dikarenakan counter 8 bit. Berikut adalah setting pada

CodeVision CodeWizard AVR:

Gambar 13.2 Configurasi CodeWizardAVR Timer0

Page 54: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

54

Berikut adalah listing program lengkap:

#include <mega8535.h>

#include <stdlib.h>

#asm

.equ __lcd_port=0×15 ;PORTC

#endasm

#include <lcd.h>

unsigned char temp[6];

int data;

void main(void)

{

// Timer/Counter 0 initialization

// Clock source: T0 pin Falling Edge

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0×06;

TCNT0=0×00;

OCR0=0×00;

// Analog Comparator initialization

// Analog Comparator: Off

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

ACSR=0×80;

SFIOR=0×00;

// LCD module initialization

lcd_init(16);

while (1)

{

data=TCNT0;//hasil counter (TCNT0) dipindah ke data

if (data>=256)

{

lcd_clear();

}

lcd_gotoxy(0,0);

lcd_putsf(“*Electro – PCR*”);

itoa(data,temp); //menampilkan di LCD

lcd_gotoxy(0,1);

lcd_puts(temp);

};

}

Page 55: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

55

13.2 Menggunakan Interups

Interupsi merupakan suatu perintah untuk menghentian proses normal sementara waktu lalu melakukan proses

tertentu, setelah proses tertentu tersebut selesai maka proses normal akan berjalan kembali.

Interups0

Berikut adalah contoh aplikasi counter sebagai proses normal. Proses normal melakukan perhitungan mundur dari

1000. Sedangkan proses interupsi adalah melakukan perhitungan naik mulai dari 0. Input yang menggunakan tombol

pushbutton akan di cek oleh INT0. Jika terdapat sinyal pada INT0 maka kemudian proses normal terhenti lalu proses

interupsi dilakukan, setelah proses interupsi selesai, maka proses normal akan berjalan kembali melanjutkan proses

sebelumnya.

Gambar 13.3 Rangkaian Simulasi Interupsi

Berikut adalah setting pada CodeVision CodeWizard AVR:

Gambar 13.4 Configurasi CodeWizardAVR INT0

Page 56: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

56

Berikut adalah listing program lengkap:

#include <mega8535.h>

#include <delay.h>

#include <stdio.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>

int i=1000,x=0;

char buffer[33];

// External Interrupt 0 service routine

interrupt [EXT_INT0] void ext_int0_isr(void)

{

// Place your code here

x++;

lcd_gotoxy(0,0);

sprintf(buffer,"counter = %d ", x);

lcd_puts(buffer);

delay_ms(2000);

}

void main(void)

{

// External Interrupt(s) initialization

// INT0: On

// INT0 Mode: Falling Edge

// INT1: Off

// INT2: Off

GICR|=0x40;

MCUCR=0x02;

MCUCSR=0x00;

GIFR=0x40;

lcd_init(16);

#asm("sei")

while (1)

{

// Place your code here

i--;

lcd_gotoxy(0,0);

sprintf(buffer,"Hitung = %4d", i);

lcd_puts(buffer);

if(i==0) i=1000;

delay_ms(300);

};

}

Page 57: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

57

BAB 14

KOMUNIKASI SERIAL RS-232

I. Tujuan:

Mahasiswa mengerti cara melakukan komunikasi serial dengan mikrokontroller AVR untuk

mengendalikan sesuatu peralatan

Mahasiswa mengerti cara membuat program C pada mikrokontroller AVR untuk melakukan

komunikasi serial

II. Peralatan yang digunakan:

modul AVR

Modul LED dan switch

Kabel serial RS232 (cross)

III. Dasar Teori:

Komunikasi serial merupakan komunikasi data dengan pengiriman data secara satu per satu

dengan menggunakan satu jalur kabel data. Sehingga komunikasi serial hanya menggunakan 2

kabel data yaitu kabel data untuk pengiriman yang disebut transmit (Tx) dan kabel data untuk

penerimaan yang disebut receive (Rx). Kelebihan dari komunikasi serial adalah jarak pengiriman dan

penerimaan dapat dilakukan dalam jarak yang cukup jauh dibandingan dengan komunikasi

parallel tetapi kekurangannya adalah kecepatan lebih lambat daripada komunikasi parallel, untuk

saat ini sedang dikembangkan teknologi serial baru yang dinamakan USB (Universal Serial Bus)

yang memiliki kecepatan pengiriman dan penerimaan data lebih cepat disbanding serial biasa.

Beberapa contoh : komunikasi Serial RS-232 dan RS-485.

Mode serial port :

1. Pada mode 0, Pin TX mengeluarkan shift clock, dan pin RX dapat menerima maupun

mengirim data, dengan format 8 bit data dimulai dengan LSB dulu yang dikirim. Jadi pada

saat dikirim data melalui RX maka sekalian pin TX mengirimkan signal clock secara

berbarengan. Baud ratenya fix yaitu 1/12 frekuensi osilatornya.

2. Pada mode 1, Pin TX berfungsi untuk mengirim data dan RX berfungsi untuk menerima

data, data yang dikirim formatnya 8 bit data dengan LSB dikirim dahulu,serta 1 start bit(

berlogika 0 ) dan 1 stop bit( berlogika 1 ). Baud ratenya variabel tergantung dari nilai yang

ada pada register timer 1 maupun timer 2.

3. Pada mode 2, Pin TX berfungsi untuk mengirim data dan RX untuk menerima data, format

datanya sama dengan mode 1 hanya saja terdapat parity bitnya sehingga total bit yang

terkirim sebanyak 11 bit. Bit paritynya dapat diset melalui TB8( lihat pada SCON ).

Baud ratenya hanya ada 2 pilihan yaitu 1/32 atau 1/64 dari frekuensi osilatornya.

4. Pada mode 3 identik dengan mode 2, hanya saja Baud ratenya variabel

tergantung nilai yang terdapat pada register dari timer 1 dan timer 2.

SM0: Serial Port Mode bit 0, bit Pengatur Mode Serial

SM1: Serial Port Mode bit 1, bit Pengatur Mode Serial

SM2: Serial Port Mode bit 2, bit untuk mengaktifkan komunikasi multiprosesor pada kondisi

set.

Page 58: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

58

REN: Receive Enable, bit untuk mengaktifkan penerimaan data dari Port Serial pada kondisi

set. Bit ini di set dan clear oleh perangkat lunak.

TB8: Transmit bit 8, bit ke 9 yang akan dikirimkan pada mode 2 atau 3. Bit ini diset dan clear

oleh perangkat lunak

RB8: Receive bit 8, bit ke 9 yang diterima pada mode 2 atau 3. Pada Mode 1 bit ini berfungsi

sebagai stop bit.

TI: Transmit Interrupt Flag, bit yang akan set pada akhir pengiriman karakter. Bit ini diset

oleh perangkat keras dan di clear oleh perangkat lunak

RI: Receive Interrupt Flag, bit yang akan set pada akhir penerimaan karakter. Bit ini diset

oleh perangkat keras dan di clear oleh perangkat lunak

Dalam coding serial dalam AVR, terdapat 2 konsep yaitu secara polling maupun

secara interrupt. Seperti yang sudah dijelaskan diatas mengenai TI dan RI, maka dalam

menerima data RI akan terset secara hardware sedangkan TI diset pada saat data hampir

selesai dikirim, dan dalam hal transmisi data sangat perlu untu“CEK" kondisi TI. Bila TI

sudah berlogika 1 berarti data yang ditaruh dalam SBUF sudah selesai dikirim dan harus

diclear secara software( secara program ), sebab bila tidak dicek apakah TI sudah „1‟ atau

belum maka mungkin saja terjadi SBUF sudah direload dengan data baru sedangkan data

yang lama belum selesai dikirim sehingga terjadi apa yang disebut dengan data corruption.

Maka sebelum mengirim byte data yang selanjutnya sangatlah perlu untuk mengecek TI dulu.

Bila coding serial dengan konsep polling maka codenya harus terus menerus mengecek flag

TI dan RI, apakah berlogika „1‟, bila berlogika „1‟ maka langsung lompat ke procedure yang

bersangkutan, dengan jangan lupa secepatnya mengclear flag TI atau RI, agar tidak lompat ke

int. veltor dari serial. Keuntungan konsep polling adalah codenya yang simple, tetapi

menghabiskan cpu time sebab selalu mengecek flag TI dan RI terus menerus tanpa dapat

melakukan tugas yang lain, sebab bila melakukan yang lain maka pada saat salah satu flag

tersebut menjadi satu maka akan langsung lompat ke int. vektor serial sehingga program akan

menjadi kacau. Bila coding serial dengan konsep interrupt, maka program serialnya hanya

ada pada subroutine dari int. serial saja, dimana hanya mengecek oleh flag mana interrupt

serial terpanggil? Oleh TI atau RI? Bila oleh TI maka taruh datanya ke SBUF TI utk

dikirim, dan bila karena RI maka selamatkan datanya ke suatu variabel dari SBUF RI.

Keuntungannya code kita dapat melakukan tugas yang lainnya, kerugiannya adalah code yang

cukup kompleks.

IV. Langkah Kerja

Page 59: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

59

Gambar2.1. Setting komunikasi Serial Gambar2.2. Setting komunikasi Serial

Gambar2.3. Sistem Komunikasi serial PC dengan AVR Min. Sys.

Gambar2.4. Kabel komunikasi Serial Null Modem (cross)

Gambar2.5. Menu Setting -> terminal

Modul AVR

min Sys

PC with serial

port (COM)

COM 1 DB-9 female

1

2

3

4

5

4

1

2

3

4

5

4

female male

PC side AVR Min. Sys.

side

Page 60: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

60

Gambar2.6. Menu Tools -> terminal

Gambar2.7. Menjalankan window terminal di Code Vision AVR untuk mengamati hasil program

yang mengakses komunikasi serial

Page 61: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

61

Gambar2.8. Terminal program bisa juga memakai program Hyperterminal bawaan MS Windows.

Bisa di akses di Start-> All programs -> Acessories -> Communications -> Hyperterminal

V. Program

Melakukan pengiriman 1 buah karakter terus menerus

#include <mega16.h>

#include <stdio.h>

void main(void)

{

// USART initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART Receiver: On

// USART Transmitter: On

// USART Mode: Asynchronous

// USART Baud rate: 9600

UCSRA=0x00;

UCSRB=0x18;

UCSRC=0x86;

UBRRH=0x00;

UBRRL=0x47;

while (1)

{

putchar(‘a’);

}

}

Bandingkan hasilnya dengan program yang ada di bawah ini:

#include <mega16.h>

#include <stdio.h>

void main(void)

{

// USART initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART Receiver: On

// USART Transmitter: On

// USART Mode: Asynchronous

// USART Baud rate: 9600

UCSRA=0x00;

UCSRB=0x18;

UCSRC=0x86;

UBRRH=0x00;

UBRRL=0x47;

while (1)

{

putchar(‘a’);

putchar(0x0d);

putchar(0x0a);

}

}

Page 62: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

62

VI. Analisa

Pada percobaan ini pertama – tama dilakukan setting terhadap chip menggunakan

Atmega8535L pada clock 4Mhz lalu mnestting LACd pada portB,setting ADC 8 bit dengan interrupt

, setting komunikasi serial (USART). Pada setting USART yang digunakan hanya transmitter (TX)

saja karena hanya mengirimkan data ke PC atau dengan kata lain tidak menrima masukan dari PC.

Setelah itu nilai ADC dibaca dan datanya dikirim melalui serial dengan perintah sprinf untuk kalimat

dan putchar unutk sebuah karakter seperti “L”,”D”,R” atau apbila ingin lebih dari satu karakter dapat

dikirim dengan sprin(LDR);.

Page 63: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

63

RTC

Apa itu RTC ? (http://pccontrol.wordpress.com/2011/06/27/pengetahuan-dasar-pemrograman-

rtc-ds1307-dengan-bahasa-c-codevision-untuk-avr/)

RTC yang dimaksud disini adalah real time clock (bukan real time computing), biasanya berupa IC

yg mempunyai clock sumber sendiri dan internal batery untuk menyimpan data waktu dan tanggal.

Sehingga jika system komputer / microcontroller mati waktu dan tanggal didalam memori RTC tetap

uptodate.

Salah satu RTC yang sudah populer dan mudah penggunaanya adalah DS1307, apalagi pada

Codevision sudah tersedia fungsi-fungsi untuk mengambil data waktu dan tanggal untuk

RTCDS1307 ini.

Fitur-fitur DS1307:

Real-time clock (RTC) menghitung detik, menit, jam,tanggal,bulan dan hari dan tahun valid

sampai tahun 2100

Ram 56-byte, nonvolatile untuk menyimpan data.

2 jalur serial interface (I2C).

output gelombang kotak yg diprogram.

Automatic power-fail detect and switch

Konsumsi arus hanya 500nA pada batery internal.

mode dg oscillator running.

temperature range: -40°C sampai +85°C

Page 64: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

64

Untuk membaca data tangal dan waktu yg tersimpan di memori RTC Ds1307 dapat dilakukan

melalui komunikasi serial I2C spt tampak pada gambar berikut:

Cara pembacaan

DS1307 beropersai sebagai slave pada bus I2C. Cara Access pertama mengirim sinyal

START diikuti device address dan alamat sebuah register yg akan dibaca. Beberapa register dapat

dibaca sampai STOP condition dikirim.

Data waktu dan tanggal tersimpan dalam memori masing masing 1 byte , mulai dari alamat 00H

sampai 07H. Sisanya (08H ~ 3FHalamat RAM yg bisa digunakan).

Page 65: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

65

Pemrograman RTC DS1307 dengan Codevision.

Codevision sudah menyediakan fungsi-fungsi khusus untuk mengakses data DS1307 jadi kita tinggal

menggunakanya. Apalagi dengan fasilitas codewizard pemrograman RTC menjadi mudah.

setelah kita klik ok maka akan tersedia template Code program sbb:

#include <mega16.h>

// I2C Bus functions

#asm

.equ __i2c_port=0×18 ;PORTB

.equ __sda_bit=0

.equ __scl_bit=1

#endasm

#include <i2c.h>

// DS1307 Real Time Clock functions

#include <ds1307.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0×15 ;PORTC

#endasm

#include <lcd.h>

Page 66: 97674720 buku-mikrokontroler-atmega8535-dengan-codevisionavr

66

char tampungLCD[16];

void main(void)

{

unsigned char hour,minute,second;

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

// LCD module initialization

lcd_init(16);

/* initialize the DS1307 RTC */

rtc_init(0,0,0); //tambahankan baris ini

//this function sets the current time of the RTC.

rtc_set_time(6,0,0); // jam 6:00:00

while (1)

{

/* read time from the DS1307 RTC */

rtc_get_time(&hour,&minute,&second);

//tampilkan di LCD 2×16

lcd_gotoxy(0,0);

sprintf(tampungLCD,”Time: %d:%d:%d “,hour,minute,second);

lcd_puts(tampungLCD);

}

}