Buku Mikrokontroler Atmega8535 Dengan Codevisionavr
Buku Mikrokontroler Atmega8535 Dengan Codevisionavr
Buku Mikrokontroler Atmega8535 Dengan Codevisionavr
BAB 1 SOFTWARE COMPILER CODEVISION AVR 1.1 PENGENALAN CodeVisionAVR merupakan salah satu software gratis yang berfungsi sebagai text editor dalam menulis baris perintah sekaligus sebagai compiler yang dapat mengubah file sumber menjadi file hexa. Software CodeVisionAVR versi demo dapat di unduh dari http://www.hpinfotech.ro/html/cvavr.htm atau dari CD yang terdapat pada buku ini. CodeVisionAVR menyediakan berbagai fasilitas yang memudahkan pengguna. Salah satunya adalah CodeWizardAVR yang memberikan kemudahan dalam melakukan konfigurasi fungsi-fungsi pin dan fitur yang yang ingin digunakan. Pengguna dapat membuat dan menjalankan program yang ditulis, kemudian mengujinya langkah demi langkah sehingga pengguna dapat mengamati perubahan data pada setiap register dan port I/O. Selain itu juga CodeVisionAVR menyediakan toolbar yang memudahkan pengguna untuk melakukan berbagai interaksi yang diinginkan dan juga memiliki arena kerja yang cukup leluasa. 1.2 INSTALASI Agar pengguna dapat menggunakan software CodeVisionAVR maka para pengguna harus meng-instal-nya terlebih dahulu. Adapun proses instalasi software CodeVisionAVR ini cukup mudah. 1. Klik dua kali master program CodeVisionAVR yang ada di CD buku ini. 2. Ikuti langkah-langkah yang diminta dan lakukan perubahan seperlunya. 3. Setelah selesai, program dapat langsung dijalankan. 1.3 MEMBUAT PROGRAM BARU Membuat program baru menggunakan CodeVisionAVR tidaklah sulit. Adapun langkah-langkah yang harus dilakukan adalah sebagai berikut: 1. Jalankan program CodeVisionAVR. Dengan cara klik dua kali pada Icon CodeVisionAVR seperti pada gambar 1.1.
Gambar 1.1 Icon CodeVisionAVR 2. Pada saat jalankan program CodeVisionAVR maka layar kosong tampak seperti pada gambar 1.2.
Gambar 1.3 Jendela Pilihan Tipe File 4. Untuk membuat program baru pilihlah Project kemudian klik OK, maka muncul pertanyaan yang menanyakan apakah kita ingin menggunakan CodeWizardAVR seperti pada gambar 1.4 berikut, kemudian pilih Yes.
Gambar 1.4 Jendela Confirm CodeWizardAVR 5. Jendela CodeWizardAVR tampil seperti gambar 1.5. Pada tab Chip, lakukan konfigurasi seperti pada gambar 1.5.
Gambar 1.6 CodeWizardAVR pada tab Ports 7. Kemudian pilih menu File lalu pilih Generat, Save and Exit. Lalu kita diminta menyimpan tiga jenis file secara berurut. Dianjurkan simpan ketiga file tersebut dalam sebuah folder yang sama. Setelah selesai, maka program CodeVisionAVR akan tampak seperti gambar 1.7, yang menunjukan bahwa sudah terdapat program yang telah dikonfigurasi dan siap digunakan atau disisipkan program tambahan.
8.
Gambar 1.8 Menyisipkan program utama 10. Setelah selesai kita dapat melakukan kompilasi pada program dengan cara pilih menu Project lalu pilih Build All atau Ctrl+F9. 11. Jika program sudah benar atau tidak terdapat kesalahan, maka akan tampil jendela informasi seperti gambar 1.9 berikut ini.
Gambar 1.10 Jendela Informasi 12. Kemudian klik OK, dan program siap di download ke rangkaian. Langlah-langkah diatas adalah proses untuk menghasilkan file dengan bahasa mesin yaitu file dengan ekstensi hexa (*.hex). File ini dibutuhkan untuk diisi (download) ke IC mikrokontroler, karena mikrokontroler hanya mengerti bahasa mesin. Tahap-tahap ini akan terus dilakukan setiap membuat program baru.
1. 2. 3.
2.3 TAMPILAN PROGRAM Pada software Proteus, kita menggunakan program ISIS yang berfungsi sebagai simulator. Pada program ISIS banyak sekali fasilitas yang disajikan dan akan memakan banyak waktu jika harus menjelaskan semuanya. Oleh karena itu saya hanya akan menjelas beberapa saja yang diperlukan. Secara umum tampilan program ISIS pada Software Proteus 7 Professional adalah sebagai berikut :
Gambar 2.1 Tampilan Program ISIS Keterangan : 1. Editing Window. 2. Overview Window. 3. Object Selector.
1.
Gambar 2.2 Rangkaian ATMega8535 2. Jalankan program ISIS dan buka lembar baru. Tampak seperti gambar 2.3 berikut.
Component Mode
Terminal Mode
Gambar 2.4 Tombol Pick Devices 4. Pilih kategori, dan ambil komponen yang dibutuhkan dengan cara klik dua kali nama komponen yang dipilih seperti gambar 2.5 berikut.
Gambar 2.5 Jendela Pick Devices 5. 6. Setelah semua komponen terkumpul di bagian Object Selector, klik OK. Pilih toolbar Terminal Mode, ambil komponen Power dan letakkan pada rangkaian, atur posisi komponen pada Editing Window. Seperti gambar 2.6 berikut.
Gambar 2.7 Hubungan Jalur Komponen 8. Gambar rangkaian tidak perlu lengkap seperti aslinya. Yang penting input dan output rangkaian terhubung dengan komponen yang diinginkan seperti contoh gambar 2.7. Setelah selesai, rangkaian siap disimulasikan dan lihatlah tampilan yang dihasilkan pada gambar simulasi.
Gambar 2.8 Jendela Edit Component 9. Klik dua kali IC mikrokontroler pada rangkaian, akan muncul jendela Edit Component. Pada bagian Program File, klik lambang folder, maka akan muncul jendela Select File Name, pilih program LED.HEX yang telah dibuat dan berhasil di compile sebelumnya. Klik Open, lalu Klik OK.
10. Jalankan simulasi rangkaian dengan cara menekan tombol Play pada bagian sudut kiri bawah. 11. Jika LED pada rangkaian berkedap-kedip, maka berarti rangkaian anda telah berhasil disimulasikan.
Gambar 3.1 Contoh bentuk dan warna LED 3.1 ANIMASI LED. Aplikasi lampu LED (Light Emitting Diode) adalah aplikasi yang paling sederhana dan yang paling dasar dalam mempelajari dasar pengontrolan menggunakan mikrokontroler. Maka dianggap penting sekali memahami prinsip kerja dari LED ini. LED terdiri dari 2 kaki yaitu anoda dan katoda, dimana LED akan menyala jika arus mengalir dari anoda ke katoda. Pada apliksi lampu LED kali ini, kita akan menghubungkan LED ke mikrokontroler melalui Port A. Seperti pada gambar 3.3.
Gambar 3.2 Simbol LED (Light Emitting Diode) Rangkaian Simulasi Animasi LED.
Gambar 3.3 Rangkaian Lampu Flip-flop Kedelapan LED kita hubungkan ke PortA dengan menghubungkan semua pin Anoda dari LED ke sumber positif dari tegangan atau biasa disebut Common Anoda (CA). Maka untuk menyalakan LED, data pada PortA harus diberi data 0.
10
11
Gambar 4.1 Rangkaian 7 Segment Non-Multiplex Tugas Program Aplikasi LED. Buatlah program baru dengan CodeWizardAVR seperti konfigurasi berikut, kemudian edit program seperti pada gambar.
12
Program 2. Aplikasi 7 Segment 2 digit #include <mega8535.h> #include <delay.h> void satuan() { PORTC=0x40; delay_ms(500); PORTC=0x79; delay_ms(500); PORTC=0x24; delay_ms(500); PORTC=0x30; delay_ms(500); PORTC=0x19; delay_ms(500); PORTC=0x12; delay_ms(500); PORTC=0x02; delay_ms(500); PORTC=0x78; delay_ms(500); PORTC=0x00; delay_ms(500); PORTC=0x10; delay_ms(500); } void main(void) { PORTA=0x00; DDRA=0xFF; PORTC=0x00; DDRC=0xFF; while (1) { PORTA=0x40; satuan(); PORTA=0x79; satuan(); PORTA=0x24; satuan(); PORTA=0x30; satuan(); PORTA=0x19; satuan(); PORTA=0x12; satuan(); PORTA=0x02; satuan(); PORTA=0x78; satuan(); PORTA=0x00; satuan(); PORTA=0x10; satuan(); }; }
13
MSB data sekarang / terakhir di AND -kan dengan data (0000 | 0011) Dengan perintah PORTA&=0x03; di OR kan dengan data (0101 | 0000) Dengan perintah PORTA|=0x50;
Puluhan
Satuan
Tugas Program Aplikasi LED. Buatlah program baru dengan CodeWizardAVR seperti konfigurasi berikut, kemudian edit program seperti pada gambar.
14
Program 2. Aplikasi 7 Segment 2 digit #include <mega8535.h> #include <delay.h> void satuan() { PORTA&=0x0F; PORTA |=0x00; delay_ms(500); PORTA&=0x0F; PORTA |=0x10; delay_ms(500); PORTA&=0x0F; PORTA |=0x20; delay_ms(500); PORTA&=0x0F; PORTA |=0x30; delay_ms(500); PORTA&=0x0F; PORTA |=0x40; delay_ms(500); PORTA&=0x0F; PORTA |=0x50; delay_ms(500); PORTA&=0x0F; PORTA |=0x60; delay_ms(500); PORTA&=0x0F; PORTA |=0x70; delay_ms(500); PORTA&=0x0F; PORTA |=0x80; delay_ms(500); PORTA&=0x0F; PORTA |=0x90; delay_ms(500); } void main(void) { PORTA=0x00; DDRA=0xFF; PORTC=0x00; DDRC=0xFF; while (1) { PORTA&=0xF0; PORTA|=0x00; satuan(); PORTA&=0xF0; PORTA|=0x01; satuan(); PORTA&=0xF0; PORTA|=0x02; satuan(); PORTA&=0xF0; PORTA|=0x03; satuan(); PORTA&=0xF0; PORTA|=0x04; satuan(); PORTA&=0xF0; PORTA|=0x05; satuan(); PORTA&=0xF0; PORTA|=0x06; satuan(); PORTA&=0xF0; PORTA|=0x07; satuan(); PORTA&=0xF0; PORTA|=0x08; satuan(); PORTA&=0xF0; PORTA|=0x09; satuan(); }; }
15
Gambar 5.1 Rangkaian 7 Segment Multiplex Tugas Program Aplikasi LED. Buatlah program baru dengan CodeWizardAVR seperti konfigurasi berikut, kemudian edit program seperti pada gambar.
Gambar 5.2 Konfigurasi 7 Segment Multiplex Program 1. Aplikasi 7 Segment 8 digit #include <mega8535.h> #include <delay.h> void main(void) { PORTA=0xFF; DDRA=0xFF; PORTC=0x00; DDRC=0xFF; while (1) { PORTC=0x40; delay_ms(500); PORTC=0x79; delay_ms(500); PORTC=0x24; delay_ms(500); PORTC=0x30; delay_ms(500); PORTC=0x19; delay_ms(500); PORTC=0x12; delay_ms(500); PORTC=0x02; delay_ms(500); PORTC=0x78; delay_ms(500); PORTC=0x00; delay_ms(500); PORTC=0x10; delay_ms(500); }; }
16
Gambar 5.3 Rangkaian 7 Segment LCD Multiplex dengan Decoder Program 2. Aplikasi 7 Segment 8 digit dengan decoder #include <mega8535.h> #include <delay.h> void main(void) { PORTA=0x00; DDRA=0xFF; PORTC=0x00; DDRC=0xFF; while (1) { PORTC=0x0; delay_ms(500); PORTC=0x1; delay_ms(500); PORTC=0x2; delay_ms(500); PORTC=0x3; delay_ms(500); PORTC=0x4; delay_ms(500); PORTC=0x5; delay_ms(500); PORTC=0x6; delay_ms(500); PORTC=0x7; delay_ms(500); PORTC=0x8; delay_ms(500); PORTC=0x9; delay_ms(500); }; }
Program 3. Aplikasi 7 Segment 8 digit dengan decoder #include <mega8535.h> #include <delay.h> void main(void) { PORTA=0xFF; DDRA=0xFF; PORTC=0x00; DDRC=0xFF; while (1) { PORTA=0B00000001; PORTC=0x0; delay_ms(500); PORTA=0B00000010; PORTC=0x1; delay_ms(500); PORTA=0B00000100; PORTC=0x2; delay_ms(500); PORTA=0B00001000; PORTC=0x3; delay_ms(500); PORTA=0B00010000; PORTC=0x4; delay_ms(500); PORTA=0B00100000; PORTC=0x5; delay_ms(500); PORTA=0B01000000; PORTC=0x6; delay_ms(500); PORTA=0B10000000; PORTC=0x7; delay_ms(500); }; }
17
Contoh Program. Program 1. Menampilkan 1 Karakter pada LED Dot Matrix 5x7 #include <mega8535.h> #include <delay.h> void main(void) { PORTA=0x00; DDRA=0xFF; PORTC=0x00; DDRC=0xFF; while (1) { PORTA=0x01; PORTC=0B00000011; delay_ms(1); PORTA=0x02; PORTC=0B01110101; delay_ms(1); PORTA=0x04; PORTC=0B01110110; delay_ms(1); PORTA=0x08; PORTC=0B01110101; delay_ms(1); PORTA=0x10; PORTC=0B00000011; delay_ms(1); }; }
18
Gambar 7.1 Konfigurasi LCD Display 16x2 Rangkaian Simulasi LCD Display 16x2
19
20
Tombol salah satu komponen yang paling sering digunakan pada aplikasi elektronik. Tombol biasa digunakan sebagai pemilih, pengatur dan juga sebagai sensor yang kemudian diproses untuk mengerjakan sesuatu. Umumnya jenis tombol ada 2 macam, yaitu tombol Push Button (Tombol Tekan) dan Tombol Toggle (On/Off). Terdapat berbagai macam bentuk dan ukuran tombol dari yang kecil sampai yang besar, sehingga pengguna harus memilih tombol yang sesuai tergantung kebutuhan. Contoh bentuk-bentuk tombol bias dilihat pada gambar 6.1 berikut.
Gambar 8.1 Macam-Macam Tombol PUSH BUTTON Tombol Push Button sering kita lihat dalam kehidupan sehari-hari pada peralatan elektronik, seperti radio, televisi, keyboard dan kalkulator lain-lain. Biasanya tombol push button ini digunakan untuk memilih atau menetukan suatu proses, misalnya memilih channel televisi atau mengetik komputer.
21
Gambar 8.3 Aplikasi Tombol Push Button dan LED Program Baca Masukan Tombol Push Button ke LED #include <mega8535.h> void main(void) { PORTA=0x00; DDRA=0xFF; PORTB=0xFF; DDRB=0x00; while (1) { // Place your code here PORTA=PINB; }; } Rangkaian Aplikasi Tombol Push Button dan 7 Segment
22
Gambar 8.5 Aplikasi Tombol Push Button dan LCD Program Baca Masukan Tombol Push Button ke LCD #include <mega8535.h> #include <stdio.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> // Declare your global variables here unsigned int temp=15; char buf[33]; void main(void) {
23
24
25
Gambar 9.3 Konfigurasi Keypad dan LCD Contoh Program Program Baca Masukan Tombol Matrix 4x4 #include <mega8535.h> #include <stdio.h> #include <delay.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> // Declare your global variables here int key; char buff[33]; unsigned char keypad( ) { //Kolom 1================== PORTD = 0b11110111; if(PIND.7==0) {key=10; goto run;} if(PIND.6==0) {key=15; goto run;} if(PIND.5==0) {key=0; goto run;} if(PIND.4==0) {key=14; goto run;} //Kolom 2================= PORTD = 0b11111011; if(PIND.7==0) {key=13; goto run;} if(PIND.6==0) {key=9; goto run;} if(PIND.5==0) {key=8; goto run;} if(PIND.4==0) {key=7; goto run;} //Kolom 3================= PORTD = 0b11111101; if(PIND.7==0) {key=12; goto run;} if(PIND.6==0) {key=6; goto run;} if(PIND.5==0) {key=5; goto run;} if(PIND.4==0) {key=4; goto run;} //Kolom 4=================
26
27
Gambar 9.5 Konfigurasi Keypad dan LCD Contoh Program Program Aplikasi Kalkulator #include <mega8535.h> #include <stdio.h> #include <delay.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> // Declare your global variables here int key=20,step,op,a1,b1,c; char buff[33]; unsigned char keypad( ) { //Kolom 1================== PORTB = 0b11110111; if(PINB.7==0) {key=10; goto run;} //tambah if(PINB.6==0) {key=15; goto run;} //sama dengan = Enter if(PINB.5==0) {key=0; goto run;} if(PINB.4==0) {key=14; goto run;} //ON = Cancel //Kolom 2================= PORTB = 0b11111011; if(PINB.7==0) {key=13; goto run;} //kurang if(PINB.6==0) {key=9; goto run;} if(PINB.5==0) {key=8; goto run;} if(PINB.4==0) {key=7; goto run;} //Kolom 3================= PORTB = 0b11111101; if(PINB.7==0) {key=12; goto run;} //kali if(PINB.6==0) {key=6; goto run;} if(PINB.5==0) {key=5; goto run;} if(PINB.4==0) {key=4; goto run;}
28
29
30
BAB 10 APLIKASI DATA ANALOG PADA LCD DISPLAY Aplikasi data analog sering digunakan pada sensor-sensor yang keluarannya seperti sensor suhu, kelembaban, asap dan sensor lainnya. Pada rangkaian simulasi kita hanya menggunakan resistor variabel sebagai pengatur output analog yang nantinya diproses oleh mikrokontroler dan kemudian ditampilkan melalui LCD Display. Rangkaian Simulasi Analog pada LCD Display
31
32
",read_adc(2));
",read_adc(3));
",read_adc(4));
",read_adc(5));
",read_adc(6));
",read_adc(7));
Program Pemilih Channel Data Analog #include <mega8535.h> #include <stdio.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> #include <delay.h> #define ADC_VREF_TYPE 0x60 // Read the 8 most significant bits // of the AD conversion result unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; }
33
34
35
36
37
Program PWM dengan Fast PWM 1 #include <mega8535.h> #include <stdio.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm
38
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 7.813 kHz // Mode: Fast PWM top=00FFh // OC1A output: Non-Inv. // OC1B output: Non-Inv. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0xA1; TCCR1B=0x0D; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
39
Gambar 11.5 Aplikasi ADC to LCD Display Program PWM dengan Fast PWM 2 #include <mega8535.h> #include <stdio.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm
40
41
42
Gambar 12.1 Rangkaian Simulasi Timer Menggunakan Timer1: Ttimer1 = Tosc*(65536-TCNT1)*N Pada aplikasi diatas diinginkan lamanya timer adalah 1 detik (Ttimer1 = 1 detik) dan jika saya menggunakan kristal 12 MHz dan menggunakan skala clock N = 1024, maka didapat: 1 = 0,0000000833*(65536-TCNT1)*1024 TCNT1= 53817.25 53818 TCNT1= 53818 = D23A (dalam hexa)
43
Dari perhitungan diatas didapat nilai 53818 atau dalam hexa D23A, nilai tersebut harus diisikan pada register TCNT1 agar Timer 1 bernilai 1 detik. Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:
Gambar 12.2 Configurasi CodeWizardAVR Timer1 Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat dari Fosc/N atau 12 Mhz/1024. Berikut adalah listing program lengkapnya: #include <mega8535.h> #include <stdlib.h> #asm .equ __lcd_port=015 ;PORTC #endasm #include <lcd.h> unsigned char temp[6]; int data; // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { TCNT1H=0xD23A >> 8; TCNT1L=0xD23A & 0xff; data++; //setelah 1 detik increament data } void main(void) { // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 11.719 kHz // Mode: Normal top=FFFFh
44
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)
45
Gambar 12.3 Configurasi CodeWizardAVR Timer0 Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat dari Fosc/N atau 12 Mhz/1024. Berikut adalah listing program lengkapnya: #include <mega16.h> #include <stdlib.h> #asm .equ __lcd_port=015 ;PORTC #endasm #include <lcd.h> unsigned char temp[6], loop=0; int data; // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Reinitialize Timer 0 value TCNT0=0x8A; loop++; if (loop>=100) { data++; loop=0; } } void main(void) { // Timer/Counter 0 initialization
46
47
48
49
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:
50
51
52
13.1 Menggunakan Timer Counter0 Untuk aplikasi counter lebih mudah dibandingkan dengan timer, karena kita tidak harus lagi menghitung untuk mendapatkan nilai dari register TCNT, tetapi secara otomatis register TCNT yang akan mencacah jika ada input yang masuk. Berikut adalah contoh aplikasi counter untuk menghitung menggunakan T0 dan ditampilkan pada LCD, input yang digunakan berasal dari pushbutton.
Gambar 13.1 Rangkaian Simulasi Counter Input untuk counter0 berasal dari pin T0 atau PB0 akan disimpan pada register TCNT0 kemudian ditampilkan ke LCD. Counter0 hanya mampu mencacah sampai dengan nilai 256 dikarenakan counter 8 bit. Berikut adalah setting pada CodeVision CodeWizard AVR:
53
54
Gambar 13.3 Rangkaian Simulasi Interupsi Berikut adalah setting pada CodeVision CodeWizard AVR:
55
56
I. Tujuan: Mahasiswa mengerti cara melakukan komunikasi serial dengan mikrokontroller AVR untuk mengendalikan sesuatu peralatan Mahasiswa mengerti cara membuat program C pada mikrokontroller AVR untuk melakukan komunikasi serial II. Peralatan yang digunakan: modul AVR Modul LED dan switch Kabel serial RS232 (cross) Dasar Teori: Komunikasi serial merupakan komunikasi data dengan pengiriman data secara satu per satu dengan menggunakan satu jalur kabel data. Sehingga komunikasi serial hanya menggunakan 2 kabel data yaitu kabel data untuk pengiriman yang disebut transmit (Tx) dan kabel data untuk penerimaan yang disebut receive (Rx). Kelebihan dari komunikasi serial adalah jarak pengiriman dan penerimaan dapat dilakukan dalam jarak yang cukup jauh dibandingan dengan komunikasi parallel tetapi kekurangannya adalah kecepatan lebih lambat daripada komunikasi parallel, untuk saat ini sedang dikembangkan teknologi serial baru yang dinamakan USB (Universal Serial Bus) yang memiliki kecepatan pengiriman dan penerimaan data lebih cepat disbanding serial biasa. Beberapa contoh : komunikasi Serial RS-232 dan RS-485. Mode serial port : 1. Pada mode 0, Pin TX mengeluarkan shift clock, dan pin RX dapat menerima maupun mengirim data, dengan format 8 bit data dimulai dengan LSB dulu yang dikirim. Jadi pada saat dikirim data melalui RX maka sekalian pin TX mengirimkan signal clock secara berbarengan. Baud ratenya fix yaitu 1/12 frekuensi osilatornya. 2. Pada mode 1, Pin TX berfungsi untuk mengirim data dan RX berfungsi untuk menerima data, data yang dikirim formatnya 8 bit data dengan LSB dikirim dahulu,serta 1 start bit( berlogika 0 ) dan 1 stop bit( berlogika 1 ). Baud ratenya variabel tergantung dari nilai yang ada pada register timer 1 maupun timer 2. 3. Pada mode 2, Pin TX berfungsi untuk mengirim data dan RX untuk menerima data, format datanya sama dengan mode 1 hanya saja terdapat parity bitnya sehingga total bit yang terkirim sebanyak 11 bit. Bit paritynya dapat diset melalui TB8( lihat pada SCON ). Baud ratenya hanya ada 2 pilihan yaitu 1/32 atau 1/64 dari frekuensi osilatornya. 4. Pada mode 3 identik dengan mode 2, hanya saja Baud ratenya variabel tergantung nilai yang terdapat pada register dari timer 1 dan timer 2. III.
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. Trainer : Tianur (081378217984) 57
POLITEKNIK CALTEX RIAU REN: Receive Enable, bit untuk mengaktifkan penerimaan data dari Port Serial pada kondisi set. Bit ini di set dan clear oleh perangkat lunak. TB8: Transmit bit 8, bit ke 9 yang akan dikirimkan pada mode 2 atau 3. Bit ini diset dan clear oleh perangkat lunak RB8: Receive bit 8, bit ke 9 yang diterima pada mode 2 atau 3. Pada Mode 1 bit ini berfungsi sebagai stop bit. TI: Transmit Interrupt Flag, bit yang akan set pada akhir pengiriman karakter. Bit ini diset oleh perangkat keras dan di clear oleh perangkat lunak RI: Receive Interrupt Flag, bit yang akan set pada akhir penerimaan karakter. Bit ini diset oleh perangkat keras dan di clear oleh perangkat lunak Dalam coding serial dalam AVR, terdapat 2 konsep yaitu secara polling maupun secara interrupt. Seperti yang sudah dijelaskan diatas mengenai TI dan RI, maka dalam menerima data RI akan terset secara hardware sedangkan TI diset pada saat data hampir selesai dikirim, dan dalam hal transmisi data sangat perlu untuCEK" kondisi TI. Bila TI sudah berlogika 1 berarti data yang ditaruh dalam SBUF sudah selesai dikirim dan harus diclear secara software( secara program ), sebab bila tidak dicek apakah TI sudah 1 atau belum maka mungkin saja terjadi SBUF sudah direload dengan data baru sedangkan data yang lama belum selesai dikirim sehingga terjadi apa yang disebut dengan data corruption. Maka sebelum mengirim byte data yang selanjutnya sangatlah perlu untuk mengecek TI dulu. Bila coding serial dengan konsep polling maka codenya harus terus menerus mengecek flag TI dan RI, apakah berlogika 1, bila berlogika 1 maka langsung lompat ke procedure yang bersangkutan, dengan jangan lupa secepatnya mengclear flag TI atau RI, agar tidak lompat ke int. veltor dari serial. Keuntungan konsep polling adalah codenya yang simple, tetapi menghabiskan cpu time sebab selalu mengecek flag TI dan RI terus menerus tanpa dapat melakukan tugas yang lain, sebab bila melakukan yang lain maka pada saat salah satu flag tersebut menjadi satu maka akan langsung lompat ke int. vektor serial sehingga program akan menjadi kacau. Bila coding serial dengan konsep interrupt, maka program serialnya hanya ada pada subroutine dari int. serial saja, dimana hanya mengecek oleh flag mana interrupt serial terpanggil? Oleh TI atau RI? Bila oleh TI maka taruh datanya ke SBUF TI utk dikirim, dan bila karena RI maka selamatkan datanya ke suatu variabel dari SBUF RI. Keuntungannya code kita dapat melakukan tugas yang lainnya, kerugiannya adalah code yang cukup kompleks.
IV.
Langkah Kerja
58
COM 1
DB-9 female
female
1 2 3 4 5 4 PC side
male
1 2 3 4 5 4 AVR Min. Sys. side
59
Gambar2.7. Menjalankan window terminal di Code Vision AVR untuk mengamati hasil program yang mengakses komunikasi serial
60
POLITEKNIK CALTEX RIAU Gambar2.8. Terminal program bisa juga memakai program Hyperterminal bawaan MS Windows. Bisa di akses di Start-> All programs -> Acessories -> Communications -> Hyperterminal
V.
Program
61
VI.
Analisa
Pada percobaan ini pertama tama dilakukan setting terhadap chip menggunakan Atmega8535L pada clock 4Mhz lalu mnestting LACd pada portB,setting ADC 8 bit dengan interrupt , setting komunikasi serial (USART). Pada setting USART yang digunakan hanya transmitter (TX) saja karena hanya mengirimkan data ke PC atau dengan kata lain tidak menrima masukan dari PC. Setelah itu nilai ADC dibaca dan datanya dikirim melalui serial dengan perintah sprinf untuk kalimat dan putchar unutk sebuah karakter seperti L,D,R atau apbila ingin lebih dari satu karakter dapat dikirim dengan sprin(LDR);.
62
RTC yang dimaksud disini adalah real time clock (bukan real time computing), biasanya berupa IC yg mempunyai clock sumber sendiri dan internal batery untuk menyimpan data waktu dan tanggal. Sehingga jika system komputer / microcontroller mati waktu dan tanggal didalam memori RTC tetap uptodate. Salah satu RTC yang sudah populer dan mudah penggunaanya adalah DS1307, apalagi pada Codevision sudah tersedia fungsi-fungsi untuk mengambil data waktu dan tanggal untuk RTCDS1307 ini.
Fitur-fitur DS1307:
Real-time clock (RTC) menghitung detik, menit, jam,tanggal,bulan dan hari dan tahun valid sampai tahun 2100 Ram 56-byte, nonvolatile untuk menyimpan data. 2 jalur serial interface (I2C). output gelombang kotak yg diprogram. Automatic power-fail detect and switch Konsumsi arus hanya 500nA pada batery internal. mode dg oscillator running. temperature range: -40C sampai +85C
63
POLITEKNIK CALTEX RIAU Untuk membaca data tangal dan waktu yg tersimpan di memori RTC Ds1307 dapat dilakukan melalui komunikasi serial I2C spt tampak pada gambar berikut:
Cara pembacaan DS1307 beropersai sebagai slave pada bus I2C. Cara Access pertama mengirim sinyal START diikuti device address dan alamat sebuah register yg akan dibaca. Beberapa register dapat dibaca sampai STOP condition dikirim.
Data waktu dan tanggal tersimpan dalam memori masing masing 1 byte , mulai dari alamat 00H sampai 07H. Sisanya (08H ~ 3FHalamat RAM yg bisa digunakan). Trainer : Tianur (081378217984) 64
POLITEKNIK CALTEX RIAU Pemrograman RTC DS1307 dengan Codevision. Codevision sudah menyediakan fungsi-fungsi khusus untuk mengakses data DS1307 jadi kita tinggal menggunakanya. Apalagi dengan fasilitas codewizard pemrograman RTC menjadi mudah.
setelah kita klik ok maka akan tersedia template Code program sbb: #include <mega16.h> // I2C Bus functions #asm .equ __i2c_port=018 ;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=015 ;PORTC #endasm #include <lcd.h>
65
POLITEKNIK CALTEX RIAU char tampungLCD[16]; void main(void) { unsigned char hour,minute,second; / I2C Bus initialization i2c_init(); // DS1307 Real Time Clock initialization // Square wave output on pin SQW/OUT: Off // SQW/OUT pin state: 0 rtc_init(0,0,0); // LCD module initialization lcd_init(16); /* initialize the DS1307 RTC */ rtc_init(0,0,0); //tambahankan baris ini
//this function sets the current time of the RTC.
rtc_set_time(6,0,0); // jam 6:00:00 while (1) { /* read time from the DS1307 RTC */ rtc_get_time(&hour,&minute,&second); //tampilkan di LCD 216 lcd_gotoxy(0,0); sprintf(tampungLCD,Time: %d:%d:%d ,hour,minute,second); lcd_puts(tampungLCD); } }
66