Praktikum Mikrokontroler AVR

113
PRAKTIKUM MIKROKONTROLER AVR Disusun oleh : Tianur Pekanbaru 2014

description

Praktikum Mikrokontroler AVR

Transcript of Praktikum Mikrokontroler AVR

Page 1: Praktikum Mikrokontroler AVR

PRAKTIKUM MIKROKONTROLER AVR

Disusun oleh : Tianur

Pekanbaru 2014

Page 2: Praktikum Mikrokontroler AVR
Page 3: Praktikum Mikrokontroler AVR

i

PRAKTIKUM MIKROKONTROLER AVR

Disusun oleh : Tianur

Pekanbaru 2014

Page 4: Praktikum Mikrokontroler AVR

ii

_____halaman ini sengaja dikosongkan_____

Page 5: Praktikum Mikrokontroler AVR

iii

Kata Pengantar

Saya menyambut baik penerbitan bahan ajar kuliah ini yang khusus dipakai untuk mahasiswa Politeknik Caltex Riau, dengan tujuan untuk memudahkan kegiatan belajar mengajar di Politeknik ini. Penerbitan bahan ajar ini merupakan salah satu wujud nyata tekad Politeknik Caltex Riau dalam usaha mencerdaskan anak bangsa

Saya menyadari bahwa usaha penerbitan ini menuntut pengorbanan waktu dan tenaga bagi penyusunnya. Untuk itu saya mengucapkan banyak terima kasih dan saya sampaikan penghargaan yang setinggi-tingginya kepada semua pihak yang terkait, atas dedikasinya untuk membantu peningkatan mutu pendidikan di Politeknik Caltex Riau.

Pekanbaru, Maret 2014 Direktur Dadang Syarif S.S., S.Si., M.Sc.

Page 6: Praktikum Mikrokontroler AVR

iv

Terima kasih Untuk Istriku, Isniarni Anak-anakku, Hafizh Ihsan Ramadhan dan Hazim Ihsan Muntasir

Page 7: Praktikum Mikrokontroler AVR

v

Daftar Isi

Percobaan 1 pengenalan codevision avr ......................................................... 1 1.1 Pendahuluan. .......................................................................................... 1

1.1 Instalasi. ................................................................................................. 1

1.2 Membuat Program Baru .......................................................................... 1

Percobaan 2 pengenalan proteus 7 .................................................................. 7 1.1 Pendahuluan ........................................................................................... 7

2.2 Instalasi .................................................................................................. 8

2.3 Membuat Rangkaian Simulasi ................................................................. 9

Percobaan 3 Aplikasi LED ........................................................................... 15

3.1 Pendahuluan ......................................................................................... 15

3.1.2 Rangkaian Simulasi ................................................................... 16 3.1.3 Latihan Program ........................................................................ 16

Percobaan 4 Aplikasi 7 segment non-multiplex ............................................ 19

4.1 Pendahuluan ......................................................................................... 19

4.2 7 Segment Non - Multiplex tanpa decoder ............................................. 19 4.2.1 Rangkaian Simulasi ................................................................... 19 4.2.2 Latihan Program ........................................................................ 20

4.3 7 Segment Non-Multiplex dengan decoder ............................................ 22

4.3.1 Rangkaian Simulasi ................................................................... 23 4.3.2 Latihan Program ........................................................................ 23

Percobaan 5 Aplikasi 7 segment multiplex ................................................... 27

5.1 Pendahuluan ......................................................................................... 27

5.2 Aplikasi 7 Segment tanpa decoder 7447 ................................................ 27

5.2.1 Rangkaian Simulasi ................................................................... 27 5.2.2 Latihan Program ........................................................................ 27

5.3 Aplikasi 7 Segment dengan Decoder 7447 ............................................. 29

Page 8: Praktikum Mikrokontroler AVR

vi

5.3.1 Rangkaian Simulasi ................................................................... 30 5.3.2 Latihan Program ........................................................................ 30

Percobaan 6 Aplikasi LED DOT MATRIX .................................................. 33 6.1 Pendahuluan ......................................................................................... 33

6.1.1 Rangkaian Simulasi ................................................................... 34 6.1.2 Latihan Program ........................................................................ 34

Percobaan 7 Aplikasi LCD DISPLAY 16X2 ................................................ 37 7.1 Pendahuluan ......................................................................................... 37

7.1.1 Rangkaian Simulasi ................................................................... 37 7.1.2 Latihan Program ........................................................................ 38

Percobaan 8 Aplikasi TOMBOL/SWITCH .................................................. 41 8.1 Pendahuluan ......................................................................................... 41

8.2 Aplikasi Tombol dan LED .................................................................... 42

8.2.1 Rangkaian Simulasi ................................................................... 42 8.2.2 Latihan Program ........................................................................ 42

8.3 Aplikasi Tombol dan 7 Segment ........................................................... 43

8.3.1 Rangkaian Simulasi ................................................................... 43

Percobaan 9 Aplikasi TOMBOL Matrix....................................................... 45

9.1 Pendahuluan ......................................................................................... 45

9.2 Rangkaian Simulasi .............................................................................. 46

9.3 Latihan Program ................................................................................... 47

