PRAKTIKUM MIKROKONTROLER AVR
Disusun oleh : Tianur
Pekanbaru 2014
PRAKTIKUM MIKROKONTROLER AVR
Disusun oleh : Tianur
Pekanbaru 2014 i
_____halaman ini sengaja dikosongkan_____
ii
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.
iii
Terima kasih Untuk Istriku, Isniarni
Anak-anakku, Hafizh Ihsan Ramadhan dan Hazim Ihsan Muntasir
iv
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 v
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
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
viii
_____halaman ini sengaja dikosongkan_____
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 langkahlangkah 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
1
2
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.
Percobaan 1
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.
4
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
Percobaan 1
Program CodeVisionAVR yang terkonfigurasi
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.
6
_____halaman ini sengaja dikosongkan_____
Percobaan 1
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 :
7
8
2
3
Gambar 2.1
Tampilan Program ISIS
Keterangan : 1. 2. 3.
Editing Window. Overview Window. 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.
Percobaan 2
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 simulasisimulasi 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
10
Jalankan program ISIS dan buka lembar baru. Tampak seperti gambar 2.3 berikut.
Component Mode
Terminal Mode
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
Percobaan 2
Tombol Pick Devices
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.
12
Gambar 2.7
Posisi komponen
Ambil simbol power pada Terminal Mode letakkan pada lembar kerja.
Gambar 2.8
seperti pada gambar 2.8 lalu
Posisi komponen
Hubungkan jalur pada masing-masing komponen sesuai gambar rangkaian sehingga tampak seperti gambar 2.9.
Percobaan 2
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
14
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.
Percobaan 2
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)
15
16
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
Percobaan 3
Konfigurasi CodeWizardAVR untuk LED
17
Program 3.1
LED_01
/ * Pr oj ect Name : LED_01 */ #i ncl ude #i ncl ude voi d mai n( voi d) { PORTA=0xFF; DDRA=0xFF; Whi l e ( 1) { PORTA<<=1; Del ay_ms( 500) ; } } Program 3.2
LED_02
/ * Pr oj ect Name : LED_02 */ #i ncl ude #i ncl ude I nt a=0; voi d mai n( voi d) { PORTA=0xFF; DDRA=0xFF; Whi l e ( 1) { ++a; I f ( a==9) a=1; I f ( a==1) PORTA=0xFE; I f ( a==2) PORTA=0xFD; I f ( a==3) PORTA=0xFB; I f ( a==4) PORTA=0xF7; I f ( a==5) PORTA=0xEF; I f ( a==6) PORTA=0xDF; I f ( a==7) PORTA=0xBF; I f ( a==8) PORTA=0x7F; Del ay_ms( 500) ; PORTA=0xFF; } }
18
_____halaman ini sengaja dikosongkan_____
Percobaan 3
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 19
20
4.2.2 Latihan Program Buatlah program baru dengan CodeWizardAVR seperti konfigurasi berikut, kemudian edit program seperti pada gambar.
Gambar 4.2 Program 4.1
Konfigurasi CodeWizardAVR untuk 7 Segment
7 Segment_01
/ * Pr oj ect Name : 7segment _01 */ #i ncl ude #i ncl ude voi d mai n( voi d) { PORTA=0xFF; DDRA=0xFF; Whi l e ( 1) { PORTA=0x40; Del ay_ms( 500) ; PORTA=0x79; Del ay_ms( 500) ; PORTA=0x24; Del ay_ms( 500) ; PORTA=0x30; Del ay_ms( 500) ; PORTA=0x19; Del ay_ms( 500) ; PORTA=0x12; Del ay_ms( 500) ; PORTA=0x02; Percobaan 4
21
Del ay_ms( 500) ; PORTA=0x78; Del ay_ms( 500) ; PORTA=0x00; Del ay_ms( 500) ; PORTA=0x10; Del ay_ms( 500) ; } } Program 4.2
7 Segment_02
/ * Pr oj ect Name : 7segment _02 */ #i ncl ude whi l e ( 1) #i ncl ude { PORTA=0x40; voi d sat uan( ) sat uan( ) ; { PORTA=0x79; PORTC=0x40; sat uan( ) ; del ay_ms( 500) ; PORTA=0x24; PORTC=0x79; sat uan( ) ; del ay_ms( 500) ; PORTA=0x30; PORTC=0x24; sat uan( ) ; del ay_ms( 500) ; PORTA=0x19; PORTC=0x30; sat uan( ) ; del ay_ms( 500) ; PORTA=0x12; PORTC=0x19; sat uan( ) ; del ay_ms( 500) ; PORTA=0x02; PORTC=0x12; sat uan( ) ; del ay_ms( 500) ; PORTA=0x78; PORTC=0x02; sat uan( ) ; del ay_ms( 500) ; PORTA=0x00; PORTC=0x78; sat uan( ) ; del ay_ms( 500) ; PORTA=0x10; PORTC=0x00; sat uan( ) ; del ay_ms( 500) ; }; PORTC=0x10; del ay_ms( 500) ; } voi d mai n( voi d) { PORTA=0x00; DDRA=0xFF; PORTC=0x00; DDRC=0xFF;
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
Tahap 1
PORTA =0x43;
MSB
0100 | 0011
data
0000 | 0011
di
0101 | 0011
sekarang
/ terakhir Tahap 2
PORTA&=0x03; dengan data (0000 | 0011)
Tahap 3
PORTA|=0x50; dengan data (0101 | 0000)
22
AND -kan
di OR –kan
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
24
Program 4.3
7 Segment_03
/ * Pr oj ect Name : 7segment _03 */ #i ncl ude #i ncl ude voi d mai n( voi d) { PORTA=0x00; DDRA=0xFF; whi l e ( 1) { PORTA=0x0; del ay_ms( 500) ; PORTA=0x1; del ay_ms( 500) ; PORTA=0x2; del ay_ms( 500) ; PORTA=0x3; del ay_ms( 500) ; PORTA=0x4; del ay_ms( 500) ; PORTA=0x5; del ay_ms( 500) ; PORTA=0x6; del ay_ms( 500) ; PORTA=0x7; del ay_ms( 500) ; PORTA=0x8; del ay_ms( 500) ; PORTA=0x9; del ay_ms( 500) ; }; } Program 4.4
7 Segment_04
/ * Pr oj ect Name : 7segment _04 */ #i ncl ude #i ncl ude voi d sat uan( ) { PORTA&=0x0F; PORTA | =0x00; del ay_ms( 500) ; PORTA&=0x0F; PORTA | =0x10; del ay_ms( 500) ; Percobaan 4
PORTA&=0x0F; PORTA | =0x20; del ay_ms( 500) ; PORTA&=0x0F; PORTA | =0x30; del ay_ms( 500) ; PORTA&=0x0F; PORTA | =0x40; del ay_ms( 500) ;
25
PORTA&=0x0F; PORTA | =0x50; del ay_ms( 500) ; PORTA&=0x0F; PORTA | =0x60; del ay_ms( 500) ; PORTA&=0x0F; PORTA | =0x70; del ay_ms( 500) ; PORTA&=0x0F; PORTA | =0x80; del ay_ms( 500) ; PORTA&=0x0F; PORTA | =0x90; del ay_ms( 500) ; } voi d mai n( voi d) { PORTA=0x00; DDRA=0xFF; whi l e ( 1) { PORTA&=0xF0; PORTA| =0x00; sat uan( ) ; PORTA&=0xF0; PORTA| =0x01; sat uan( ) ;
PORTA&=0xF0; PORTA| =0x02; sat uan( ) ; PORTA&=0xF0; PORTA| =0x03; sat uan( ) ; PORTA&=0xF0; PORTA| =0x04; sat uan( ) ; PORTA&=0xF0; PORTA| =0x05; sat uan( ) ; PORTA&=0xF0; PORTA| =0x06; sat uan( ) ; PORTA&=0xF0; PORTA| =0x07; sat uan( ) ; PORTA&=0xF0; PORTA| =0x08; sat uan( ) ; PORTA&=0xF0; PORTA| =0x09; sat uan( ) ; }; }
26
_____halaman ini sengaja dikosongkan_____
Percobaan 4
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.
27
28
Gambar 5.2 Program 5.1
Konfigurasi 7 Segment Multiplex
7 segment_05
/ * Pr oj ect Name : 7segment _05 */ #i ncl ude #i ncl ude voi d mai n( voi d) { PORTA=0xFF; DDRA=0xFF; PORTC=0x00; DDRC=0xFF; whi l e ( 1) { Percobaan 5
29
PORTC=0x40; del ay_ms( 500) ; PORTC=0x79; del ay_ms( 500) ; PORTC=0x24; del ay_ms( 500) ; PORTC=0x30; del ay_ms( 500) ; PORTC=0x19; del ay_ms( 500) ; PORTC=0x12; del ay_ms( 500) ; PORTC=0x02; del ay_ms( 500) ; PORTC=0x78; del ay_ms( 500) ; PORTC=0x00; del ay_ms( 500) ; PORTC=0x10; del ay_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.
30
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
/ * Pr oj ect Name : 7segment _06 */ #i ncl ude #i ncl ude voi d mai n( voi d) { PORTA=0x00; DDRA=0xFF; PORTC=0x00; DDRC=0xFF; whi l e ( 1) { PORTC=0x0; del ay_ms( 500) ; PORTC=0x1; del ay_ms( 500) ; PORTC=0x2; del ay_ms( 500) ; PORTC=0x3; del ay_ms( 500) ; PORTC=0x4; del ay_ms( 500) ; PORTC=0x5; del ay_ms( 500) ; PORTC=0x6; del ay_ms( 500) ; PORTC=0x7; Percobaan 5
31
del ay_ms( 500) ; PORTC PORTC= =0x8; del ay_ms( 500) ; PORTC PORTC= =0x9; del ay_ms( 500) ; }; } Program 5.3
7 Segment Multiplex dengan Decoder
/ * Pr oj ect Name : 7segm segment _ 07 * / #include #include 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); }; }
32
_____halaman ini sengaja dikosongkan_____
Percobaan 5
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 berfungsi untuk menampilkan berbagai 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 bagian yang lain harus sebagai sebagai outpu outputt 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)
33
34
6.1.1 Rangkaian Simulasi
Gambar 6.1
Ranglaian LED Dot Matrix 5x7
6.1.2 Latihan Program
Gambar 6.2
Percobaan 6
Konfigurasi LED Dot Matrix
35
Program 6.1
Menampilkan 1 Karakter pada LED Dot Matrix 5x7
/ * Pr oj ect Name : Led_Mat r i k_01 */ #i ncl ude #i ncl ude voi d mai n( voi d) { PORTA=0x00; DDRA=0xFF; PORTC=0x00; DDRC=0xFF; whi l e ( 1) { PORTA=0x01; PORTC=0B00000011; del ay_ms( 1) ; PORTA=0x02; PORTC=0B01110101; del ay_ms( 1) ; PORTA=0x04; PORTC=0B01110110; del ay_ms( 1) ; PORTA=0x08; PORTC=0B01110101; del ay_ms( 1) ; PORTA=0x10; PORTC=0B00000011; del ay_ms( 1) ; }; }
36
_____halaman ini sengaja dikosongkan_____
Percobaan 6
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
37
38
7.1.2 Latihan Program
Gambar 7.2 Program 7.1
Konfigurasi LCD Display 16x2
LCD_01
/ * Pr oj ect Name : LCD_01 */ #i ncl ude #i ncl ude / / Al phanumer i c LCD Modul e f unct i ons #as m . equ __l cd_por t =0x15 ; PORTC #endasm #i ncl ude / / Decl ar e your gl obal var i abl es her e unsi gned i nt t emp=15; char buf [ 33] ; voi d mai n( voi d) { / / LCD modul e i ni t i al i zat i on l cd_ i ni t ( 16) ; whi l e ( 1) { Percobaan 7
39
/ / Pl ace your code her e l cd_got oxy( 0, 0) ; l cd_put sf ( "Sensor ") ; l cd_got oxy( 0, 1) ; spr i nt f ( buf , " Dat a = %d" , t emp) ; l cd_put s( buf ) ; }; } Program 7.2
LCD_02
/ * Pr oj ect Name : LCD_02 */ #i ncl ude #i ncl ude #i ncl ude / / Al phanumer i c LCD Modul e f unct i ons #as m . equ __l cd_por t =0x15 ; PORTC #endasm #i ncl ude / / Decl ar e your gl obal var i abl es her e unsi gned i nt t emp=0; char buf [ 33] ; voi d mai n( voi d) { / / LCD modul e i ni t i al i zat i on l cd_ i ni t ( 16) ; whi l e ( 1) { / / Pl ace your code her e l cd_got oxy( 0, 0) ; spr i nt f ( buf , "%d", t emp) ; l cd_put s( buf ) ; del ay_ms( 1000) ; ++t emp; }; } Program 7.3
LCD_03
/ * Pr oj ect Name : LCD_03 */ #i ncl ude #as m . equ __l cd_por t =0x15 ; PORTC
40
#endasm #i ncl ude #i ncl ude #i ncl ude char t emp[ 33] =( " *Sel amat Dat ang* / / s pas i 16 kal i i nt z, a, x; voi d mai n( voi d) { l cd_ i ni t ( 16) ; whi l e ( 1) { f or ( z=17; z>=0; z- - ) { l cd_got oxy( z, 0) ; l cd_put s( t emp) ; l cd_got oxy( 0, 1) ; l cd_ put sf ( " / / s pas i 16 kal i del ay_ms( 500) ; } f or ( x=0; x<17; x++) { l cd_got oxy( 0, 0) ; f or ( a=x; a<17; a++) { l cd_put char ( t emp[ a] ) ; } del ay_ms( 500) ; } l cd_ cl ear ( ) ; }; }
Percobaan 7
") ;
") ;
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.
41
42
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
Percobaan 8
Konfigurasi Tombol
43
Program 8.1
Tombol_01
/ * Pr oj ect Name : Tombol _01 */ #include 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
44
Program 8.2
Tombol_02
/ * Pr oj ect Name : Tombol _02 */ #include 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; }; }
Percobaan 8
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
45
46
9.2 Rangkaian Simulasi
Gambar 9.2
Percobaan 9
Rangkaian Tombol Matrix To LCD Display
47
9.3 Latihan Program
Gambar 9.3 Program 9.1
Konfigurasi Keypad dan LCD
Keypad_01
/ * Pr oj ect Name : Keypad_01 */ #i ncl ude #i ncl ude #i ncl ude / / Al phanumer i c LCD Modul e f unct i ons #as m . equ __l cd_por t =0x15 ; PORTC #endasm #i ncl ude / / Decl ar e your gl obal var i abl es her e i nt key; char buf f [ 33] ; unsi gned char keypad( ) { / / Kol om 1================== PORTD = 0b11110111; i f ( PI ND. 7==0) {key=10; got o r un; } i f ( PI ND. 6==0) {key=15; got o r un; } i f ( PI ND. 5==0) {key=0; got o r un; } i f ( PI ND. 4==0) {key=14; got o r un; }
48
/ / Kol om 2================= PORTD = 0b11111011; i f ( PI ND. 7==0) {key=13; got o r un; } i f ( PI ND. 6==0) {key=9; got o r un; } i f ( PI ND. 5==0) {key=8; got o r un; } i f ( PI ND. 4==0) {key=7; got o r un; } / / Kol om 3================= PORTD = 0b11111101; i f ( PI ND. 7==0) {key=12; got o r un; } i f ( PI ND. 6==0) {key=6; got o r un; } i f ( PI ND. 5==0) {key=5; got o r un; } i f ( PI ND. 4==0) {key=4; got o r un; } / / Kol om 4================= PORTD = 0b11111110; i f ( PI ND. 7==0) {key=11; got o r un; } i f ( PI ND. 6==0) {key=3; got o r un; } i f ( PI ND. 5==0) {key=2; got o r un; } i f ( PI ND. 4==0) {key=1; got o r un; } r un: r et ur n key; } voi d mai n( voi d) { PORTD=0xF0; DDRD=0x0F; / / LCD modul e i ni t i al i zat i on l cd_ i ni t ( 16) ; whi l e ( 1) { / / Pl ace your code her e awal : l cd_got oxy( 0, 0) ; l cd_put sf ( " Tekan Sembar ang " ) ; s et : key=keypad( ) ; l cd_got oxy( 0, 1) ; spr i nt f ( buf f , "%d ", key) ; l cd_ put s ( buf f ) ; del ay_ms( 5) ; / / key=keypad( ) ; }; }
Percobaan 9
49
Program 9.2
Keypad_02
/ * Pr oj ect Name : Keypad_02 */ #include #include #include // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include // 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;} if(PINB.6==0) {key=15; goto run;} Enter if(PINB.5==0) {key=0; goto run;} if(PINB.4==0) {key=14; goto run;} //Kolom 2================= PORTD = 0b11111011; if(PINB.7==0) {key=13; goto run;} 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;} 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;} 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; }
//tambah //sama dengan =
//ON = Cancel
//kurang
//kali
//bagi
50
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) Percobaan 9
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);
52
step = 4; } step = 4; } if(step == 4) { key=keypad(); if(key == 14) { lcd_clear(); step = 0; } else step=4; } }; }
Percobaan 9
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
53
54
10.2.2 Latihan Program
Gambar 10.2 Program 10.1
Konfigurasi ADC dan LCD
ADC_01
/ * Pr oj ect Name : ADC_01 */ #i ncl ude #i ncl ude / / Al phanumer i c LCD Modul e f unct i ons Percobaan 10
55
#as m . equ __l cd_por t =0x15 ; PORTC #endasm #i ncl ude #i ncl ude #def i ne ADC_VREF_ TYPE 0x60 / / Read t he 8 most si gni f i cant bi t s / / of t he AD conver si on r esul t unsi gned char r ead_adc( unsi gned char adc_ i nput ) { ADMUX=adc_i nput | ( ADC_VREF_TYPE & 0xf f ) ; / / Del ay needed f or t he st abi l i zat i on of t he ADC i nput vol t age del ay_us( 10) ; / / St ar t t he AD conver si on ADCSRA| =0x40; / / Wai t f or t he AD conver si on t o compl et e whi l e ( ( ADCSRA & 0x10) ==0) ; ADCSRA| =0x10; r et ur n ADCH; } / / Decl ar e your gl obal var i abl es her e unsi gned char t emp[ 30] ; voi d mai n( voi d) { / / Decl ar e your l ocal var i abl es her e / / ADC i ni t i al i z at i on / / ADC Cl ock f r equency: 1000. 000 kHz / / ADC Vol t age Ref er ence: AVCC pi n / / ADC Hi gh Speed Mode: Of f / / ADC Aut o Tr i gger Sour ce: None / / Onl y t he 8 most si gni f i cant bi t s of / / t he AD conver si on r esul t ar e used ADMUX=ADC_VREF_ TYPE & 0xf f ; ADCSRA=0x83; SFI OR&=0xEF; / / LCD modul e i ni t i al i zat i on l cd_ i ni t ( 16) ; whi l e ( 1) {
56
/ / Pl ace your code l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a l cd_put s( t emp) ; del ay_ms( 1000) ; l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a l cd_put s( t emp) ; del ay_ms( 1000) ; l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a l cd_put s( t emp) ; del ay_ms( 1000) ; l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a l cd_put s( t emp) ; del ay_ms( 1000) ; l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a l cd_put s( t emp) ; del ay_ms( 1000) ; l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a l cd_put s( t emp) ; del ay_ms( 1000) ; l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a l cd_put s( t emp) ; del ay_ms( 1000) ; l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a l cd_put s( t emp) ; del ay_ms( 1000) ; };
her e ADC0 = %d
" , r ead_adc( 0) ) ;
ADC1 = %d
" , r ead_adc( 1) ) ;
ADC2 = %d
" , r ead_adc( 2) ) ;
ADC3 = %d
" , r ead_adc( 3) ) ;
ADC4 = %d
" , r ead_adc( 4) ) ;
ADC5 = %d
" , r ead_adc( 5) ) ;
ADC6 = %d
" , r ead_adc( 6) ) ;
ADC7 = %d
" , r ead_adc( 7) ) ;
} Program 10.2
ADC_02
/ * Pr oj ect Name : ADC_01 */ #i ncl ude #i ncl ude / / Al phanumer i c LCD Modul e f unct i ons #as m . equ __l cd_por t =0x15 ; PORTC #endasm #i ncl ude #i ncl ude Percobaan 10
57
#def i ne ADC_VREF_ TYPE 0x60 / / Read t he 8 most si gni f i cant bi t s / / of t he AD conver si on r esul t unsi gned char r ead_adc( unsi gned char adc_i nput ) { ADMUX=adc_i nput | ( ADC_VREF_TYPE & 0xf f ) ; / / Del ay needed f or t he st abi l i zat i on of t he ADC i nput vol t age del ay_us( 10) ; / / St ar t t he AD conver si on ADCSRA| =0x40; / / Wai t f or t he AD conver si on t o compl et e whi l e ( ( ADCSRA & 0x10) ==0) ; ADCSRA| =0x10; r et ur n ADCH; } / / Decl ar e your gl obal var i abl es her e unsi gned char t emp[ 30] ; i nt x; voi d mai n( voi d) { / / Decl ar e your l ocal var i abl es her e / / Por t B i ni t i al i zat i on // Func7=I n Func6=I n Func5=I n Func4=I n Func2=I n Func1=I n Func0=I n // St at e7=P St at e6=P St at e5=P St at e4=P St at e2=P St at e1=P St at e0=P PORTB=0xFF; DDRB=0x00; / / ADC i ni t i al i z at i on / / ADC Cl ock f r equency: 1000. 000 kHz / / ADC Vol t age Ref er ence: AVCC pi n / / ADC Hi gh Speed Mode: Of f / / ADC Aut o Tr i gger Sour ce: None / / Onl y t he 8 most si gni f i cant bi t s of / / t he AD conver si on r esul t ar e used ADMUX=ADC_VREF_ TYPE & 0xf f ; ADCSRA=0x83; SFI OR&=0xEF; / / LCD modul e i ni t i al i zat i on l cd_ i ni t ( 16) ; whi l e ( 1)
Func3=I n St at e3=P
58
{ / / Pl ace your code her e i f ( x==0) { l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a ADC0 = %d l cd_put s( t emp) ; } i f ( x==1) { l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a ADC1 = %d l cd_put s( t emp) ; } i f ( x==2) { l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a ADC2 = %d l cd_put s( t emp) ; } i f ( x==3) { l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a ADC3 = %d l cd_put s( t emp) ; } i f ( x==4) { l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a ADC4 = %d l cd_put s( t emp) ; } i f ( x==5) { l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a ADC5 = %d l cd_put s( t emp) ; } i f ( x==6) { l cd_got oxy( 0, 0) ; Percobaan 10
" , r ead_adc( 0) ) ;
" , r ead_adc( 1) ) ;
" , r ead_adc( 2) ) ;
" , r ead_adc( 3) ) ;
" , r ead_adc( 4) ) ;
" , r ead_adc( 5) ) ;
59
spr i nt f ( t emp, " Dat a ADC6 = %d l cd_put s( t emp) ; } i f ( x==7) { l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a ADC7 = %d l cd_put s( t emp) ; } i f ( PI NB. 0==0) x=0; i f ( PI NB. 1==0) x=1; i f ( PI NB. 2==0) x=2; i f ( PI NB. 3==0) x=3; i f ( PI NB. 4==0) x=4; i f ( PI NB. 5==0) x=5; i f ( PI NB. 6==0) x=6; i f ( PI NB. 7==0) x=7; }; }
" , r ead_adc( 6) ) ;
" , r ead_adc( 7) ) ;
60
_____halaman ini sengaja dikosongkan_____
Percobaan 10
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
61
62
11.2.2 Latihan Program Program 11.1
PWM_01
/ * Pr oj ect Name : PWM_01 */ #i ncl ude #i ncl ude #i ncl ude / / Al phanumer i c LCD Modul e f unct i ons #as m . equ __l cd_por t =0x15 ; PORTC #endasm #i ncl ude / / Decl ar e your gl obal var i abl es her e char t emp[ 5] ; voi d mai n( voi d) { / / Decl ar e your l ocal var i abl es her e / / Ti mer / Count er 0 i ni t i al i zat i on / / Cl ock sour ce: Syst em Cl ock / / Cl ock val ue: 3. 906 kHz / / Mode: Fast PWM t op=FFh / / OC0 out put : Non- I nver t ed PWM TCCR0=0x6D; TCNT0=0x00; OCR0=0x00; / / Anal og Compar at or i ni t i al i zat i on / / Anal og Compar at or : Of f / / Anal og Compar at or I nput Capt ur e by Ti mer / Count er 1: Of f ACSR=0x80; SFI OR=0x00; / / LCD modul e i ni t i al i zat i on l cd_ i ni t ( 16) ; whi l e ( 1) { / / Pl ace your code her e OCR0=100; l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Dat a PWM = %d l cd_put s( t emp) ; }; } Percobaan 11
" , OCR0) ;
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
64
11.3.2 Latihan Program
Gambar 11.3
Percobaan 11
Konfigurasi untuk PWM, ADC dan LCD
65
Program 11.2
PWM_02
/ * Pr oj ect Name : PWM_02 */ #include #include // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include #include #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 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; }
ADC
// Declare your global variables here unsigned char temp[10]; void main(void) { // Port D initialization // Func7=In Func6=In Func5=Out Func2=In Func1=In Func0=In // State7=T State6=T State5=0 State2=T State1=T State0=T PORTD=0x00; DDRD=0x30;
// Timer/Counter 1 initialization // Clock source: System Clock
Func4=Out
Func3=In
State4=0
State3=T
66
// 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); Percobaan 11
67
lcd_gotoxy(0,0); sprintf(temp,"Nilai PWM = %d lcd_puts(temp); delay_ms(100); };
", OCR1A);
}
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
/ * Pr oj ect Name : PWM_03 */ #i ncl ude #i ncl ude / / Al phanumer i c LCD Modul e f unct i ons #as m . equ __l cd_por t =0x15 ; PORTC #endasm #i ncl ude #i ncl ude #def i ne ADC_VREF_ TYPE 0x60
68
/ / Read t he 8 most si gni f i cant bi t s / / of t he AD conver si on r esul t unsi gned char r ead_adc( unsi gned char adc_i nput ) { ADMUX=adc_ i nput | ( ADC_VREF_TYPE & 0xf f ) ; / / Del ay needed f or t he st abi l i zat i on of t he ADC i nput vol t age del ay_us( 10) ; / / St ar t t he AD conver si on ADCSRA| =0x40; / / Wai t f or t he AD conver si on t o compl et e whi l e ( ( ADCSRA & 0x10) ==0) ; ADCSRA| =0x10; r et ur n ADCH; } / / Decl ar e your gl obal var i abl es her e unsi gned char t emp[ 30] ; voi d mai n( voi d) { / / Por t D i ni t i al i zat i on / / Func7=I n Func6=I n Func5=Out Func4=Out Func2=I n Func1=I n Func0=I n // St at e7=T St at e6=T St at e5=0 St at e4=0 St at e2=T St at e1=T St at e0=T PORTD=0x00; DDRD=0x30; / / Ti mer / Count er 1 i ni t i al i zat i on / / Cl ock sour ce: Syst em Cl ock / / Cl ock val ue: 7. 813 kHz / / Mode: Fast PWM t op=00FFh / / OC1A out put : Non- I nv. / / OC1B out put : Non- I nv. / / Noi se Cancel er : Of f / / I nput Capt ur e on Fal l i ng Edge / / Ti mer 1 Over f l ow I nt er r upt : Of f / / I nput Capt ur e I nt er r upt : Of f / / Compar e A Mat ch I nt er r upt : Of f / / Compar e B Mat ch I nt er r upt : Of f TCCR1A=0xA1; TCCR1B=0x0D; TCNT1H=0x00; TCNT1L=0x00; Percobaan 11
Func3=I n St at e3=T
69
I CR1H=0x00; I CR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; / / Anal og Compar at or i ni t i al i zat i on / / Anal og Compar at or : Of f / / Anal og Compar at or I nput Capt ur e by Ti mer / Count er 1: Of f ACSR=0x80; SFI OR=0x00; / / ADC i ni t i al i z at i on / / ADC Cl ock f r equency: 62. 500 kHz / / ADC Vol t age Ref er ence: AVCC pi n / / ADC Hi gh Speed Mode: Of f / / ADC Aut o Tr i gger Sour ce: None / / Onl y t he 8 most si gni f i cant bi t s of / / t he AD conver si on r esul t ar e used ADMUX=ADC_VREF_ TYPE & 0xf f ; ADCSRA=0x87; SFI OR&=0xEF; / / LCD modul e i ni t i al i zat i on l cd_ i ni t ( 16) ; whi l e ( 1) { / / Pl ace your code her e / / kel uar kan dat a ADC ke PORTD. 5 sebagai PWM OCR1A = r ead_adc( 0) ; l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " PWM1 = %d " , OCR1A) ; / / PWM 1 l cd_put s( t emp) ; OCR1B = r ead_adc( 1) ; l cd_got oxy( 0, 1) ; spr i nt f ( t emp, " PWM2 = %d " , OCR1B) ; / / PWM 2 l cd_put s( t emp) ; del ay_ms( 1000) ; }; }
70
_____halaman ini sengaja dikosongkan_____
Percobaan 11
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 71
72
(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:
Percobaan 12
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
/ * Pr oj ect Name : Ti mer _01 */ #i ncl ude #i ncl ude #as m . equ __l cd_por t =0×15 ; PORTC #endasm #i ncl ude
74
unsi gned char t emp[ 6] ; i nt dat a; / / Ti mer 1 over f l ow i nt er r upt ser vi ce r out i ne i nt er r upt [ TI M1_OVF] voi d t i mer 1_ovf _i sr ( voi d) { TCNT1H=0xD23A >> 8; TCNT1L=0xD23A & 0xf f ; dat a++; / / set el ah 1 det i k i ncr eament dat a } voi d mai n( voi d) { / / Ti mer / Count er 1 i ni t i al i zat i on / / Cl ock sour ce: Syst em Cl ock / / Cl ock val ue: 11. 719 kHz / / Mode: Nor mal t op=FFFFh / / OC1A out put : Di scon. / / OC1B out put : Di scon. / / Noi se Cancel er : Of f / / I nput Capt ur e on Fal l i ng Edge / / Ti mer 1 Over f l ow I nt er r upt : On / / I nput Capt ur e I nt er r upt : Of f / / Compar e A Mat ch I nt er r upt : Of f / / Compar e B Mat ch I nt er r upt : Of f TCCR1A=0×00; TCCR1B=0×05; TCNT1H=0xD2; TCNT1L=0x3A; I CR1H=0×00; I CR1L=0×00; OCR1AH=0×00; OCR1AL=0×00; OCR1BH=0×00; OCR1BL=0×00; / / Ti mer ( s ) / Count er ( s ) I nt er r upt ( s ) i ni t i al i z at i on TI MSK=0×04; / / LCD modul e i ni t i al i zat i on l cd_ i ni t ( 16) ; / / Gl obal enabl e i nt er r upt s #asm( “s ei ”) whi l e ( 1) Percobaan 12
75
{ i f ( dat a==100) { l cd_ cl ear ( ) ; dat a=0; } l cd_got oxy( 0, 0) ; l cd_put sf ( “Ti mer : ”) ; i t oa( dat a, t emp) ; / / menampi l kan di LCD l cd_got oxy( 0, 1) ; l cd_put s( t emp) ; }; } 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:
76
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
/ * Pr oj ect Name : Ti mer _02 */ #i ncl ude #i ncl ude #as m . equ __l cd_por t =0×15 ; PORTC Percobaan 12
77
#endasm #i ncl ude unsi gned char t emp[ 6] , l oop=0; i nt dat a; / / Ti mer 0 over f l ow i nt er r upt ser vi ce r out i ne i nt er r upt [ TI M0_OVF] voi d t i mer 0_ovf _i sr ( voi d) { TCNT0=0x8A; l oop++; i f ( l oop>=100) { dat a++; l oop=0; } } voi d mai n( voi d) { / / Ti mer / Count er 0 i ni t i al i zat i on / / Cl ock sour ce: Syst em Cl ock / / Cl ock val ue: 11. 719 kHz / / Mode: Nor mal t op=FFh / / OC0 out put : Di sconnect ed TCCR0=0×05; TCNT0=0x8A; OCR0=0×00; / / Ti mer ( s ) / Count er ( s ) I nt er r upt ( s ) i ni t i al i z at i on TI MSK=0×01; / / LCD modul e i ni t i al i zat i on l cd_ i ni t ( 16) ; / / Gl obal enabl e i nt er r upt s #asm( “s ei ”) whi l e ( 1) { i f ( dat a==100) { l cd_ cl ear ( ) ; dat a=0; } l cd_got oxy( 0, 0) ; l cd_put sf (“*Electro – PCR*”); i t oa( dat a, t emp) ; / / menampi l kan di LCD l cd_got oxy( 0, 1) ; l cd_put s( t emp) ; }; }
78
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
Frek = 4000000 / 1024 . (1+255) Frek = 15 pembulatan dari 15,2xxxx Frek = 15Hz
Percobaan 12
nilai N paling besar yaitu 1024
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
80
12.3.2 Latihan Program Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:
ff
Gambar 12.5
Konfigurasi CodeWizardAVR Timer0
Berikut adalah listing program lengkapnya: Program 12.3
Timer 0 Mode CTC
/ * Pr oj ect Name : Ti mer _02 */ / ************************************************* Chi p t ype : ATmega8535 AVR Cor e Cl ock f r equency : 4, 000000 MHz **************************************************/ #i ncl ude #i ncl ude Percobaan 12
81
/ / Al phanumer i c LCD Modul e f unct i ons #as m . equ __l cd_por t =0x15 ; PORTC #endasm #i ncl ude i nt i , z; char t emp[ 33] ; / / Ti mer 0 out put compar e i nt er r upt ser vi ce r out i ne i nt er r upt [ TI M0_COMP] voi d t i mer 0_comp_i sr ( voi d) { / / Pl ace your code her e ++i ; i f ( i >=15) / / mel akukan pengul angan sebanyak 15x menggunakan i nt er upsi Ti mer 0 unt ukmendapat kan 1 det i k { i =0; / / kembal i kan ni l ai i =0 ++z; / / 1 det i k LED menyal a, 1 det i k LED mat i PORTA ^= ( 1<<0) ; i f ( z==100) z=0; l cd_got oxy( 0, 0) ; spr i nt f ( t emp, " Det i k = %2d " , z) ; l cd_put s( t emp) ; } } / / Decl ar e your gl obal var i abl es her e voi d mai n( voi d) { / / Decl ar e your l ocal var i abl es her e / / I nput / Out put Por t s i ni t i al i z at i on / / Por t A i ni t i al i zat i on // Func7=I n Func6=I n Func5=I n Func4=I n Func2=I n Func1=I n Func0=Out // St at e7=T St at e6=T St at e5=T St at e4=T St at e2=T St at e1=T St at e0=T PORTA=0x00; DDRA=0x01; / / Por t B i ni t i al i zat i on // Func7=I n Func6=I n Func5=I n Func2=I n Func1=I n Func0=I n
Func4=I n
Func3=I n St at e3=T
Func3=I n
82
// St at e7=T St at e6=T St at e5=T St at e2=T St at e1=T St at e0=T PORTB=0x00; DDRB=0x00; / / Por t C i ni t i al i zat i on // Func7=I n Func6=I n Func5=I n Func2=I n Func1=I n Func0=I n // St at e7=T St at e6=T St at e5=T St at e2=T St at e1=T St at e0=T PORTC=0x00; DDRC=0x00; / / Por t D i ni t i al i zat i on // Func7=I n Func6=I n Func5=I n Func2=I n Func1=I n Func0=I n // St at e7=T St at e6=T St at e5=T St at e2=T St at e1=T St at e0=T PORTD=0x00; DDRD=0x00; / / Ti mer / Count er 0 i ni t i al i zat i on / / Cl ock sour ce: Syst em Cl ock / / Cl ock val ue: 3, 906 kHz / / Mode: CTC t op=OCR0 / / OC0 out put : Di sconnect ed TCCR0=0x0D; TCNT0=0x00; OCR0=0xFF; / / Ti mer / Count er 1 i ni t i al i zat i on / / Cl ock sour ce: Syst em Cl ock / / Cl ock val ue: Ti mer 1 St opped / / Mode: Nor mal t op=FFFFh / / OC1A out put : Di scon. / / OC1B out put : Di scon. / / Noi se Cancel er : Of f / / I nput Capt ur e on Fal l i ng Edge / / Ti mer 1 Over f l ow I nt er r upt : Of f / / I nput Capt ur e I nt er r upt : Of f / / Compar e A Mat ch I nt er r upt : Of f / / Compar e B Mat ch I nt er r upt : Of f TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; I CR1H=0x00; Percobaan 12
St at e4=T
St at e3=T
Func4=I n
Func3=I n
St at e4=T
St at e3=T
Func4=I n
Func3=I n
St at e4=T
St at e3=T
83
I CR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; / / Ti mer / Count er 2 i ni t i al i zat i on / / Cl ock sour ce: Syst em Cl ock / / Cl ock val ue: Ti mer 2 St opped / / Mode: Nor mal t op=FFh / / OC2 out put : Di sconnect ed ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; / / Ext er nal I nt er r upt ( s) i ni t i al i zat i on / / I NT0: Of f / / I NT1: Of f / / I NT2: Of f MCUCR=0x00; MCUCSR=0x00; / / Ti mer ( s ) / Count er ( s ) I nt er r upt ( s ) i ni t i al i z at i on TI MSK=0x02; / / Anal og Compar at or i ni t i al i zat i on / / Anal og Compar at or : Of f / / Anal og Compar at or I nput Capt ur e by Ti mer / Count er 1: Of f ACSR=0x80; SFI OR=0x00; / / LCD modul e i ni t i al i zat i on l cd_ i ni t ( 16) ; / / Gl obal enabl e i nt er r upt s #asm( " sei " ) whi l e ( 1) { / / Pl ace your code her e }; }
84
_____halaman ini sengaja dikosongkan_____
Percobaan 12
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
85
86
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
Percobaan 13
Configurasi CodeWizardAVR Timer0
87
Berikut adalah listing program lengkap: Program 13.1
Counter 01
/ * Pr oj ect Name : Coun ount er _01 */ #include #include #asm .equ __lcd_port=0×15 ;PORTC #endasm #include 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);
88
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 pushbutton akan di cek oleh INT0. Jika terdapat terdapat sinyal sinyal pada INT0 maka kemudian proses normal terhenti lalu proses interupsi dilakukan, setelah proses interupsi selesai, maka proses normal akan berjalan kembali melanjutkan proses sebelumny sebelumnya. a. Rangkaian Simulasi
Gambar 13.3
Percobaan 13
Rangkaian Simulasi Interupsi0 (INT0)
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
/ * Pr oj ect Name : Count er _02 */ #i ncl ude #i ncl ude #i ncl ude
90
/ / Al phanumer i c LCD Modul e f unct i ons #as m . equ __l cd_por t =0x15 ; PORTC #endasm #i ncl ude i nt i =1000, x=0; char buf f er [ 33] ; / / Ext er nal I nt er r upt 0 ser vi ce r out i ne i nt er r upt [ EXT_I NT0] voi d ext _i nt 0_i sr ( voi d) { / / Pl ace your code her e x++; l cd_got oxy( 0, 0) ; spr i nt f ( buf f er , " count er = %d ", x) ; l cd_put s( buf f er ) ; del ay_ms( 2000) ; } voi d mai n( voi d) { / / Ext er nal I nt er r upt ( s) i ni t i al i zat i on / / I NT0: On / / I NT0 Mode: Fal l i ng Edge / / I NT1: Of f / / I NT2: Of f GI CR| =0x40; MCUCR=0x02; MCUCSR=0x00; GI FR=0x40; l cd_ i ni t ( 16) ; #asm( " sei " ) whi l e ( 1) { / / Pl ace your code her e i--; l cd_got oxy( 0, 0) ; spr i nt f ( buf f er , "Hi t ung = %4d", i ) ; l cd_ put s ( buf f er ) ; i f ( i ==0) i =1000; del ay_ms( 300) ; }; } Percobaan 13
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 RS485. 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.
91
92
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. Percobaan 14
93
PC with serial port (COM)
COM 1 Gambar 14.1
DB-9 female
Sistem Komunikasi serial PC dengan AVR
male
female 1
1
2
2
3
3
PC side
Gambar 14.2
Modul AVR min Sys
AVR Min. Sys. side Kabel komunikasi Serial Null Modem (cross)
Gambar 14.3
Jendela Terminal Setting
94
Gambar 14.4
Gambar 14.5
terminal
Menjalankan window terminal di Code Vision AVR
Gambar 14.6
Percobaan 14
Menu Tools
Terminal Program
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
Setelah selesai klik OK.
Tampilan konfigurasi komponen COMPIM
96
Gambar 14.9 Program 14.1
Setting komunikasi Serial pada CodeVision AVR
Serial_01
/ * Pr oj ect Name : Ser i al _01 */ #include #include void main(void) { // USART initialization // Communication Parameters: 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’); } }
Percobaan 14
8
Data,
1
Stop,
No
97
Program 14.2
Serial_02
/ * Pr oj ect Name : Ser i al _02 */ #include #include void main(void) { // USART initialization // Communication Parameters: Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x47;
8
Data,
1
Stop,
No
8
Data,
1
Stop,
No
while (1) { putchar(‘a’); putchar(0x0d); putchar(0x0a); } }
Program 14.3
Serial_03
/ * Pr oj ect Name : Ser i al _03 */ #include #include #include void main(void) { // USART initialization // Communication Parameters: Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x08; UCSRC=0x86;
98
UBRRH=0x00; UBRRL=0x19; while (1) { // Place your code here printf("Selamat"); delay_ms(1000); }; }
Program 14.4
Serial_04
/ * Pr oj ect Name : Ser i al _04 */ #include #include #include 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); }; }
Percobaan 14
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 99
100
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). Percobaan 15
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
102
Program 15.1
RTC_01
/ * Pr oj ect Name : RTC_01 */ #i ncl ude #i ncl ude / / I 2C Bus f unct i ons #as m . equ __i 2c_ por t =0x18 ; PORTB . equ __ sda_bi t =0 . equ __scl _bi t =1 #endasm #i ncl ude / / DS1307 Real Ti me Cl ock f unct i ons #i ncl ude / / Al phanumer i c LCD Modul e f unct i ons #as m . equ __l cd_por t =0x15 ; PORTC #endasm #i ncl ude / / Decl ar e your gl obal var i abl es her e char t ampungLCD[ 33] ; unsi gned char hour ; unsi gned char mi n; unsi gned char sec; unsi gned char har i , day[ 16] ; voi d mai n( voi d) { / / I 2C Bus i ni t i al i zat i on i 2c_i ni t ( ) ; / / DS1307 Real Ti me Cl ock i ni t i al i zat i on / / Squar e wave out put on pi n SQW/ OUT: Of f / / SQW/ OUT pi n st at e: 0 r t c_i ni t ( 0, 0, 0) ; / / LCD modul e i ni t i al i zat i on l cd_ i ni t ( 16) ; r t c_set _t i me( 8, 0, 0) ; whi l e ( 1) { / / Pl ace your code her e r t c_get _t i me( &hour , &mi n, &sec) ; har i =r t c_r ead( 0x03) ; Percobaan 15