Percobaan 10 ANALOG DIGITAL CONVERTER ...................................... 53 10.1 Pendahuluan ....................................................................................... 53

10.2 Aplikasi ADC dan LCD ...................................................................... 53

10.2.1 Rangkaian Simulasi ................................................................. 53 10.2.2 Latihan Program ...................................................................... 54

Percobaan 11 PULSE WIDTH MODULATION (PWM) ............................. 61

11.1 Pendahuluan ....................................................................................... 61

11.2 Aplikasi PWM, LCD dan Motor DC ................................................... 61

11.2.1 Rangkaian Simulasi ................................................................. 61

Page 9: Praktikum Mikrokontroler AVR

vii

11.2.2 Latihan Program ...................................................................... 62 11.3 Aplikasi ADC 1 Channel ke PWM ...................................................... 63

11.3.1 Rangkaian Simulasi ................................................................. 63 11.3.2 Latihan Program ...................................................................... 64

11.4 Aplikasi ADC 2 Channel ke PWM ...................................................... 67

11.4.1 Rangkaian Simulasi ................................................................. 67 11.4.2 Latihan Program ...................................................................... 67

Percobaan 12 Aplikasi TIMER .................................................................... 71 12.1 Pendahuluan ....................................................................................... 71

12.2 Mode Normal ..................................................................................... 71

12.2.1 Rangkaian Simulasi ................................................................. 72 12.2.2 Latihan Program ...................................................................... 72

12.3 Mode CTC (Clear Timer on Compare Match) ..................................... 78

12.3.1 Rangkaian Simulasi ................................................................. 79 12.3.2 Latihan Program ...................................................................... 80

Percobaan 13 Aplikasi COUNTER/Penghitung ............................................ 85

13.1 Pendahuluan ....................................................................................... 85

13.2 Menggunakan Timer/Counter0 ............................................................ 85

13.2.1 Rangkaian Simulasi ................................................................. 85 13.2.2 Latihan Program ...................................................................... 86

13.3 Menggunakan Fitur Interups0.............................................................. 88

13.3.2 Latihan Program ...................................................................... 89

Percobaan 14 Aplikasi Komunikasi serial .................................................... 91 14.1 Pendahuluan ....................................................................................... 91

14.1.2 Rangkaian Simulasi ................................................................. 95 14.1.3 Latihan Program ...................................................................... 95

Percobaan 15 Real Time Clock (RTC) ......................................................... 99 15.1 Pendahuluan ....................................................................................... 99

15.1.2 Rangkaian Simulasi ............................................................... 101 15.1.3 Latihan Program .................................................................... 101

Page 10: Praktikum Mikrokontroler AVR

viii

_____halaman ini sengaja dikosongkan_____

Page 11: Praktikum Mikrokontroler AVR

1

Percobaan 1 PENGENALAN CODEVISION AVR

1.1 Pendahuluan. 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. 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.1 Instalasi. Agar pengguna dapat menggunakan software CodeVisionAVR maka para pengguna harus meng-instal-nya terlebih dahulu. Adapun proses instalasi software CodeVisionAVR ini cukup mudah. Klik dua kali master file setup.exe. Ikuti langkah-langkah yang diminta dan lakukan perubahan seperlunya. Setelah selesai, program dapat langsung dijalankan.

1.2 Membuat Program Baru Membuat program baru menggunakan CodeVisionAVR tidaklah sulit. Sebagai permulaan, kita mencoba membuat PORTA sebagai Output. Adapun langkah-langkah yang harus dilakukan adalah sebagai berikut: Jalankan program CodeVisionAVR. Dengan cara klik dua kali pada Icon CodeVisionAVR seperti pada gambar 1.1.

Gambar 1.1 Icon Codevision AVR

Page 12: Praktikum Mikrokontroler AVR

2

Percobaan 1

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

Gambar 1.2 Tampilan CodeVision AVR

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

Gambar 1.3 Jendela Pilihan Tipe File

Untuk membuat program baru pilihlah Project kemudian klik OK, maka muncul pertanyaan yang menanyakan apakah kita ingin menggunakan CodeWizardAVR seperti pada gambar 1.4, kemudian pilih Yes.

Page 13: Praktikum Mikrokontroler AVR

3

Gambar 1.4 Jendela Confirm CodeWizardAVR

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

Gambar 1.5 CodeWizardAVR pada tab Chip

Selanjutnya pilih tab Ports, lalu lakukan pengaturan PORTA sebagai output seperti pada gambar 1.6.

Page 14: Praktikum Mikrokontroler AVR

4

Percobaan 1

Gambar 1.6 CodeWizardAVR pada tab Ports

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. Setelah selesai, 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 15: Praktikum Mikrokontroler AVR

5

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

Gambar 1.8 Menyisipkan program utama

Setelah selesai kita dapat melakukan kompilasi pada program dengan cara pilih menu Project lalu pilih Build All atau Ctrl+F9. Jika program sudah benar atau tidak terdapat kesalahan, maka akan tampil jendela informasi seperti gambar 1.9 berikut ini.

Gambar 1.9 Jendela Informasi

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 16: Praktikum Mikrokontroler AVR

6

Percobaan 1

_____halaman ini sengaja dikosongkan_____

Page 17: Praktikum Mikrokontroler AVR

7

Percobaan 2 PENGENALAN PROTEUS 7

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

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 :

Page 18: Praktikum Mikrokontroler AVR

8

Percobaan 2

Gambar 2.1 Tampilan Program ISIS

Keterangan :

1. Editing Window. 2. Overview Window. 3. Object Selector.

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 :

Klik dua kali file setup.exe yang terdapat pada folder master program Proteus 7 Professional versi Demo, yang dapat di download dari http://www.labcenter.co.uk.

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

Setelah selesai, program dapat langsung dijalankan.

1 2

3

Page 19: Praktikum Mikrokontroler AVR

9

2.3 Membuat Rangkaian Simulasi Dalam membuat simulasi program tidaklah sulit. Namun ada beberapa tahap yang harus dilalui. Secara garis besar ada 3 tahap, yaitu :

1. Pemilihan komponen yang akan digunakan. 2. Peletakan komponen dan penyusunan rangkaian. 3. 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 kita menggunakan IC mikrokontroler ATMega8535 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.

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

Gambar 2.2 Rangkaian ATMega8535

Page 20: Praktikum Mikrokontroler AVR

10

Percobaan 2

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

Gambar 2.3 Tampilan Jendela baru

Pilih komponen yang akan digunakan, klik Component Mode kemudian tekan tombol Pick Devices. Seperti gambar 2.4 berikut. Dan cari komponen IC Mikrokontroler ATMEGA8535 dan komponen LED.

Gambar 2.4 Tombol Pick Devices

Component Mode

Terminal Mode

Page 21: Praktikum Mikrokontroler AVR

11

Cari komponen ATMEGA8535. Pilih kategori seperti gambar 2.5, dan ambil komponen yang dibutuhkan dengan cara klik dua kali nama komponen yang dipilih seperti gambar 2.5 berikut.

Gambar 2.5 Mengambil Komponen ATMEGA8535

Cari komponen LED dengan cara yang sama.

Gambar 2.6 Mengambil Komponen LED

Setelah semua komponen terkumpul di bagian Object Selector, klik OK. Atur posisi komponen pada Editing Window. Seperti gambar 2.7 berikut.

Page 22: Praktikum Mikrokontroler AVR

12

Percobaan 2

Gambar 2.7 Posisi komponen

Ambil simbol power pada Terminal Mode seperti pada gambar 2.8 lalu letakkan pada lembar kerja.

Gambar 2.8 Posisi komponen

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

Page 23: Praktikum Mikrokontroler AVR

13

Gambar 2.9 Hubungan Jalur Komponen

Gambar rangkaian tidak perlu lengkap seperti aslinya. Yang penting input dan output rangkaian terhubung dengan komponen yang diinginkan seperti contoh gambar 2.9. Setelah selesai, rangkaian siap disimulasikan dan lihatlah tampilan yang dihasilkan pada gambar simulasi.

Gambar 2.10 Jendela Edit Component ATMEGA8535

Klik dua kali IC mikrokontroler pada rangkaian, akan muncul jendela Edit Component. Pada bagian Program File, klik lambang folder, maka akan

Page 24: Praktikum Mikrokontroler AVR

14

Percobaan 2

muncul jendela Select File Name, pilih file dengan nama LED.HEX yang telah dibuat dan berhasil di compile sebelumnya. Klik Open, lalu Klik OK.

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

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

Page 25: Praktikum Mikrokontroler AVR

15

Percobaan 3 APLIKASI LED

3.1 Pendahuluan 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 Bentuk dan warna 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)

Page 26: Praktikum Mikrokontroler AVR

16

Percobaan 3

3.1.2 Rangkaian Simulasi

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

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

Gambar 3.4 Konfigurasi CodeWizardAVR untuk LED

Page 27: Praktikum Mikrokontroler AVR

17

Program 3.1 LED_01

/* Project Name : LED_01 */ #include <mega8535.h> #include <delay.h> void main(void) { PORTA=0xFF; DDRA=0xFF; While (1) { PORTA<<=1; Delay_ms(500); } } Program 3.2 LED_02

/* Project Name : LED_02 */ #include <mega8535.h> #include <delay.h> Int a=0; void main(void) { PORTA=0xFF; DDRA=0xFF; While (1) { ++a;

If(a==9) a=1; If(a==1) PORTA=0xFE; If(a==2) PORTA=0xFD; If(a==3) PORTA=0xFB; If(a==4) PORTA=0xF7; If(a==5) PORTA=0xEF; If(a==6) PORTA=0xDF; If(a==7) PORTA=0xBF; If(a==8) PORTA=0x7F; Delay_ms(500); PORTA=0xFF;

} }

Page 28: Praktikum Mikrokontroler AVR

18

Percobaan 3

_____halaman ini sengaja dikosongkan_____

Page 29: Praktikum Mikrokontroler AVR

19

Percobaan 4 APLIKASI 7 SEGMENT

NON-MULTIPLEX

4.1 Pendahuluan 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 antrian di Bank atau tempat pelayanan umum lainnya. Pada bab ini akan membahas aplikasi menggunakan 7 segment secara sederhana.

4.2 7 Segment Non - Multiplex tanpa decoder

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.

4.2.1 Rangkaian Simulasi

Gambar 4.1 Rangkaian7 Segment Non-Multiplex

Page 30: Praktikum Mikrokontroler AVR

20

Percobaan 4

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

Gambar 4.2 Konfigurasi CodeWizardAVR untuk 7 Segment

Program 4.1 7 Segment_01

/* Project Name : 7segment_01 */ #include <mega8535.h> #include <delay.h> void main(void) { PORTA=0xFF; DDRA=0xFF; While (1) { PORTA=0x40; Delay_ms(500); PORTA=0x79; Delay_ms(500); PORTA=0x24; Delay_ms(500); PORTA=0x30; Delay_ms(500); PORTA=0x19; Delay_ms(500); PORTA=0x12; Delay_ms(500); PORTA=0x02;

Page 31: Praktikum Mikrokontroler AVR

21

Delay_ms(500); PORTA=0x78; Delay_ms(500); PORTA=0x00; Delay_ms(500); PORTA=0x10; Delay_ms(500); } }

Program 4.2 7 Segment_02

/* Project Name : 7segment_02 */ #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(); };

Page 32: Praktikum Mikrokontroler AVR

22

4.3 7 Segment Non-Multiplex dengan decoder

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; 0100 | 0011 data sekarang / terakhir

Tahap 2 PORTA&=0x03; 0000 | 0011 di AND -kan dengan data (0000 | 0011)

Tahap 3 PORTA|=0x50; 0101 | 0011 di OR –kan dengan data (0101 | 0000)

Page 33: Praktikum Mikrokontroler AVR

23

4.3.1 Rangkaian Simulasi

Gambar 4.3 Rangkaian 7 Segment dengan decoder

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

Gambar 4.4 Konfigurasi CodeWizardAVR untuk decoder 7 Segment

Page 34: Praktikum Mikrokontroler AVR

24

Percobaan 4

Program 4.3 7 Segment_03

/* Project Name : 7segment_03 */ #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 4.4 7 Segment_04

/* Project Name : 7segment_04 */ #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);

Page 35: Praktikum Mikrokontroler AVR

25

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; 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 36: Praktikum Mikrokontroler AVR

26

Percobaan 4

_____halaman ini sengaja dikosongkan_____

Page 37: Praktikum Mikrokontroler AVR

27

Percobaan 5 APLIKASI 7 SEGMENT

MULTIPLEX

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

5.2 Aplikasi 7 Segment tanpa decoder 7447

5.2.1 Rangkaian Simulasi

Gambar 5.1 Rangkaian 7 Segment Multiplex

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

Page 38: Praktikum Mikrokontroler AVR

28

Percobaan 5

Gambar 5.2 Konfigurasi 7 Segment Multiplex

Program 5.1 7 segment_05

/* Project Name : 7segment_05 */ #include <mega8535.h> #include <delay.h> void main(void) { PORTA=0xFF; DDRA=0xFF; PORTC=0x00; DDRC=0xFF; while (1) {

Page 39: Praktikum Mikrokontroler AVR

29

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

5.3 Aplikasi 7 Segment 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.

Page 40: Praktikum Mikrokontroler AVR

30

Percobaan 5

5.3.1 Rangkaian Simulasi

Gambar 5.3 Rangkaian 7 Segment Multiplex dengan Decoder

5.3.2 Latihan Program Program 5.2 7 Segment 1 digit dengan Decoder

/* Project Name : 7segment_06 */ #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;

Page 41: Praktikum Mikrokontroler AVR

31

delay_ms(500); PORTC=0x8;

delay_ms(500); PORTC=0x9; delay_ms(500); }; } Program 5.3 7 Segment Multiplex dengan Decoder

/* Project Name : 7segment_07 */ #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 42: Praktikum Mikrokontroler AVR

32

Percobaan 5

_____halaman ini sengaja dikosongkan_____

Page 43: Praktikum Mikrokontroler AVR

33

Percobaan 6 APLIKASI LED DOT MATRIX

6.1 Pendahuluan 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)

Page 44: Praktikum Mikrokontroler AVR

34

Percobaan 6

6.1.1 Rangkaian Simulasi

Gambar 6.1 Ranglaian LED Dot Matrix 5x7

6.1.2 Latihan Program

Gambar 6.2 Konfigurasi LED Dot Matrix

Page 45: Praktikum Mikrokontroler AVR

35

Program 6.1 Menampilkan 1 Karakter pada LED Dot Matrix 5x7

/* Project Name : Led_Matrik_01 */ #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 46: Praktikum Mikrokontroler AVR

36

Percobaan 6

_____halaman ini sengaja dikosongkan_____

Page 47: Praktikum Mikrokontroler AVR

37

Percobaan 7 APLIKASI LCD DISPLAY 16X2

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

7.1.1 Rangkaian Simulasi

Gambar 7.1 Rangkaian Aplikasi LCD Display 16x2

Page 48: Praktikum Mikrokontroler AVR

38

Percobaan 7

7.1.2 Latihan Program

Gambar 7.2 Konfigurasi LCD Display 16x2

Program 7.1 LCD_01

/* Project Name : LCD_01 */ #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) {

Page 49: Praktikum Mikrokontroler AVR

39

// Place your code here lcd_gotoxy(0,0); lcd_putsf("Sensor"); lcd_gotoxy(0,1); sprintf(buf, "Data = %d",temp); lcd_puts(buf); }; }

Program 7.2 LCD_02

/* Project Name : LCD_02 */ #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; }; } Program 7.3 LCD_03

/* Project Name : LCD_03 */ #include <mega8535.h> #asm .equ __lcd_port=0x15 ;PORTC

Page 50: Praktikum Mikrokontroler AVR

40

Percobaan 7

#endasm #include <lcd.h> #include <stdio.h> #include <delay.h> char temp[33]=("*Selamat Datang* "); //spasi 16 kali int z,a,x; void main(void) { lcd_init(16); while (1) { for(z=17;z>=0;z--) { lcd_gotoxy(z,0); lcd_puts(temp); lcd_gotoxy(0,1); lcd_putsf(" ");

//spasi 16 kali delay_ms(500); } for(x=0;x<17;x++) { lcd_gotoxy(0,0); for(a=x;a<17;a++) { lcd_putchar(temp[a]); } delay_ms(500); } lcd_clear(); }; }

Page 51: Praktikum Mikrokontroler AVR

41

Percobaan 8 APLIKASI TOMBOL/SWITCH

8.1 Pendahuluan 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 8.1 berikut.

Gambar 8.1 Macam-Macam Tombol

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.

Page 52: Praktikum Mikrokontroler AVR

42

Percobaan 8

8.2 Aplikasi Tombol dan LED

8.2.1 Rangkaian Simulasi

Gambar 8.2 Aplikasi Tombol Push Button dan LED

8.2.2 Latihan Program

Gambar 8.3 Konfigurasi Tombol

Page 53: Praktikum Mikrokontroler AVR

43

Program 8.1 Tombol_01

/* Project Name : Tombol_01 */ #include <mega8535.h> void main(void) { PORTA=0x00; DDRA=0xFF; PORTB=0xFF; DDRB=0x00; while (1) { // Place your code here PORTA=PINB; }; }

8.3 Aplikasi Tombol dan 7 Segment

8.3.1 Rangkaian Simulasi

Gambar 8.4 Rangkaian Tombol dan Seven Segment

Page 54: Praktikum Mikrokontroler AVR

44

Percobaan 8

Program 8.2 Tombol_02

/* Project Name : Tombol_02 */ #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; }; }

Page 55: Praktikum Mikrokontroler AVR

45

Percobaan 9 APLIKASI TOMBOL MATRIX

9.1 Pendahuluan 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 Skema Rangkaian Tombol Matrix 4x4

Page 56: Praktikum Mikrokontroler AVR

46

Percobaan 9

9.2 Rangkaian Simulasi

Gambar 9.2 Rangkaian Tombol Matrix To LCD Display

Page 57: Praktikum Mikrokontroler AVR

47

9.3 Latihan Program

Gambar 9.3 Konfigurasi Keypad dan LCD

Program 9.1 Keypad_01

/* Project Name : Keypad_01 */ #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;}

Page 58: Praktikum Mikrokontroler AVR

48

Percobaan 9

//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================= 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(); }; }

Page 59: Praktikum Mikrokontroler AVR

49

Program 9.2 Keypad_02

/* Project Name : Keypad_02 */ #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================== PORTD = 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================= PORTD = 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================= PORTD = 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;} //Kolom 4================= PORTD = 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; }

Page 60: Praktikum Mikrokontroler AVR

50

Percobaan 9

void main(void) { PORTD=0xF0; DDRD=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)

Page 61: Praktikum Mikrokontroler AVR

51

{ op=4; //Bagi sprintf(buff,"/ "); lcd_puts(buff); 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);

Page 62: Praktikum Mikrokontroler AVR

52

Percobaan 9

step = 4; } step = 4; } if(step == 4) { key=keypad(); if(key == 14) { lcd_clear(); step = 0; } else step=4; } }; }

Page 63: Praktikum Mikrokontroler AVR

53

Percobaan 10 ANALOG DIGITAL CONVERTER

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

10.2 Aplikasi ADC dan LCD

10.2.1 Rangkaian Simulasi

Gambar 10.1 Rangkaian Aplikasi ADC to LCD Display

Page 64: Praktikum Mikrokontroler AVR

54

Percobaan 10

10.2.2 Latihan Program

Gambar 10.2 Konfigurasi ADC dan LCD

Program 10.1 ADC_01

/* Project Name : ADC_01 */ #include <mega8535.h> #include <stdio.h> // Alphanumeric LCD Module functions

Page 65: Praktikum Mikrokontroler AVR

55

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

Page 66: Praktikum Mikrokontroler AVR

56

Percobaan 10

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

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

Page 67: Praktikum Mikrokontroler AVR

57

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

Page 68: Praktikum Mikrokontroler AVR

58

Percobaan 10

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

Page 69: Praktikum Mikrokontroler AVR

59

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 70: Praktikum Mikrokontroler AVR

60

Percobaan 10

_____halaman ini sengaja dikosongkan_____

Page 71: Praktikum Mikrokontroler AVR

61

Percobaan 11 PULSE WIDTH MODULATION

(PWM)

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

11.2 Aplikasi PWM, LCD dan Motor DC Pada aplikasi ini nilai PWM ditampilkan ke LCD dan dikeluarkan melalui PORTB.3 untuk mengatur kecepatan motor DC.

11.2.1 Rangkaian Simulasi

Gambar 11.1 Rangkaian Aplikasi PWM dan Motor DC

Page 72: Praktikum Mikrokontroler AVR

62

Percobaan 11

11.2.2 Latihan Program Program 11.1 PWM_01

/* Project Name : PWM_01 */ #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 73: Praktikum Mikrokontroler AVR

63

11.3 Aplikasi ADC 1 Channel ke PWM Pada aplikasi ini kita menggunakan ADC sebagai pengatur lebar pulsa PWM dan tampilan LCD sebagai penampil besarnya nilai PWM yang dihasilkan. Pada osiloskop virtual menampilkan lebarnya sinyal PWM yang berubah-ubah sesuai dengan perubahan data/nilai dari ADC. Semangkin tinggi nilai ADC yang terbaca oleh mikrokontroler maka semangkin besar lebar pulsa yang di tampilkan, begitu pula sebaliknya. Data PWM ini dapat juga digunakan sebagai pengatur kecepatan motor DC sebagaimana di tunjukan pada aplikasi sebelumnya.

11.3.1 Rangkaian Simulasi

Gambar 11.2 Rangkaian Aplikasi ADC, LCD Display dan PWM

Page 74: Praktikum Mikrokontroler AVR

64

Percobaan 11

11.3.2 Latihan Program

Gambar 11.3 Konfigurasi untuk PWM, ADC dan LCD

Page 75: Praktikum Mikrokontroler AVR

65

Program 11.2 PWM_02

/* Project Name : PWM_02 */ #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 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

Page 76: Praktikum Mikrokontroler AVR

66

Percobaan 11

// 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; // 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 //keluarkan data ADC ke PORTD.5 sebagai PWM

OCR1A = read_adc(0);

Page 77: Praktikum Mikrokontroler AVR

67

lcd_gotoxy(0,0); sprintf(temp,"Nilai PWM = %d ", OCR1A); lcd_puts(temp); delay_ms(100); }; }

11.4 Aplikasi ADC 2 Channel ke PWM

11.4.1 Rangkaian Simulasi

Gambar 11.4 Aplikasi ADC to LCD Display

11.4.2 Latihan Program Program 11.3 PWM_03

/* Project Name : PWM_03 */ #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

Page 78: Praktikum Mikrokontroler AVR

68

Percobaan 11

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

Page 79: Praktikum Mikrokontroler AVR

69

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

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

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 80: Praktikum Mikrokontroler AVR

70

Percobaan 11

_____halaman ini sengaja dikosongkan_____

Page 81: Praktikum Mikrokontroler AVR

71

Percobaan 12 APLIKASI TIMER

12.1 Pendahuluan Timer pada mikrokontroler sangat penting bagi pengguna terutama untuk aplikasi berbasis waktu seperti stopwatch, jam digital, timer countdown dan lainnya. Hampir semua mikrokontroler memasang fitur timer ini sebagai salah satu fitur utama karena banyaknya aplikasi yang memanfaatkan fitur timer. Bahkan dalam sebuah mikrokontroler ditanamkan lebih dari satu buah fitur timer untuk memenuhi berbagai kebutuhan pengguna. Dalam percobaan kali ini kita akan mempelajari cara menggunakan fitur timer pada beberapa mode yang sering digunakan.

12.2 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

Page 82: Praktikum Mikrokontroler AVR

72

Percobaan 12

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

12.2.1 Rangkaian Simulasi

Gambar 12.1 Rangkaian Simulasi Timer

12.2.2 Latihan Program 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)

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:

Page 83: Praktikum Mikrokontroler AVR

73

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.

Program 12.1 Timer0 Mode Normal

/* Project Name : Timer_01 */ #include <mega8535.h> #include <stdlib.h> #asm .equ __lcd_port=0×15 ;PORTC #endasm #include <lcd.h>

Page 84: Praktikum Mikrokontroler AVR

74

Percobaan 12

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 85: Praktikum Mikrokontroler AVR

75

{ 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:

Page 86: Praktikum Mikrokontroler AVR

76

Percobaan 12

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:

Program 12.2 Timer0 Mode Normal

/* Project Name : Timer_02 */ #include <mega16.h> #include <stdlib.h> #asm .equ __lcd_port=0×15 ;PORTC

Page 87: Praktikum Mikrokontroler AVR

77

#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) { 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; // 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 – PCR*”); itoa(data,temp); //menampilkan di LCD lcd_gotoxy(0,1); lcd_puts(temp); }; }

Page 88: Praktikum Mikrokontroler AVR

78

Percobaan 12

12.3 Mode CTC (Clear Timer on Compare Match)

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 Timer adalah sebagai berikut:

Frek = Fosc/N.(1+OCR0)

Dimana:

Fosc = frekuensi clock kristal → pada aplikasi ini saya gunakan kristal 4 MHz

OCR0 = Register Timer0 ( 0 – 255 ) N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)

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.

Dengan menggunakan Timer0, untuk aplikasi seperti diatas, sebenarnya timer0 ini tidak dapat menghasilkan periode timer sama dengan 1 detik, ini dikarenakan keterbatasan jumlah bit yaitu hanya 8 bit (256) saja. Tetapi kita masih dapat memanupulasi program agar dapat menghasilkan timer persis 1 detik, caranya dengan membuat pengulangan sebanyak beberapa kali sehinggan hasilnya mendekati 1 detik.

Untuk langkah awal, kita harus melakukan perhitungan menggunakan rumus yang diatas seperti berikut.

Frek = Fosc/N.(1+OCR0)

Frek = 4000000 / N.(1+OCR0) pilih nilai N paling besar yaitu 1024

Frek = 4000000 / 1024 . (1+255)

Frek = 15 pembulatan dari 15,2xxxx

Frek = 15Hz

Page 89: Praktikum Mikrokontroler AVR

79

Dari hasil perhitungan diatas, frekuensi terendah yang berhasil diperoleh dari perhitungan hardware adalah 15Hz. Hasil ini belum sesuai dengan yang kita inginkan yaitu 1Hz. Untuk mendapatkan nilai frekuensi sebesar 1Hz dibutuhkan pembagi 15 atau kita dapat melakukan pengulangan sebanyak 15 kali yang harus dilakukan secara software. Sekarang kita dapat melanjutkan ketahap berikutnya yaitu menggunakan program.

12.3.1 Rangkaian Simulasi

Gambar 12.4 Rangkaian Simulasi Timer Mode CTC

Page 90: Praktikum Mikrokontroler AVR

80

Percobaan 12

12.3.2 Latihan Program Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:

Gambar 12.5 Konfigurasi CodeWizardAVR Timer0

Berikut adalah listing program lengkapnya:

Program 12.3 Timer 0 Mode CTC

/* Project Name : Timer_02 */ /************************************************* Chip type : ATmega8535 AVR Core Clock frequency : 4,000000 MHz **************************************************/ #include <mega8535.h> #include <stdio.h>

ff

Page 91: Praktikum Mikrokontroler AVR

81

// Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> int i,z; char temp[33]; // Timer 0 output compare interrupt service routine interrupt [TIM0_COMP] void timer0_comp_isr(void) { // Place your code here ++i; if(i>=15) // melakukan pengulangan sebanyak 15x menggunakan interupsi Timer0 untukmendapatkan 1 detik { i=0; //kembalikan nilai i=0 ++z; // 1 detik LED menyala, 1 detik LED mati PORTA ^= (1<<0); if(z==100) z=0; lcd_gotoxy(0,0); sprintf(temp,"Detik = %2d ", z); lcd_puts(temp); } } // 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=Out // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x01; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

Page 92: Praktikum Mikrokontroler AVR

82

Percobaan 12

// 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: 3,906 kHz // Mode: CTC top=OCR0 // OC0 output: Disconnected TCCR0=0x0D; TCNT0=0x00; OCR0=0xFF; // 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;

Page 93: Praktikum Mikrokontroler AVR

83

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=0x02; // 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) { // Place your code here }; }

Page 94: Praktikum Mikrokontroler AVR

84

Percobaan 12

_____halaman ini sengaja dikosongkan_____

Page 95: Praktikum Mikrokontroler AVR

85

Percobaan 13 APLIKASI

COUNTER/PENGHITUNG

13.1 Pendahuluan Aplikasi penghitung merupakan salah satu aplikasi yang cukup sering digunakan pengguna seperti sistem pelayanan masyarakat seperti pada bank, kantor pos, rumah sakit dan lain-lain. Untuk aplikasi ini kita dapat menggunakan beberapa fitur dari mikrokontroler.

13.2 Menggunakan Timer/Counter0 Counter juga merupakan salah satu fitur pada mikrokontroler yang selalu ditanamkan ke mikrokontroler. Karena rangkaiannya yang mirip timer, rangkaian counter sering di multipleks dengan timer. Hal ini menyebabkan jika salah satu fitur digunakan maka fitur lainnya tidak bisa digunakan lagi.

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.

13.2.1 Rangkaian Simulasi

Gambar 13.1 Rangkaian Simulasi Counter

Page 96: Praktikum Mikrokontroler AVR

86

Percobaan 13

13.2.2 Latihan Program 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 97: Praktikum Mikrokontroler AVR

87

Berikut adalah listing program lengkap:

Program 13.1 Counter 01

/* Project Name : Counter_01 */ #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);

Page 98: Praktikum Mikrokontroler AVR

88

Percobaan 13

lcd_puts(temp); }; }

13.3 Menggunakan Fitur Interups0 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.

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.

Rangkaian Simulasi

Gambar 13.3 Rangkaian Simulasi Interupsi0 (INT0)

Page 99: Praktikum Mikrokontroler AVR

89

13.3.2 Latihan Program Berikut adalah setting pada CodeVision CodeWizard AVR:

Gambar 13.4 Configurasi CodeWizardAVR INT0

Berikut adalah listing program lengkap:

Program 13.2 Counter menggunakan INT0

/* Project Name : Counter_02 */ #include <mega8535.h> #include <delay.h> #include <stdio.h>

Page 100: Praktikum Mikrokontroler AVR

90

Percobaan 13

// 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 101: Praktikum Mikrokontroler AVR

91

Percobaan 14 APLIKASI KOMUNIKASI SERIAL

14.1 Pendahuluan 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 :

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.

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.

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.

Pada mode 3 identik dengan mode 2, hanya saja Baud ratenya variabel tergantung nilai yang terdapat pada register dari timer 1 dan timer 2.

Page 102: Praktikum Mikrokontroler AVR

92

Percobaan 14

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.

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 pemrograman serial pada 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 ter-set secara hardware sedangkan TI di-set 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.

Page 103: Praktikum Mikrokontroler AVR

93

Gambar 14.1 Sistem Komunikasi serial PC dengan AVR

Gambar 14.2 Kabel komunikasi Serial Null Modem (cross)

Gambar 14.3 Jendela Terminal Setting

Modul AVR min Sys

PC with serial port (COM)

COM 1 DB-9 female

1

2

3

4

1

2

3

4

female male

PC side AVR Min. Sys. side

Page 104: Praktikum Mikrokontroler AVR

94

Percobaan 14

Gambar 14.4 Menu Tools terminal

Gambar 14.5 Menjalankan window terminal di Code Vision AVR

Gambar 14.6 Terminal Program

Page 105: Praktikum Mikrokontroler AVR

95

14.1.2 Rangkaian Simulasi

Gambar 14.7 Rangkaian Simulasi Komunikasi Serial

14.1.3 Latihan Program Klik dua kali pada komponen COMPIM, lalu atur seperti gambar berikut.

Gambar 14.8 Tampilan konfigurasi komponen COMPIM

Setelah selesai klik OK.

Page 106: Praktikum Mikrokontroler AVR

96

Percobaan 14

Gambar 14.9 Setting komunikasi Serial pada CodeVision AVR

Program 14.1 Serial_01

/* Project Name : Serial_01 */ #include <mega8535.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’); } }

Page 107: Praktikum Mikrokontroler AVR

97

Program 14.2 Serial_02

/* Project Name : Serial_02 */ #include <mega8535.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); } } Program 14.3 Serial_03 /* Project Name : Serial_03 */ #include <mega8535.h> #include <stdio.h> #include <delay.h> void main(void) { // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x08; UCSRC=0x86;

Page 108: Praktikum Mikrokontroler AVR

98

Percobaan 14

UBRRH=0x00; UBRRL=0x19; while (1) { // Place your code here printf("Selamat"); delay_ms(1000); }; } Program 14.4 Serial_04

/* Project Name : Serial_04 */ #include <mega8535.h> #include <stdio.h> #include <delay.h> int i=0; void main(void) { // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x08; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; while (1) { i++; printf("Data = %4i ", i ); delay_ms(1000); }; }

Page 109: Praktikum Mikrokontroler AVR

99

Percobaan 15 REAL TIME CLOCK (RTC)

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

Gambar 15.1 IC RTC DS1307

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 110: Praktikum Mikrokontroler AVR

100

Percobaan 15

Untuk membaca data tangal dan waktu yg tersimpan di memori RTC Ds1307 dapat dilakukan melalui komunikasi serial I2C spt tampak pada gambar berikut:

Gambar 15.2 Hubungan Rangkaian RTC DS1307 dan AVR

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.

Gambar 15.3 Peta Alamat RTC DS1307

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 111: Praktikum Mikrokontroler AVR

101

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.

15.1.2 Rangkaian Simulasi

Gambar 15.4 Rangkaian RTC DS1307

15.1.3 Latihan Program Codevision sudah menyediakan fungsi-fungsi khusus untuk mengakses data DS1307 jadi kita tinggal menggunakanya. Apalagi dengan fasilitas codewizard pemrograman RTC menjadi mudah.

Gambar 15.5 Setting Codewizard DS1307

Page 112: Praktikum Mikrokontroler AVR

102

Percobaan 15

Program 15.1 RTC_01

/* Project Name : RTC_01 */ #include <mega8535.h> #include <stdio.h> // I2C Bus functions #asm .equ __i2c_port=0x18 ;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=0x15 ;PORTC #endasm #include <lcd.h> // Declare your global variables here char tampungLCD[33]; unsigned char hour; unsigned char min; unsigned char sec; unsigned char hari, day[16]; void main(void) { // 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); rtc_set_time(8,0,0); while (1) { // Place your code here rtc_get_time(&hour,&min,&sec); hari=rtc_read(0x03);

Page 113: Praktikum Mikrokontroler AVR

103

lcd_gotoxy(0,0); if (hari==1) lcd_putsf("Minggu"); else if (hari==2) lcd_putsf("Senin"); else if (hari==3) lcd_putsf("Selasa "); else if (hari==4) lcd_putsf("Rabu"); else if (hari==5) lcd_putsf("Kamis"); else if (hari==6) lcd_putsf("Jum'at"); else if (hari==7) lcd_putsf("Sabtu"); sprintf(tampungLCD,",%d:%d:%d ",hour,min,sec); lcd_puts(tampungLCD); }; }