Petunjuk Praktikum AVR-Triwiyanto Page 1 Microcontroller ATMEGA8535 Trainer Kit Experiment Manual P E T U N J U K P R A K T I K U M MIKROKONTROLLER AVR Oleh: Triwiyanto Media Pengembangan Mikrokontroler AVR dengan CodeVision JURUSAN TEKNIK ELEKTROMEDIK POLTEKKES KEMENKES SURABAYA 2011
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Petunjuk Praktikum AVR-Triwiyanto Page 1
Microcontroller ATMEGA8535 Trainer Kit
Experiment Manual
P E T U N J U K P R A K T I K U M MIKROKONTROLLER AVR
Oleh:
Triwiyanto
Media Pengembangan
Mikrokontroler
AVR dengan CodeVision
JURUSAN TEKNIK ELEKTROMEDIK
POLTEKKES KEMENKES SURABAYA
2011
Petunjuk Praktikum AVR-Triwiyanto Page 2
PERCOBAAN 1
L E D
I. Pendahuluan
Pada praktikum ini, anda akan mempelajari cara mengembangkan sebuah system
menggunakan mikrokontroler AVR buatan Atmel menggunakan software
CodeVisionAVR.CodeVisionAVR merupakan software C-cross compiler, dimana
program dapat ditulis menggunakan bahasa-C. Dengan menggunakan pemrograman
bahasa-C diharapkan waktu disain (deleloping time) akan menjadi lebih singkat.
Setelah program dalam bahasa-C ditulis dan dilakukan kompilasi tidak terdapat
kesalahan (error) maka proses download dapat dilakukan. Pada percobaan ini anda
akan mengendalikan LED ON dan OFF.
II. Tujuan
Setelah menyelesaikan praktikum ini, yang anda peroleh adalah :
1. dapat menjelaskan arsitektur umum dan keistimewaan dari mikrokontroler
AVR ATmega8535.
2. dapat menceritakan kembali alur pengembangan software pada
mikrokontroler AVR menggunakan CodeVisionAVR.
3. dapat menggunakan fungsi output pada mikrokontroler AVR
4. dapat mengerjakan tugas yang diberikan dengan bahasa-C.
III. Dasar Teori
Port Sebagai Input / Output Digital
Atmega 8535 mempunyai empat buah port yang bernama PortA, PortB, PortC,
dan PortD. Keempat port tersebut merupakan jalur bi-directional dengan pilihan internal
pull-up.
Tiap port mempunyai tiga buah register bit, yaitu DDxn, PORTxn, dan PINxn.
Huruf ‘x’ mewakili nama huruf dari port sedangkan huruf ‘n’ mewakili nomor bit. Bit
DDxn terdapat pada I/O address DDRx, bit PORTxn terdapat pada I/O address PORTx,
dan bit PINxn terdapat pada I/O address PINx. Bit DDxn dalam register DDRx (Data
Petunjuk Praktikum AVR-Triwiyanto Page 3
Direction Register) menentukan arah pin. Bila DDxn diset 1, maka Px berfungsi sebagai
pin output. Bila DDxn diset 0 maka Px berfungsi sebagai pin input. Bila PORTxn diset 1
pada saat pin terkonfigurasi sebagai pin input, maka resistor pull-up akan diaktifkan.
Untuk mematikan resistor pull-up, PORTxn harus diset 0 atau pin dikonfigurasi sebagai
pin output. Pin port adalah tri-state setelah kondisi reset. Bila PORTxn diset 1 pada saat
pin terkonfigurasi sebagai pin output maka pin port akan berlogika 1. Dan bila PORTxn
diset 0 pada saat pin terkonfigurasi sebagai pin output maka pin port akan berlogika 0.
Saat mengubah kondisi port dari kondisi tri-state (DDxn=0, PORTxn=0) ke
kondisi output high (DDxn=1, PORTxn=1) maka harus ada kondisi peralihan apakah itu
kondisi pull-up enabled (DDxn=0, PORTxn=1) atau kondisi output low (DDxn=1,
PORTxn=0). Biasanya, kondisi pull-up enabled dapat diterima sepenuhnya, selama
lingkungan impedansi tinggi tidak memperhatikan perbedaan antara sebuah strong high
driver dengan sebuah pull-up. Jika ini bukan suatu masalah, maka bit PUD pada
register SFIOR dapat diset 1 untuk mematikan semua pull-up dalam semua port.
Peralihan dari kondisi input dengan pull-up ke kondisi output low juga menimbulkan
masalah yang sama. Maka harus menggunakan kondisi tri-state (DDxn=0, PORTxn=0)
atau kondisi output high (DDxn=1, PORTxn=0) sebagai kondisi transisi.
Tabel Konfigurasi Pin Port
Tabel diatas menunjukkan
konfigurasi pin pada port-
port mikrokontroler. Bit 2 –
PUD = Pull-up Disable, bila bit diset bernilai 1 maka pull-up pada port I/O akan
dimatikan walaupun register DDxn dan PORTxn dikonfigurasikan untuk menyalakan
pull-up (DDxn=0, PORTxn=1).
Codevision AVR
Petunjuk Praktikum AVR-Triwiyanto Page 4
Pemrograman mikrokontroler AVR lebih mudah dilakukan dengan bahasa
pemrograman C, salah satu software pemrograman AVR mikrokontroler adalah
Codevision AVR C Compiler. Dengan C AVR program yang telah di tulis selanjutnya di-
compile agar diperoleh bentuk hexadesimal dengan bentuk file *.hex. bentuk hexa inilah
yang akan dapat di download ke mikrokontroller.
Memulai project dengan C AVR
File > New > Pilih Project > OK
Use codeWizardAVR? >NO<
Kemudian simpan project. Dan muncul jendela berikut
Pada colom C compiler, di bagian chip pilih
mikrokontroller yang digunakan (Atmega8535)
berikut juga crystal nya(12 Mhz). OK
Petunjuk Praktikum AVR-Triwiyanto Page 5
Langkah selanjutnya yaitu, membuat file tempat penulisan source code yang ber
ektensi .c. yaitu, pilih File > New > Pilih Source > OK.
Kemudian, ketikkan dulu satu atau beberapa baris listing program, kemudian simpan [ File > Save ], dengan ekstensi .c.
Langkah selanjutnya adalah meng-include file source code listing program tadi kedalam
project yang kita buat, caranya adalah.. Pilih Project > Configure
Kemudian pilih > “Add” > masukkkan/ open file ber-ekstensi .c yang tadi di save.
Petunjuk Praktikum AVR-Triwiyanto Page 6
Fungsi Delay
Menghasilkan delay dalam program-C. Berada pada header delay.h yang harus di-
Includekan sebelum digunakan. Sebelum memanggil fungsi, interrupsi harus dimatikan
terlebih dahulu, bila tidak maka delay akan lebih lama dari yang diharapkan. Juga
sangat penting untuk menyebutkan frekuensi clock chip IC AVR yang digunakan pada
menu Project-Configure-C Compiler-Code Generation.
Fungsi delay yang disediakan adalah:
• void delay_us(unsigned int n)
menghasilkan delay selama n µ-detik, n adalah nilai konstan
• void delay_ms(unsigned int n)
menghasilkan delay selama n mili-detik, n adalah nilai konstan
IV. Peralatan 1. 1 set PC yang dilengkapi dengan software CodeVision AVR.
2. set development board AVR ATmega8535
3. 1 power-supply +5VDC
V. Prosedure Percobaan
PC
7
PC
0
R5220
PC
4
R6220
D4
LED
PC
3
PC
2
PC
5
D8
LED
R8220
R2220
D7
LED
D1
LED
R7220
PC
1
R4220
PC
6
VCC
D5
LED
J3 CON2
12
D6
LED
R1220
D2
LED
R3220
D3
LED
Petunjuk Praktikum AVR-Triwiyanto Page 7
1. Percobaan LED ON
Pada percobaan ini akan menghidupkan LED sejumlah 4 buah
#include <lcd.h> //meng-include kan fungsi-fungsi lcd
// Alphanumeric LCD Module functions bisa di copy dari codeWizard CAVR
// inisialisasi lcd dipasang diport mana
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
lcd_init(16); //inisialisasi lcd, yang digunakan adalah 16 baris
lcd_clear(); //meng-clear lcd, menulis kosong di lcd
lcd_gotoxy(x,y); //melompat ke kolom x dan baris y (x,y adalah nilai)
lcd_putsf(“ coba ”); //menuliskan ke lcd, apa yang tertulis di dalam tanda petik dua, baik itu spasi
//menampilkan variable di lcd
#include <stdio.h> //dipersiapkan dulu untuk fungsi sprintf
char lcd_buffer[33]; //mempersiapkan buffer
sprintf(lcd_buffer,"hsl-1:%i",hasil_1); //menampilkan tulisan hsl-1 dengan variable hasil_1
Petunjuk Praktikum AVR-Triwiyanto Page 37
lcd_puts(lcd_buffer); //menampilkan isi buffer
perintah-perintah dalam menampilkan di lcd,
%i = variable yang ditampilkan berupa integer
%c=variable yang ditampilkan berupa caracter
3. Percobaan manipulasi nilai II
#include <mega8535.h> #include <lcd.h> #include <stdio.h> #include <delay.h> // Alphanumeric LCD Module functions bisa di copy dari codeWizard CAVR #asm .equ __lcd_port=0x15 ;PORTC #endasm unsigned char tulis[5]={'m','i','c','r','o'}; char lcd_buffer[33]; unsigned char i; void main(void) { lcd_init(16); // inisialisasi lcd, kolom modul lcd =16. while(1) { for(i=0;i<5;i++) { lcd_clear(); lcd_gotoxy(i,0); // ke kolom x=0 dan baris y=0 sprintf(lcd_buffer,"%c",tulis[i]); lcd_puts(lcd_buffer); delay_ms(200); } } }
%f=menampilkan tipe float
%d=menampilkan bilangan bulat
/n=pindah ke baris selanjutnya
Petunjuk Praktikum AVR-Triwiyanto Page 38
operasi-operasi valid yang dapat dijalankan oleh variables tipe data. Gunakan yang sesuai, pemilihan data memepengaruhi memory yang dipakai dan ketelitian.
5. Percobaan Cetak Karakter Interaksi dengan Saklar
Pada percobaan ini interaksi cetak karakter dilakukan dengan penekanan pada
sebuah saklar yang terhubung pada PORTB.
a. Konfigurasi pada Code Vision
Gambar 4.5. Konfigurasi codevision pada LCD dan PORTB
b. Listing program
#include <mega8535.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
//
#include <lcd.h>
// Declare your global variables here
Petunjuk Praktikum AVR-Triwiyanto Page 40
void main(void)
{
PORTB=0xFF;
DDRB=0x00;
// LCD module initialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("Welcome");
delay_ms(1000);
while (1)
if (PINB.0==1)
{
lcd_gotoxy(0,0);
lcd_putsf("Button Released");
delay_ms(500);
}
else
{
lcd_gotoxy(0,0);
lcd_putsf("Button Pressed");
delay_ms(500);
}
}
6. Percobaan Cetak Karakter Interaksi dengan Saklar
Pada percobaan ini interaksi karakter dilakukan dengan menggunakan beberapa
saklar dan masing-masing saklar mewakili karakter tertentu.
a. Konfigurasi codevision sama dengan percobaan 5
b. Listing program
#include <mega8535.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
Petunjuk Praktikum AVR-Triwiyanto Page 41
#include <lcd.h>
// Declare your global variables here
void main(void)
{
PORTB=0xFF;
DDRB=0x00;
// LCD module initialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("Welcome");
delay_ms(1000);
while (1)
if (PINB==0xff)
{
lcd_gotoxy(0,0);
lcd_putsf("No Button");
delay_ms(500);
}
if else (PINB.0==0)
{
lcd_gotoxy(0,0);
lcd_putsf("Button 0");
delay_ms(500);
}
if else (PINB.1==0)
{
lcd_gotoxy(0,0);
lcd_putsf("Button 1");
delay_ms(500);
}
else
{
lcd_gotoxy(0,0);
lcd_putsf("No Button");
delay_ms(500);
}
}
Petunjuk Praktikum AVR-Triwiyanto Page 42
Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk
PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan
b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas
c. Jelaskan masing-masing program tersebut diatas.
d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu
e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum
Petunjuk Praktikum AVR-Triwiyanto Page 43
PERCOBAAN 5
ANALOG TO DIGITAL CONVERTER
I. Pendahuluan
Pada praktikum ini, anda akan mempelajari cara mengembangkan sebuah
system menggunakan mikrokontroler AVR buatan Atmel menggunakan
software CodeVisionAVR. Seperti pada umumnya mikrokontroler, program
untuk mikrokontroler AVR ditulis menggunakan bahasa assembly.
CodeVisionAVR merupakan software C-cross compiler, dimana program
dapat ditulis menggunakan bahasa-C. Dengan menggunakan pemrograman
bahasa-C diharapkan waktu disain (deleloping time) akan menjadi lebih
singkat. Setelah program dalam bahasa-C ditulis dan dilakukan kompilasi
tidak terdapat kesalahan (error) maka proses download dapat dilakukan. ADC
merupakah salah satu fasilitas yang ada pada mikrokontroller, untuk
melakukan konversi analog menjadi digital. Pada percobaan ini anda akan
berlajar bagaimana konfigurasi ADC, menampilkan data ke LED, 7 segmen
dan LCD Karakter.
II. Tujuan
Setelah menyelesaikan praktikum ini, yang anda peroleh adalah :
1. Dapat menjelaskan arsitektur umum dan keistimewaan dari mikrokontroler
AVR ATmega8535 fungsi ADC.
2. Dapat mengembangkan program CodeVisionAVR untuk konfigurasi ADC
3. Dapat menggunakan fungsi ADC
4. Dapat menampilkan data ADC ke LED, 7 Segmen dan LCD karakter
5. dapat mengerjakan tugas yang diberikan dengan bahasa-C.
Petunjuk Praktikum AVR-Triwiyanto Page 44
III. Dasar Teori
Mikrokontroller atmega8535 telah memiliki fasilitas Analog to Digital Converter
yang sudah built-in dalam chip. Atmega8535 memiliki resolusi ADC 10-bit dengan
8channel input dan mendukung 16macam penguat beda. ADC ini bekerja dengan
teknik successive approximation. Rangkaian internal ADC ini memiliki catu daya
tersendiri yaitu pin AVCC. Tegangan AVCC harus sama dengan VCC � 0.3���
(datasheet pada lampiran 1).
Data hasil konversi ADC dirumuskan sebagai berikut:
�� ���. 1024
����
dimana Vin adalah tegangan masukan pada pin yang dipilih sedangkan Vref
adalah tegangan referensi yang dipilih.
ADC terdiri atas rangkaian Sample and Hold yang menjamin tegangan masukan
ke ADC di tahan pada level konstan saat konversi. Block diagram ADC terlihat di
Gambar berikut.
Petunjuk Praktikum AVR-Triwiyanto Page 45
Gambar 5.1. Diagram blok ADC
Inisialisasi ADC
Untuk menggunakan ADC, haruslah diinisialisasi terlebih dahulu. Proses
inisialisasi ADC meliputi proses penentuan clock, tegangan referensi, format output, dan
mode pembacaan. Register yang perlu diset nilainya adalah ADMUX (ADC Multiplexer
Selection Register) ,ADCSRA ( ADC Control and Status Reister A), SFIOR ( Spesial
Function IO Register).
Inisialisasi ADMUX
ADMUX merupakan register 8 bit yang berfungsi menentukan tegangan referensi
ADC, format data Output, dan saluran ADC yang digunakan. Konfigurasinya seperti
gambar berikut.
Gambar 5.2. Register ADMUX
Gambar 5.3. Konfigurasi saat ADLAR sama dengan nol
Petunjuk Praktikum AVR-Triwiyanto Page 46
Gambar 5.4. Konfigurasi saat ADLAR sama dengan satu
Bit –bit penyusunya dapat dijelaskan sebgai berikut :
A. REFS [1..0] merupakan bit pengatur teangan referensi ADC ATmega16 Memiliki
nilai awal 00 sehingga referensi teganan berasal dari pin AREF,jika nilai REFS 01
maka nilai tegangan referensi diambil dari pin AVCC,jika nilai REFS 11 berarti
nilai teganan referensi berasal dari dalam yaitu sebesar 2,56 Volt.
B. ADLAR merupakan bit pemilih mode data keluaran ADC. Bernilai awal 0
sehingga 2 bit tertinggi data hasil konfersinya berada diregister ADCH dan 8bit
sisanya berada di register ADCL,seperti ditujukkan gambar 2.4(b) dan jika
bernilai 1,maka hasilnya pada gambar 2.4(c).
C. MUX [ 4..0] merupakan bit pemilih saluran pembacaan ADC. Bernilai awal 0000.
Untuk mode single ended input,MUX[4..0] bernilai dari 0000-00111. Berikut tabel
konfigurasi bit MUX
Tabel pemilihan bit saluran pembacaan ADC
Petunjuk Praktikum AVR-Triwiyanto Page 47
Gambar 5.5. Tabel pemilihan kanal ADC
Petunjuk Praktikum AVR-Triwiyanto Page 48
Tabel pemilihan bit saluran pembacaan ADC (lanjutan)
Inisialisasi ADCSRA
ADCSRA merupakan register 8 bit yang berfungsi melakukan manajemen sinyal
kontrol dan status dari ADC. Memiliki sususan seperti gambar berikut.
Gambar 5.6. Register ADCSRA
Bit penyusunnya dapat dijelaskan sebagai berikut :
a) ADEN merupakan bit pengatur aktivasi ADC. Berawal dari 0.Jika 1, maka ADC
Aktif.
b) ADSC merupakan bit penanda mulainya konversi ADC. Bernilai awal 0,selama
konvesi akan bernilai 1, dan jika telah selesai akan bernilai 1.
c) ADATE merupakan bit pengatur aktivasi picu otomatis operasi ADC.Bernilai awal
0. Jika 1,operasi ADC akan dimulai pada saat transisi positif sinyal picu yang
dipilih. Pemilihan sinya picu menggunakan bit ADTS pada register SFIOR
Petunjuk Praktikum AVR-Triwiyanto Page 49
d) ADIF merupakan bit penanda akhir suatu konversi ADC. Bernilai awal 0. Jika
bernilai 1,maka suatu saluran telah selesai dan data siap diakses
e) ADIE merupakan bit pengatur aktivasi interupsi yang berhubungan denan akhir
konversi ADC. Bernilai awal 0. Jika bernilai 1 sebuah interupsi akan dieksekusi.
f) ADPS[2..0] merupakan bit pengatur clock ADC. Bernilai awal 000. Detail nilai bit
dapat dilihat tabel berikut :
Tabel 2.8 Konfigurasi Clock ADC
Inisialisasi SFIOR
Register SFIOR (Special Function IO Register) merupakan register 8 bit
pengatur sumber picu konversi ADC, apakah dari picu internal atau dari picu eksternal.
Susunannya sebagai berikut :
Gambar 5.7. Register-register SFIOR
Petunjuk Praktikum AVR-Triwiyanto Page 50
ADTS[2..0] merupakan bit pengatur picu eksternal operasi ADC. Hanya berfungsi
jika bit ADATE pada register ADCSRA bernilai 1. Bernilai awal 000 sehingga ADC
bekerja mode free running dan tidak ada interupsi yang dihasilkan. Detailnya dapat
ditujukkan tabet berikut.
Tabel Konfigurasi mode ADC
Atmega 8535 telah include analog-to-digiatal (A/D) converter dengan resolusi 10 bit
yang dapat juga di program dengan 8 bit.
Kali ini kita akan juga akan belajar menggunakan codeWizard CvAVR. Dengan
menggunakan codewizard ini mempermudah kita dalam pengaturan register pada
program kita.
Lakukan pemilihan tipe mikrokontroller dan clock yang digunakan, pilih enable
ADC, pilih 8 bit atau 10 bit
Petunjuk Praktikum AVR-Triwiyanto Page 51
Gambar 5.8. Konfigurasi ADC pada codevision
#include <mega8535.h> #define ADC_VREF_TYPE 0x40 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } // Declare your global variables here void main(void) { PORTA=0x00; DDRA=0x00; // ADC initialization // ADC Clock frequency: 750.000 kHz // ADC Voltage Reference: AVCC pin // ADC High Speed Mode: On // ADC Auto Trigger Source: None ADMUX=ADC_VREF_TYPE; ADCSRA=0x84;
Petunjuk Praktikum AVR-Triwiyanto Page 52
SFIOR&=0xEF; //do nothing SFIOR|=0x10; //do nothing while (1) { // Place your code here }; }
// Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } void main(void) { inisialisasi_ADC(); inisialisasi_LCD(); while(1)
ADC pada mikrokontroler ini diakses 10bit, maka resolusi setiap bitnya bila kita
menggunakan referensi tegangan 5volt sebagai berikut.
Resolusi ADC = 1 x Vref 2 nbit
Resolusi ADC = 1 x 5 2 10
Resolusi ADC = 4.88mV
Hasil konversi ADC dihitung dengan menggunakan rumus sebagai berikut
Hasil konversi = ���.����
����
Penjelasan program
inisialisasi_ADC
Petunjuk Praktikum AVR-Triwiyanto Page 54
Listing berikut adalah inisialisasi_ADC. Program ini mengatur mode kerja ADC,
yaitu mengisi ADMUX dengan 0x20 yang berarti ADC bekerja dengan tegangan
referensi yang terhubung ke pin AVCC. Dan dengan format data ADCH-ADCL karna bit
ADLAR=0. Berikut adalah listing fungsi inisialisasi ADC.
void inisialisasi_ADC() { // ADC initialization // ADC Clock frequency: 750,000 kHz // ADC Voltage Reference: AVCC pin // ADC High Speed Mode: On // ADC Auto Trigger Source: None ADMUX=ADC_VREF_TYPE; ADCSRA=0x84; SFIOR&=0xEF; SFIOR|=0x10; }
Fungsi baca_adc
Berikut adalah fungsi pembacaan ADC 10bit. Fungsi ini adalah fungsi dengan
nilai balik. Sehingga saat fungsi ini dipanggil akan menghasilkan nilai balik sesuai
dengan data pada ADCW.
// Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; }
Petunjuk Praktikum AVR-Triwiyanto Page 55
Pada fungsi ini, ADMUX diisikan dengan adc_input dan di-or-kan dengan
ADC_VREF_TYPE. Seperti yang telah didefinisikan sebelumnya konstanta
ADC_VREF_TYPE bernilai 0x40 sedangkan adc_input merupakan argument dati fungsi
read_adc.
Gambar 5.9. Koneksi tegangan analog pada ATMEGA8535
IV. Peralatan
1. Modul Trainer
2. 1 set PC
3. Catu Daya +5V
V. Prosedure Percobaan
PA2
XTAL1
IC1
ATMEGA8535-DIL40
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
VCC
PA0
PD4PD5PD6
PC6
VCC
AREF
PB5
XTAL2 PC7
VCC
PA4
PB0
R41
POT
13
2
PA7
PB1
PC4
PA3
R38
POT
13
2
PD1PC3
R43
POT1
32
PD0
PD3
PA5
VCC
PC0PD7
GND
PA1
VCC
PB4
PB2
VCC
PB6
PD2
PA6
PC2
PB7
PB3
PC5
GND
R40
POT
13
2
PC1
Petunjuk Praktikum AVR-Triwiyanto Page 56
1. Percobaan ADC display LED
Pada percobaan ini data ADC diambil dan ditampilkan ke LED, dan pada
modul ini LED terhubung ke PORTC
Gambar 5.10. Koneksi tegangan analog pada ATMEGA8535
a. Pilih adc pada code wizard, dan lakukan setting seperti pada gambar
berikut
Gambar 5.11. Konfigurasi ADC pada ATMEGA8535
PC
7
PC
0
R5220
PC
4
R6220
D4
LED
PC
3
PC
2
PC
5
D8
LED
R8220
R2220
D7
LED
D1
LED
R7220
PC
1
R4220
PC
6
VCC
D5
LED
J3 CON2
12
D6
LED
R1220
D2
LED
R3220
D3
LED
Petunjuk Praktikum AVR-Triwiyanto Page 57
b. Lakukan generate program, dan editing program berikut:
/* ADC1.C DIGUNAKAN UNTUK MEMBACA ADC CH 0 */
/* DITAMPILKAN KE LED PORT C */
#include <mega8535.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void main(void)
{
DDRC = 0xFF;
// ADC Voltage Reference: AREF pin
ADMUX=ADC_VREF_TYPE & 0xff;
// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Auto Trigger Source: Free Running
ADCSRA=0xA3;
// Setting free running mode
SFIOR&=0x0F;
while(1)
{
PORTC = baca_adc(0);
delay_ms(100);
}
}
Petunjuk Praktikum AVR-Triwiyanto Page 58
2. Percobaan ADC Display 7 Segmen
Pada percobaan ini data ADC dikonfigurasikan dengan resolusi 10 bit, hasil
peengambilan data adc, ditampilkan ke 7 segmen, dalam bentuk ribuan,
ratusan, puluhan dan satuan.
Gambar 5.12. Driver dan decoder pada 7 segmen
a. Pilih adc pada code wizard, dan lakukan setting seperti pada gambar
berikut
VCC
PC
3
Y4
PC
0
PC
5P
C6
Y2PD7
PC
4
PC
5
PC
5
Y6
PC
6
Y7
Y7
Q8
2N
5322
3
2
1
PC
6
PC
2
Y5
PC
2 Y0
Q2
2N
53223
2
1SEGMENT1
CO
NN
SO
CK
ET
5x2
1 2 3 4 5
10
9 8 7 6
e d cm
2c dot
g fcm
1 a b
PC
1
R19220
PC
3
SEGMENT8
CO
NN
SO
CK
ET
5x2
1 2 3 4 5
10
9 8 7 6
e d cm
2c dot
g fcm
1 a b
Q1
2N
53223
2
1
VCC
PD5
R18220
PC
72
R31 1K
Y0
R25220
VCC
PC
0
J13
CON2
12
Y6
PC
4
PC
1
SEGMENT2
CO
NN
SO
CK
ET
5x2
1 2 3 4 5
10
9 8 7 6
e d cm
2c dot
g fcm
1 a b
U2
74LS138
123
645
15141312111097
ABC
G1G2AG2B
Y0Y1Y2Y3Y4Y5Y6Y7
Y3
PC
3
PC
0
PC
4
Y1
PC
1
PD6
Petunjuk Praktikum AVR-Triwiyanto Page 59
Gambar 5.13. Konfigurasi ADC, PORTC dan PORTD pada codevision
Petunjuk Praktikum AVR-Triwiyanto Page 60
b. Lakukan generate program, dan editing program berikut:
/* ADC1.C DIGUNAKAN UNTUK MEMBACA ADC CH 0 */
/* DITAMPILKAN KE 7 SEGMENT PORT C */
#include <mega8535.h>
#include <delay.h>
#define mode_ADC 0x00
int ubah;
int sat,pul,rat,rib;
unsigned int data;
unsigned int baca_adc (unsigned char pin_adc)
// this is very important declaration uint
{
ADMUX =pin_adc | mode_ADC;
ADCSRA |=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA |= 0x10;
return ADCW;
}
void ubah_ke_format7segment()
//fungsi untuk mengubah kedalam format 7segment
{
if (ubah==0){ubah=0xc0;}
if (ubah==1){ubah=0xf9;}
if (ubah==2){ubah=0xa4;}
if (ubah==3){ubah=0xb0;}
if (ubah==4){ubah=0x99;}
if (ubah==5){ubah=0x92;}
if (ubah==6){ubah=0x82;}
if (ubah==7){ubah=0xf8;}
if (ubah==8){ubah=0x80;}
if (ubah==9){ubah=0x90;}
}
void tampil_7segment()
{
Petunjuk Praktikum AVR-Triwiyanto Page 61
PORTC=rib;//mengirimkan data kedigit5
PORTD.5=0;
PORTD.6=0;
PORTD.7=0;
delay_ms(20);
PORTC=rat;//mengirimkan data kedigit6
PORTD.5=1;
PORTD.6=0;
PORTD.7=0;
delay_ms(20);
PORTC=pul;//mengirimkan data kedigit7
PORTD.5=0;
PORTD.6=1;
PORTD.7=0
delay_ms(20);
PORTC=sat;//mengirimkan data kedigit8
PORTD.5=1;
PORTD.6=1;
PORTD.7=0;
delay_ms(20);
//lamanya waktu scanning ditentukan oleh intruksi delay
}
void main(void)
{
DDRD = 0XFF;
DDRC = 0xFF;
ADMUX=mode_ADC;
ADCSRA=0x85;
while(1)
{
data = baca_adc(0);
sat = data % 10; // sat = sisa dari data dibagi 10
pul = data / 10;
pul = pul % 10;
rat = data / 100;
rat = rat % 10;
rib = data / 1000;
ubah=sat;
ubah_ke_format7segment();
Petunjuk Praktikum AVR-Triwiyanto Page 62
sat=ubah;
//
ubah=pul;
ubah_ke_format7segment();
pul=ubah;
//
ubah=rat;
ubah_ke_format7segment();
rat=ubah;
//
ubah=rib;
ubah_ke_format7segment();
rib=ubah;
//
tampil_7segment();
}
}
3. Pengaturan Nyala LED dengan input analog ADC
Pada percobaan ini menggunakan ADC dengan mode interupsi, data ADC 10 bit
diambil dan dikonversikan ke tegangan, hasil konversi dibandingan dengan dua nilai,
sebagai berikut:
Bila tegangan > 4 volt maka display LED, D0=ON yang lain padam
Bila tegangan < 2 volt maka display LED, D7=ON yang lain padam
Selain kondisi tersebut, maka semua LED padam
Petunjuk Praktikum AVR-Triwiyanto Page 63
a. Pengaturan pada codevision
Gambar 5.14. Konfigurasi ADC dengan mode interupsi dan PORTC pada codevision
b. Listing Program
#include <mega8535.h> #include <delay.h> #define ADC_VREF_TYPE 0x00 // ADC interrupt service routine interrupt [ADC_INT] void adc_isr(void) { unsigned int adc_data; // Read the AD conversion result adc_data=ADCW; // Place your code here if (adc_data > (4*1023)/5) { PORTC= 0b11111110; }
Petunjuk Praktikum AVR-Triwiyanto Page 64
else if (adc_data < (2*1023)/5) { PORTC= 0b01111111; } else { PORTC=0b11111111; } } // Declare your global variables here void main(void) { PORTC=0x00; DDRC=0xFF; // ADC initialization // ADC Clock frequency: 125.000 kHz // ADC Voltage Reference: AREF pin // ADC High Speed Mode: Off // ADC Auto Trigger Source: None ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x8B; SFIOR&=0xEF; // Global enable interrupts #asm("sei") while (1) { // Place your code here }; }
4. Display data ADC ke LCD Karakter
Pada percobaan ini, ADC yang digunakan adalah tipe 8 bit, dan data decimal akan
dimanipulasi sebelum ditampilkan pada LCD Karakter 2 x16. Pada percobaan ADC
ini akan menggunakan Channel 0, dengan inputan berasal dari Potensio, yang
#define ADC_VREF_TYPE 0x00 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00;
Petunjuk Praktikum AVR-Triwiyanto Page 69
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00;
Petunjuk Praktikum AVR-Triwiyanto Page 70
// ADC initialization // ADC Clock frequency: 125.000 kHz // ADC Voltage Reference: AREF pin // ADC High Speed Mode: Off // ADC Auto Trigger Source: Free Running ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0xA3; SFIOR&=0x0F; // LCD module initialization lcd_init(16); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("LAB.MIKRO - TEM"); lcd_gotoxy(0,1); lcd_putsf("SENSOR SUHU LM35"); delay_ms(1000); while (1) { lcd_clear( ); SUHU= read_adc(0); suhu_c=(float)SUHU*500/1023;//rumus untuk mengubah kedalam derajat celcius lcd_gotoxy(0,0); lcd_putsf("LAB MIKRO - TEM"); ftoa(suhu_c,1,sementara);//float to array, mengubah tipe data float ke //tipe data array yg kan ditampilkan di LCD lcd_gotoxy(0,1) ; lcd_puts(sementara); lcd_gotoxy(5,1) ; lcd_putchar(0xdf);//menampilkan karakter derajat lcd_putsf("C"); delay_ms(100); }; }
Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk
PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan
b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas
Petunjuk Praktikum AVR-Triwiyanto Page 71
c. Jelaskan masing-masing program tersebut diatas.
d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu
e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum
2. Buatlah rangkuman mengenai LCD karakter 2 x16
Petunjuk Praktikum AVR-Triwiyanto Page 72
PERCOBAAN 6
K E Y P A D
1. Percobaan Keypad dengan display LED
Pada percobaan ini keypad terhubung ke PORTB dan display ke LED, setiap
penekanan tombol pada keypad maka akan ditunjukkan perubahan kondisi pada
LED.
a. Konfigurasi pada codevision
Gambar 6.1. Konfigurasi PORTB dan PORTC
PB6PB5
1
5PB3
CAN
6PB4
COR
PB7
ENT
PB0 32
7
J7
CON8
12345678
MEN
|
|98
0
PB2PB1
4
Petunjuk Praktikum AVR-Triwiyanto Page 73
b. Listing Program
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
// Declare your global variables here
unsigned char dt, dtkey;
void detek_key(void);
void main(void)
{
// LCD module initialization
while (1)
{
// Place your code here
detek_key();
PORTC=dtkey;
delay_ms(5);
};
}
void detek_key(void) {
PORTB.4=0;
dt=(~PINB & 0x0F);
switch (dt)
{
case 1: dtkey=0x1;
break;
case 2: dtkey=0x4;
break;
case 4: dtkey=0x7;
break;
case 8: dtkey=0xa;
Petunjuk Praktikum AVR-Triwiyanto Page 74
break;
};
PORTB.4=1; PORTB.5=0;
dt=(~PINB & 0x0F);
switch (dt) {
case 1: dtkey=0x2;
break;
case 2: dtkey=0x5;
break;
case 4: dtkey=0x8;
break;
case 8: dtkey=0x0;
break;
};
PORTB.5=1; PORTB.6=0;
dt=(~PINB & 0x0F);
switch (dt) {
case 1: dtkey=0x3;
break;
case 2: dtkey=0x6;
break;
case 4: dtkey=0x9;
break;
case 8: dtkey=0xb;
break;
};
PORTB.6=1; PORTD.7=0;
dt=(~PINB & 0x0F);
switch (dt)
{
case 1: dtkey=0xc;
break;
case 2: dtkey=0xd;
break;
case 4: dtkey=0xe;
break;
case 8: dtkey=0xf;
break;
};
Petunjuk Praktikum AVR-Triwiyanto Page 75
PORTB.7=1;
}
6.2. Percobaan Keypad dengan 7 Segmen
Pada percobaan ini, setiap penekanan tombol pada keypad, data akan didisplaykan ke
7 segmen. Pada percobaan ini perlu dilakukan konfigurasi pada interface 7 segmen
yang terhubung ke PORTC dan PORTD, dan keypad terhubung ke PORTB dengan
konfigurasi seperti pada percobaan 6.1.
a. Konfigurasi pada codevision
Gambar 6.2. Konfigurasi PORTC dan PORTD pada 7 Segmen
b. Listing Program
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
Petunjuk Praktikum AVR-Triwiyanto Page 76
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
// Declare your global variables here
unsigned char dt, dtkey;
void detek_key(void);
void convert();
unsigned char data;
void main(void)
{
PORTB=0xFF;
DDRB=0xF0;
PORTC=0x00;
DDRC=0xFF;
// LCD module initialization
while (1)
{
// Place your code here
detek_key();
data=dtkey;
convert();
PORTD.5=0;
PORTD.6=0;
delay_ms(5);
};
}
void detek_key(void) {
PORTB.4=0;
dt=(~PINB & 0x0F);
switch (dt)
{
case 1: dtkey=0x1;
break;
Petunjuk Praktikum AVR-Triwiyanto Page 77
case 2: dtkey=0x4;
break;
case 4: dtkey=0x7;
break;
case 8: dtkey=0xa;
break;
};
PORTB.4=1; PORTB.5=0;
dt=(~PINB & 0x0F);
switch (dt) {
case 1: dtkey=0x2;
break;
case 2: dtkey=0x5;
break;
case 4: dtkey=0x8;
break;
case 8: dtkey=0x0;
break;
};
PORTB.5=1; PORTB.6=0;
dt=(~PINB & 0x0F);
switch (dt) {
case 1: dtkey=0x3;
break;
case 2: dtkey=0x6;
break;
case 4: dtkey=0x9;
break;
case 8: dtkey=0xb;
break;
};
PORTB.6=1; PORTD.7=0;
dt=(~PINB & 0x0F);
switch (dt)
{
case 1: dtkey=0xc;
break;
case 2: dtkey=0xd;
break;
Petunjuk Praktikum AVR-Triwiyanto Page 78
case 4: dtkey=0xe;
break;
case 8: dtkey=0xf;
break;
};
PORTB.7=1;
}
void convert(){
switch(data)
{
// pg fe dcba
case 0: PORTC=0b11000000;break;
case 1: PORTC=0b11111001;break;
case 2: PORTC=0b10100100;break;
case 3: PORTC=0b10110000;break;
case 4: PORTC=0b10011001;break;
case 5: PORTC=0b10010010;break;
case 6: PORTC=0b10000010;break;
case 7: PORTC=0b11111000;break;
case 8: PORTC=0b10000000;break;
case 9: PORTC=0b10010000;break;
default: PORTC=0xff;
}
}
Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas c. Jelaskan masing-masing program tersebut diatas. d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum 2. Buatlah rangkuman untuk fungsi TIMER/COUNTER pada AVR ATMEGA8535
(lihat datasheet)
Petunjuk Praktikum AVR-Triwiyanto Page 79
PERCOBAAN 8
COUNTER
Timer/Counter pada AT Mega 8535 terdiri dari 3 buah. Yaitu Timer/Counter0 ( 8bit ),
Timer/Counter1 ( 16 bit ), dan Timer/Counter2 ( 8 Bit ).
Timer/Counter0
Timer/Counter 0 adalah 8-bit Timer/Counter yang multifungsi. Deskripsi untuk
Timer/Counter 0 pada ATmega 8535 adalah sebagai berikut:
a. Sebagai Counter 1 kanal.
b. Timer di-nol-kan saat match compare (auto reload).
c. Dapat menghasilkan gelombang PWM dengan glitch-free.
d. Frekuensi generator.
e. Prescaler 10 bit untuk timer.
f. Interupsi timer yang disebabkan timer overflow dan match compare.
Pengaturan Timer/Counter 0 diatur oleh TCCR0 (Timer/Counter kontrol
Register0) yang dapat dilihat pada Gambar 2.5.
Gambar 8.1. Register TCCR0
Penjelasan untuk tiap bit-bitnya:
a. Bit 7 – FOC0: Force Output Compare.
Petunjuk Praktikum AVR-Triwiyanto Page 80
b. Bit 6,3 –WGM0:WGM00:Waveform generation Unit.
Bit ini mengontrol kenaikan isi counter, sumber nilai maksimum counter
dan tipe jenis Timer/Counter yang dihasilkan, yaitu mode normal, clear timer,
mode compare match, dan dua tipe dari PWM (Pulse Width Modulation). Tabel
2.2 berikut adalah setting pada bit ini untuk menghasilkan mode tertentu.
Tabel 8.1 Konfigurasi Bit WGM01 dan WGM00
Mode 0 (Normal): Timer/counter 0 berfungsi sebagai pencacah tungggal yang
dapat mencacah dari 0x00 sampai dengan 0xff. Setelah mencapai nilai maximum yaitu
0xff maka register counter (TCNT0) akan reset atau kembali 0x00.
Mode 1: Timer/counter 0 berfungsi sebagai phase correct PWM (PCP). Mode ini
digunakan untuk menghasilkan sinyal PWM dimana nilai register counter (TCNT0) yang
mencacah naik dan turun secara terus menerus akan selalu dibandingkan dengan
register pembanding 0CR0. Hasil pembandingan register TCNT0 dan OCR0 digunakan
untuk membangkitkan sinyal PWM yang dikeluarkan pada pin OC0 seperti gambar
Petunjuk Praktikum AVR-Triwiyanto Page 81
Gambar 8.2. Konfigurasi sinyal PWM
Frekuensi dan duty cycle PWM yang dihasilkan pada mode ini adalah
foc0= fosc/(N*512)
D=OCR0/255 *100%
Dimana
foc0= frekuensi output 0C0 mode PCP
fosc=frekuensi kristal
N=scala clock Tabel 2.6
Mode 2: Timer/counter 0 sebagai clear timer on compare match (CTC). Maksudnya
adalah register counter (TCNT0) akan mencacah naik kemudian akan direset atau
kembali manjadi 0x00 pada saat nilai TCNT0 sama dengan OCR0. Dengan mengatur
Petunjuk Praktikum AVR-Triwiyanto Page 82
keluaran OC0 bergulir (toggle) dapat membangkitkan gelombang kotak dengan
frekuensi:
foc0=fosc/(2*N* (1+OCR0))
0CR0= isi register 0CR0
Mode 3: timer /counter berfungsi sebagai fast PWM. Mode ini hampir sama dengan
mode phase correct PWM, hanya perbedaaanya adalah register TCNT0 mencacah naik
saja dan tidak pernah mencacah turun
Gambar 8.3. Konfigurasi PWM mode 3
Frekuensi dan duty cycle PWM yang dihasilkan pada mode fast PWM ini
foc0= fosc/(N*256)
D=OCR0/255 *100%
c. Bit 5, 4 – COM01:COM00: Compare Match Output Mode.
Bit ini mengontrol pin OC0 (Output Compare pin). Apabila kedua bit ini
nol atau clear maka pin OC0 berfungsi sebagai pin biasa tetapi bila salah
Petunjuk Praktikum AVR-Triwiyanto Page 83
satu bit set. Maka fungsi pin ini tergantung pada setting bit pada WGM00 dan
WGM01. Berikut Tabel 2.3 sampai dengan Tabel 2.5 adalah tabel setting bit ini
sesuai setting bit pada WGM00 dan WGM01.
Tabel 8.2. Konfigurasi Bit COM01 dan COM00 Compare Output Mode non PWM
Tabel 8.3. Konfigurasi Bit COM01 dan COM00 Compare Output Mode Fast PWM
Tabel 8.4. Konfigurasi Bit COM01 dan COM00 Compare Output Mode Phase
Correct PWM
d. Bit 2, 1, 0 – CS02; CS01, CS00: Clock Select.
Petunjuk Praktikum AVR-Triwiyanto Page 84
Ketiga bit ini untuk memilih sumber detak yang akan digunakan oleh
Timer/Counter, Tabel 2.6 berikut menampilkan konfigurasi pemilihan sumber
detak.
Tabel 8.5. Konfigurasi Bit Clock Select untuk memilih sumber detak
TCNTO (Timer/Counter Register 0)
Register TCNT0 berfungsi untuk menyimpan data cacahan timer/counter0. Karena
ukuran register TCNT0 hanya 8bit maka hanya dapat melakukan cacahan 0x00-0xff.
OCR0 (Output Compare Register0)
Register OCR0 berfungsi untuk menyimpan data pembanding yang akan selalu
dibandingkan dengan isi register TCNT0. Jika TCNT0 sama dengan OCR0 maka akan
terjadi event sesuai dengan mode yang telah ditentukan pada register TCCR0.
Petunjuk Praktikum AVR-Triwiyanto Page 85
Timer/Counter1
Timer/Counter1 adalah 16-bit Timer/Counter yang memungkinkan program
pewaktuan lebih akurat.
Berbagai fitur dari Timer/Counter1 sebagai berikut:
a. Desain 16 bit (juga memungkinkan 16 bit PWM).
b. Dua unit compare .
c. Dua unit register pembanding.
d. Satu unit input capture.
e. Timer dinolkan saat match compare (autoreload).
f. Dapat menghasilkan gelombang PWM dengan glitch-free.
g. Periode PWM yang dapat diubah-ubah.
h. Pembangkit frekuensi.
i. Empat buah sumber interupsi (TOV1, OCF1A, OCF1B dan ICF1).
Pengaturan Timer/Counter 1 diatur melalui register TCCR1A yang dapat dilihat
pada Gambar 2.6.
Gambar 8.3. Register TCCR1A
Petunjuk Praktikum AVR-Triwiyanto Page 86
Penjelasan untuk tiap bit-bitnya:
a. Bit 7:6 – COM1A1:0: Compare Output Mode untuk channel A.
Bit 5:4 – COM1B1:0: Compare Output Mode untuk channel B.
Register COM1A1:0 dan COM1B1:0 mengontrol kondisi Pin Output
Compare (OC1A dan OC1B). Jika salah satu atau kedua bit pada register
COM1A1:0 ditulis menjadi satu maka kaki pin OC1A tidak berfungsi normal
sebagai port I/O. Begitu juga pada register COM1B1:0 ditulis menjadi satu maka
kaki pin OC1B juga tidak berfungsi normal sebagai port I/O. Fungsi pada pin
OC1A dan OC1B tergantung pada setting bit pada register WGM13:0 diset
sebagai mode PWM atau mode non-PWM.
b. Bit 3 – FOC1A: Force Output Compare untuk channel A.
Bit 2 – FOC1B: Force Output Compare untuk channel B.
c. Bit 1:0 – WGM1 1:0: Waveform Generation Mode.
Dikombinasikan dengan bit WGM13:2 yang terdapat pada register
TCCR1B, bit ini mengontrol urutan pencacah dari counter, sumber maksimum
(TOP) nilai counter, dan tipe dari gelombang yang dibangkitkan. Mode yang
dapat dilakukan antara lain: mode normal, mode Clear Timer on Compare Match
(CTC) dan tiga tipe mode PWM.
Setingan mode dapat dilihat pada tabel berikut:
Petunjuk Praktikum AVR-Triwiyanto Page 87
Tabel 8.6. Konfigurasi Bit Compare Output Mode non PWM
Tabel 8.7. Konfigurasi Bit Compare Output Mode Fast PWM
Petunjuk Praktikum AVR-Triwiyanto Page 88
Tabel 8.8. Konfigurasi Bit Compare Output Mode Phase Correct dan Frequency
Correct PWM
Tabel 8.9. Konfigurasi mode PWM
Pengaturan Timer/Counter 1 juga diatur melalui register TCCR1B yang dapat
dilihat pada Gambar 2.7.
Petunjuk Praktikum AVR-Triwiyanto Page 89
Gambar 2.7 Register TCCR1B
Penjelasan untuk tiap bit-bitnya:
a. Bit 7 – ICNC1: Input Capture Noise Canceller.
b. Bit 6 – ICES1: Input Capture Edge Select.
c. Bit 5 : Tidak digunakan.
d. Bit 4:3 – WGM13:2: Waveform Generation Mode.
e. Bit 2:0 – CS12:0: Clock Select.
Ketiga bit ini mengatur sumber detak yang digunakan untuk
Timer/Counter1. Untuk setingannya dapat dilihat pada Tabel 2.11.
Tabel 8.10 Konfigurasi bit Clock Select untuk memilih sumber detak
Petunjuk Praktikum AVR-Triwiyanto Page 90
Timer/Counter2
Timer/ counter2 sama persis dengan timer/counter 0.
Timer/Counter 2 adalah 8-bit Timer/Counter yang multifungsi. Deskripsi untuk
Timer/Counter 0 pada ATmega 16 adalah sebagai berikut:
a. Sebagai Counter 1 kanal.
b. Pewaktu di-nol-kan saat match compare (autoreload).
c. Dapat mengahasilkan gelombang PWM dengan glitch-free.
d. Frekuensi generator.
e. Prescaler 10 bit untuk pewaktu.
f. Intrupsi timer yang disebabkan timer overflow dan match compare.
Pengaturan Timer/Counter 2 diatur oleh TCCR2 (Timer/Counter kontrol Register
0) yang dapat dilihat pada Gambar 2.8.
Gambar 2.8 Register TCCR2
Penjelasan untuk tiap bit-bitnya:
a. Bit 7 – FOC2: Force Output Compare.
Petunjuk Praktikum AVR-Triwiyanto Page 91
b. Bit 6,3 –WGM21:WGM20: Waveform Generation Unit.
Bit ini mengontrol kenaikan dari counter, sumber dari nilai maksimum counter,
dan tipe dari jenis Timer/Counter yang dihasilkan yaitu mode normal, clear timer,
mode compare match, dan dua tipe dari PWM (Pulse Width Modulation). Berikut
tabel seting pada bit ini untuk menghasilkan mode tertentu.
Tabel 8.11 Konfigurasi Bit WGM21 dan WGM20
c. Bit 5, 4 – COM01:COM00: Compare Match Output Mode.
Bit ini mengontrol pin OC0 (Output Compare pin). Apabila kedua bit ini nol atau
clear maka pin OC0 berfungsi sebagai pin biasa tetapi bila salah satu bit set.
Maka fungsi pin ini tergantung dari seting bit pada WGM00 dan WGM01. Berikut
daftar tabel setting bit ini sesuai seting bit pada WGM00 dan WGM01.
d. Bit 2, 1, 0 – CS22; CS21, CS20: Clock Select.
Ketiga bit ini untuk memilih sumber detak yang akan digunakan oleh
Timer/Counter .
Petunjuk Praktikum AVR-Triwiyanto Page 92
Tabel 8.12 Konfigurasi Bit COM21 dan COM20 Compare Output Mode nonPWM
Tabel 8.13 Konfigurasi Bit COM21 dan COM20 Compare Output Mode Fast PWM
Tabel 8.14 Konfigurasi Bit COM21 dan COM20 Compare Output ModePhase Correct
PWM
Petunjuk Praktikum AVR-Triwiyanto Page 93
Tabel 8.15 Konfigurasi Bit Clock Select untuk memilih sumber detak
Masing-masing timer/counter memiliki register tertentu yang digunakan untuk mengatur
mode dan cara kerja nya tetapi ada dua register yang digunakan bersamaan yaitu
Register TIMSK dan TIFR
Register TIMSK
Bit0 – Timer/Counter0 Overflow Interrupt Enable
jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan enable
interupsi overflow Timer/Counter0
Bit1- Timer/Counter0 Output Compere Match Interrupt Enable
jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan
enable Interupsi Output Compere Match
Bit2- Timer/Counter1 Overflow Interrupt Enable
jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan
enable interupsi overflow Timer/Counter1
Bit3- Timer/Counter1 Output Compere B Match Interrupt Enable
Petunjuk Praktikum AVR-Triwiyanto Page 94
Bit4- Timer/Counter1 Output Compere A Match Interrupt Enable
Bit7- Timer/Counter2 Output Compere Match Interrupt Enable
Register TIFR
Bit0 – Timer/Counter0 Overflow Flag
Bit akan bernilai satu jika Timer/Counter0 Overflow. Bit dapat dinolkan lagi
dengan memberikan logika satu ke bit Flag ini.
Bit1- Output Comapre Flag 0
Bit akan berniali satu jika nilai pada Timer/Counter0 sama dengan nilai pada
OCR0 –Output Comapre
Petunjuk Praktikum AVR-Triwiyanto Page 95
8.1. Percobaan COUNTER Display LED
#include<mega8535.h>
void main()
{
PORTC=0xFF;
DDRC=0xFF;
TCCR0=0b00000110;
TCNT0=0;
while(1)
{PORTC=~TCNT0;}
}
XTAL1
PB1
PC5
PC7
PA0
PB7
PD3PD2
PA6
PD6
PA3
PD7PC0
VCC
PD0PC6
PA5
PC1
PB0
PD1
AREF
PB4
PC4
PB6
PB2
PB5
GND
IC1
ATMEGA8535-DIL40
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
XTAL2
PD5
PA1
PD4
PC3PC2
VCC
PA4
PA7
PA2
GND
Petunjuk Praktikum AVR-Triwiyanto Page 96
8.2. Percobaan Counter dengan Display 7 Segmen
Pada percobaan ini, akan menggunakan fungsi COUNTER pada TIMER0 dengan
mengatur sumber clock pada T0 atau PB0, sehingga pada saat ada transisi High to Low
maka akan menaikkan isi register TCNT0. Agar nilai TCNT0 dapat ditampilkan pada 7
segmen maka harus dilakukan pembagian nilai decimal ke Ratusan, Puluhan dan
Satuan. Karena counter yang digunakan adalah TIMER0 8 bit, maka nilai cacahan yang
dimungkinkan adalah 000 sampai dengan 255.
a. Konfigurasi pada codevision
Gambar Konfigurasi TIMER 0 sebagai Counter
Petunjuk Praktikum AVR-Triwiyanto Page 97
Gambar Konfigurasi PORTC sebagai output dan konfigurasi PORTD sebagai output
pada PORTD.5, 6 dan 7.
b. Listing program.
#include <mega8535.h> #include <delay.h> int ubah; int sat,pul,rat; unsigned int data; // Declare your global variables here void ubah_ke_format7segment() //fungsi untuk mengubah kedalam format 7segment { if (ubah==0){ubah=0xc0;} if (ubah==1){ubah=0xf9;} if (ubah==2){ubah=0xa4;} if (ubah==3){ubah=0xb0;} if (ubah==4){ubah=0x99;} if (ubah==5){ubah=0x92;} if (ubah==6){ubah=0x82;} if (ubah==7){ubah=0xf8;} if (ubah==8){ubah=0x80;} if (ubah==9){ubah=0x90;}
Petunjuk Praktikum AVR-Triwiyanto Page 98
} void tampil_7segment() { PORTC=rat;//mengirimkan data kedigit6 PORTD.5=1; PORTD.6=0; PORTD.7=0; delay_ms(10); PORTC=pul;//mengirimkan data kedigit7 PORTD.5=0; PORTD.6=1; PORTD.7=0; delay_ms(10); PORTC=sat;//mengirimkan data kedigit8 PORTD.5=1; PORTD.6=1; PORTD.7=0; delay_ms(10); //lamanya waktu scanning ditentukan oleh intruksi delay } void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0xFF;
Petunjuk Praktikum AVR-Triwiyanto Page 99
// Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0b11100000; // Timer/Counter 0 initialization // Clock source: T0 pin Falling Edge // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x06; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00;
Petunjuk Praktikum AVR-Triwiyanto Page 100
// External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; while(1) { data = TCNT0; sat = data % 10; // sat = sisa dari data dibagi 10 pul = data / 10; pul = pul % 10; rat = data / 100; rat = rat % 10; // ubah=sat; ubah_ke_format7segment(); sat=ubah; // ubah=pul; ubah_ke_format7segment(); pul=ubah; // ubah=rat; ubah_ke_format7segment(); rat=ubah; // tampil_7segment(); } }
Petunjuk Praktikum AVR-Triwiyanto Page 101
8.3. Percobaan Couanter dengan LCD Karakter
Buatlah pemrograman untuk percobaan tersebut.
Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas c. Jelaskan masing-masing program tersebut diatas. d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum 2. Buatlah rangkuman IC RTC 1307 (lihat datasheet)
Petunjuk Praktikum AVR-Triwiyanto Page 102
PERCOBAAN 7
T I M E R
Pada ATmega8535 terdapat 3 buah timer, yaitu Timer0 (8 bit), Timer1 (16 bit)
dan Timer2 (8 bit). Untuk perbedaan dan cara kerja masing-masing timer, teman-
teman dapat membacanya pada datasheet. Disini saya akan coba membahas
Timer0 dan Timer1 saja.
Perhitungan untuk Timero dan Timer1 adalah sebagai berikut:
!" #$%& ' ()*+,- ./01
" atau
()*+, # !" 2 $%& - "
.!34
Keterangan:
TCNT : Nilai yang diberikan pada register timer (TCNT)
�567 : frekuensi clock (crystal) yang digunakan
89:;<= : waktu timer yang dinginkan untuk overflow
n : Jumlah bit pada TIMER/COUNTER
N : Prescaler (1, 8,64, 256, 1024 )
Contoh 1:
Rencanakan sebuah Timer dengan menggunakan timer1 16 bit yang dapat bekerja
selama 1 detik, dengan frekuensi clock sebesar 1 MHz dan prescaler 64, tentukan nilai
TCNT1H dan TCNT1L.
TCNT #65.536& '� C �.���.���
D�
TCNT 49.911
TCNT C2F7h
Petunjuk Praktikum AVR-Triwiyanto Page 103
Sehingga didapatkan nilai TCNT1L = F7h dan TCNT1H = C2
Konfigurasi pada codevision, clock value didapatkan dengan pembagian, f clock 1MHz
dibagi dengan prescaler 64 sehingga didapatkan frekuensi clock ke TIMER/COUNTER
15,625 kHz.
Gambar 7.1. Konfigurasi pada codevision pada TIMER1
Contoh 2:
Rencanakan program untuk Timer dengan menggunakan TIMER0 8 bit. Yang
digunakan sebagai pembangkit waktu 0.1 detik, dengan frekuensi clock 1 MHz dan
prescaler 1024.
TCNT #256& '� C �.���.���
����
TCNT 158,34
TCNT 9Eh
Petunjuk Praktikum AVR-Triwiyanto Page 104
Sehingga didapatkan nilai TCNT0 =9Eh
Konfigurasi pada codevision, clock value didapatkan dengan pembagian, f clock 1MHz
dibagi dengan prescaler 1024 sehingga didapatkan frekuensi clock ke
TIMER/COUNTER 0,977 kHz.
Gambar 7.2. Konfigurasi pada codevision pada TIMER0
Petunjuk Praktikum AVR-Triwiyanto Page 105
7.1. Percobaan Waktu Tunda Display LED
Pada percobaan ini, akan dibangkitkan waktu tunda untuk menghidupkan 8 buah LED
secara flip-flop, terus menerus, dengan waktu tunda yang dibangkitkan dari
penggunaan TIMER 0, mode interupsi.
a. Konfigurasi pada codevision
PC
7
PC
0
R5220
PC
4
R6220
D4
LED
PC
3
PC
2
PC
5
D8
LED
R8220
R2220
D7
LED
D1
LED
R7220
PC
1
R4220
PC
6
VCC
D5
LED
J3 CON2
12
D6
LED
R1220
D2
LED
R3220
D3
LED
Petunjuk Praktikum AVR-Triwiyanto Page 106
b. Listing program
#include<mega8535.h>
unsigned char led=0x00;
interrupt [TIM0_OVF] void timer0_overflow(void)
{
TCNT0=0x00;
led=~led;
PORTC=led;
}
void main(void){
DDRC=0xff;
PORTC=0xff;
TCNT0=0x00;
TCCR0=0x05;
TIMSK=0x01;
TIFR=0x00;
#asm("sei")
while(1)
{
}
}
Percobaan 7.2. Geser LED dengan waktu Tunda
Pada percobaan ini sebuah LED akan digeser ke kiri dengan waktu tunda yang
diberikan dari TIMER0.
a. Konfigurasi codevision ( sama dengan percobaan 7.1)
b. Listing Program
#include <mega8535.h>
unsigned char led=0xfe;
interrupt [TIM0_OVF] void timer0_overflow(void)
{
Petunjuk Praktikum AVR-Triwiyanto Page 107
TCNT0=0x00; // setting inisial counter0
led<<=1; // geser data led ke kiri 1 kali
led|=1; // led di-OR-kan dengan data 1
if (led==0xff)
{led=0xfe; }
PORTC=led; // keluarkan data led ke port C
}
void main (void)
{
DDRC=0xff; // port C sebagai output
PORTC=led;
TCNT0=0x00; // setting inisial counter0
TCCR0=0x05; // setting skala clock
TIMSK=0x01; // aktifkan interrupt timer0
TIFR=0x00; // hapus bendera interrupt timer0
#asm ("sei");
while(1)
{PORTC=led;
}
}
7.3. Percobaan Timer pada Pembuatan Jam Digital Detik
Pada percobaan ini akan dibuat simulasi jam digital dengan angka mulai dari 00 sampai
dengan 99, bila nilai data =100, maka akan kembali lagi ke 00. Program ini
menggunakan system interupsi yang dibangkitkan dari TIMER 1, 16 bit. Satu kali
interupsi yang dibangkitkan adalah sebesar 1 detik, dan menaikkan nilai data. Data
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
jam_digital();
tampil_lcd();
set_jam();
};
}
Petunjuk Praktikum AVR-Triwiyanto Page 121
Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas c. Jelaskan masing-masing program tersebut diatas. d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum
Petunjuk Praktikum AVR-Triwiyanto Page 122
PERCOBAAN 9
P W M (Pulse Width Modulation)
PWM (Pulse Width Modulation) atau modulasi lebar pulsa adalah salah satu
keunggulan Timer/Counter yang terdapat pada Atmega8535. Ketiga jenis
Timer/Counter pada Atmega8535 dapat menghasilkan pulsa PWM. Pulsa PWM adalah
sederetan pulsa yang lebar pulsanya dapat diatur. Pulsa PWM berfungsi mengatur
kecepatan motor DC, mengatur gelap terang LED dan aplikasi lainnya. PWM adalah
Timer mode Output Compare yang canggih. Mode PWM Timer juga dapat mencacah
turun yang berlawanan dengan mode Timer lainnya yang hanya mencacah naik. Pada
mode PWM tersebut, Timer mencacah naik hingga mencapai nilai TOP, yaitu 0xFF
(255) untuk PWM 8 bit dan 0x3FF (1023) untuk PWM 10 bit atau 0x1ff untuk PWM 9bit.
Timer/Counter 0 dan Timer/Counter 2 hanya memiliki PWM 8 bit, sedangkan pada
Timer/Counter 1 memiliki 8 bit, 9bit dan PWM 10 bit. Pemilihan mode PWM diatur oleh
register-register Timer/counter seperti yang sudah di jelaskan sebelumnya.
PWM dengan timer/counter1
timer/counter1 dapat digunakan untuk membangkitkan 2 channel PWM yang masing-
masing berdiri sendiri atau tidak tergantung satu sama lain. Berikut adalah contoh listing
program PWM 10bit. Keluaran OC1A merupakan PWM A dan keluaran OC1B
merupakan PWM B.
Percobaan
#include <mega8535.h>
void main(void)
{
DDRD=0xff;
//inisialisasi timer1 sebagai fast pwm 10bit
Petunjuk Praktikum AVR-Triwiyanto Page 123
TCCR1A=0xA3;
TCCR1B=0X0B;
TCNT1=0x0000;
OCR1A=0x0100; //setting duty cycle 25% (PWMA)
OCR1B=0x0300; //setting duty cycle 75% (PWMB)
while(1);}
penjelasan:
secara garis besar, cara kerja mode fast pwm 10-bit pada program diatas adalah
dengan membandingkan isi register TCNT1 dengan register OCR1A dan OCR1B untuk
menghasilkan keluaran PWM. Isi register TCNT1 akan mencacah naik setiap interval
waktu tertentu detak clock kristal sesuai pengaturan register TCCR1B sampai bernilai
maksimum 0x03ff (1023). Selama nilai register TCNT1 lebih kecil dari data pembanding
yaiut OCR1A atau OCR1B maka keluaran pin OC1A dan OC1B akan high dan jika
TCNT1 sudah melebihi data pembanding OCR1A atau OCR1B maka keluaran OC1A
dan OC1B akan low. Jika nilai TCNT1 sudah mencapai maksimum yaitu 0x03ff maka
nilai TCNT1 akan reset kembali ke 0x0000.
Pada program diatas TCCR1A diisi 0xA3 berarti mode fast PWM 10bit dengan pola
keluaran OC1A dan OC1B adalah high selama TCNT1 lebih kecil dari OCR1A-OCR1B
dan low setelah TCNT1 melebihi OCR1A-OCR1B. Register TCCR1B diisi 0x0b berarti
sekala clock 64. Sehingga jika kristal yang digunakan 8MHZ maka
fpwm=fosc / (N * (1+TOP))
fpwm= 8000000 / (64*(1+1023))
fpwm=122Hz
atau dinyatakan periode adalah
Petunjuk Praktikum AVR-Triwiyanto Page 124
Tpwm=1/fpwm
Tpwm=(1+TOP) *Tosc *N
Tpwm=(1+1023) * 0.125us *64
Tpwm=8.192ms
Duty cycle = OCR1A /TOP *100%
256/1023 *100% =25%
OCR1B /TOP *100% == 768/1023 *100% =75%
Petunjuk Praktikum AVR-Triwiyanto Page 125
Percobaan 10.1. Setting PWM
#include <stdio.h>
#include <mega8535.h>
#include <delay.h>
void InisialisasiPWM();
int data1;
int data2;
void main (void)
5V
C3 100nF1
pinb.5
X1
5V
RST
R1
SW2
12
TIP9013
TIP3055
U1
ATMEGA8535
3
1213
2
16171819
1110
876
3635343332
37
1
45
9
1415
20 21
403938
31302928272625242322
PB2(INT2/AIN0)
XTAL2XTAL1
PB1(T1)
PD2(INT0)PD3(INT1)PD4(OC1B)PD5(OC1A)
GNDVCC
PB7[SCK)PB6[MISO)PB5(MOSI)
PA4(ADC4)PA5(ADC5)PA6(ADC6)PA7(ADC7)
AREF
PA3(ADC3)
PB0(XCK/T0)
PB3(OC0/AIN1)PB4(SS)
RESET
PD0(RXD)PD1(TXD)
PD6(ICP) PD7(OC2)
PA0(ADC0)PA1(ADC1)PA2(ADC2)
AGNDAVCC
PC7(TOSC2)PC6(TOSC1)
PC5PC4PC3PC2
PC1(SDA)PC0(SCL)
D2
DIODE
D1
DIODE
12V2
JISP
12345
pinb.7
C2 22pF
TIP9013
5V
pinb.7
pinb.6
470 TIP3055
pinb.6
470
MG2
MOTOR DC
12
MG2
MOTOR DC
12
RST
pinb.5
12V2
C1 22pF
Petunjuk Praktikum AVR-Triwiyanto Page 126
{
InisialisasiPWM();
while(1)
{
data1 = 50;
data2 = 1024;
OCR1A=data1;
OCR1B=data2;
TIFR=0;
}
}
void InisialisasiPWM()
{
DDRD=0xff;
TCCR1A=0xa3;
TCCR1B=0x0b;
TCNT1=0x0000;
}
Percobaan 10.2. Control PWM 8bit dengan ADC
#include <mega8535.h>
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#define ADC_VREF_TYPE 0x60
unsigned char data1,data2;
char lcd_buffer[33];
Petunjuk Praktikum AVR-Triwiyanto Page 127
void inisialisasi_PORT()
{
//PORT initialization as input or output
DDRA=DDRB=0x00; //input
DDRC=DDRD=0xFF; //output
PORTB=0xff;//pull up
}
void inisialisasi_PWM_on()
{
TCCR1A=0xA1;
TCCR1B=0x0c;
}
void inisialisasi_PWM_off()
{
TCCR1A=0x00;
TCCR1B=0x00;
}
void pwm1(unsigned char satu)
{
OCR1AL=satu;
PORTD.0=0;
PORTD.1=1;
}
void pwm2(unsigned char dua)
{
OCR1BL=dua;
Petunjuk Praktikum AVR-Triwiyanto Page 128
PORTD.2=1;
PORTD.3=0;
}
void inisialisasi_LCD()
{
// LCD module initialization
lcd_init (16);
}
unsigned char read_adc(unsigned char input_adc)
{
ADMUX=input_adc|ADC_VREF_TYPE;
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
void inisialisasi_ADC()
{
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x87;
}
void main(void)
{
//Panggil Fungsi
inisialisasi_PORT();
inisialisasi_ADC();
Petunjuk Praktikum AVR-Triwiyanto Page 129
inisialisasi_LCD();
inisialisasi_PWM_on();
while(1){
data1=read_adc(0);
data2=read_adc(1);
pwm1(data1);
pwm2(data2);
if(PINB.0==0) {inisialisasi_PWM_off();
lcd_clear();
lcd_putsf("pwm off");
delay_ms(100);
}
else {inisialisasi_PWM_on();
lcd_clear();
lcd_putsf("fast PWM 8-bit");
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"PWM1=%i",data1);
lcd_puts(lcd_buffer);
lcd_gotoxy(8,1);
sprintf(lcd_buffer,"PWM2=%i",data2);
lcd_puts(lcd_buffer);
delay_ms(100);
} ;
}}
Petunjuk Praktikum AVR-Triwiyanto Page 130
Petunjuk Praktikum AVR-Triwiyanto Page 131
PERCOBAAN 10
INTERUPSI
Interrupt adalah suatu kejadian atau peristiwa yang menyebabkan mikrokontroler
berhenti sejenak untuk melayani interrupt tersebut.
Yang harus diperhatikan untuk menguanakan interupsi adalah, kita harus tau sumber-
sumber interupsi, vektor layanan interupsi dan yang terpenting rutin lyanan interupsi,
yaitu subrutin yang akan dikerjakan bila terjadi interupsi .
Interrupt Service Routine.
Analoginya adalah sebagai berikut, seseorang sedang mengetik laporan, mendadak
telephone berdering dan menginterrupsi orang tersebut sehingga menghentikan
pekerjaan mengetik dan mengangkat telephone. Setelah pembicaraan telephone yang
dalam hal ini adalah merupakan analogi dari Interrupt Service Routine selesai maka
orang tersebut kembali meneruskan pekerjaanya mengetik. Demikian pula pada sistem
mikrokontroler yang sedang menjalankan programnya, saat terjadi interrupt, program
akan berhenti sesaat, melayani interrupt tersebut dengan menjalankan program yang
berada pada alamat yang ditunjuk oleh vektor dari interrupt yang terjadi hingga selesai
dan kembali meneruskan program yang terhenti oleh interrupt tadi. Seperti yang terlihat
Gambar di bawah, sebuah program yang seharusnya berjalan terus lurus, tiba-tiba
terjadi interrupt dan harus melayani interrupt tersebut terlebih dahulu hingga selesai
sebelum ia kembali meneruskan pekerjaannya.
Petunjuk Praktikum AVR-Triwiyanto Page 132
AVR menyediakan beberapa sumber interupsi yang berbeda. Tiap-tiap interupsi
dan reset memiliki vektor program yang berbeda. Semua interupsi didasari satu bit
tunggal yang harus diberi logika tinggi sebagai Global Interrupt Enable pada Status
Register untuk mengaktifkan interupsi.
Atmega8535 menyediakan 21 macam sumber interupsi yang masing-masing
memiliki alamata vektor interupsi seperti pada tabel 19. Setiap interupsi yang aktif akan
dilayani segera setelah terjadi permintaan interupsi, tapi jika dalam waktu bersamaan
terjadi lebih dari satu interupsi maka perioritas yang akan diselesaikan terlebih dahulu
adalah interupsi yang memiliki urut lebih kecil sesuai tabel 19 berikut.
Petunjuk Praktikum AVR-Triwiyanto Page 133
Pada AVR terdapat 3 pin interupsi eksternal, yaitu INT0,INT1,dan INT2. Interupsi
eksternal dapat dibangkitkan apabila ada perubahan logika baik transisi naik (rising
edge) maupun transisi turun (falling edge) pada pin interupsi. Pengaturan kondisi
keadaan yang menyebabkan terjadinya interupsi eksternal diatur oleh 2 buah register
I/O yaitu MCUCR dan register MCUCSR
Petunjuk Praktikum AVR-Triwiyanto Page 134
MCUCR ( MCU Control Register), mengatur pemicu interupsi dan fungsi MCU secara
umum.
Bit penyusunnya:
Bit ISC11 dan ISC10 bersama-sama menentukan kodisi yang dapat
menyebakan interupsi eksternal pada pin INT1. Dan Bit ISC01 dan ISC00
bersama-sama menentukan kodisi yang dapat menyebakan interupsi eksternal
pada pin INT0. keadaan selengkapnya terlihat pada table berikut :
ISCx1 ISCx0 Pemicu interupsi
0 0 Level rendah pada pin INT0 atau INT1
0 1 Perubahan level pada pin INT0 atau INT1
1 0 Transisi turun pada pin INT0 atau INT1
1 1 Transisi naik pada pin INT0 atau INT1
MCUCSR ( MCU Control and Status Register)
Bit 6 – ISC2 : interrupt sense control INT2
Untuk interupsi INT2 hanya memiliki satu bit ISC, sehingga hanya memiliki 2 kondisi
pemicu interupsi yaitu:
‘0’ = interupsi terjadi jika terjadi transisi turun pada pin INT2
Petunjuk Praktikum AVR-Triwiyanto Page 135
‘1’= interupsi terjadi jika terjadi transisi naik pada pin INT2
Untuk sumber interupsi INT2, perubahan/transisi sinyal yang dapat membangkitkan
intrupsi harus memiliki lebar pulsa minimal sekitar 50ns.
GICR
Pemilihan pengaktifan interupsi eksternal diatur oleh register GICR ( General Interrupt
Control Register ) yang terlihat pada gambar berikut :
Bit penyusunnya dapat dijelaskan sebagai berikut:
� Bit INT1 adalah bit untuk mengaktifkan interupsi eksternal 1. Apabila bit tersebut
diberi logika 1 dan bit I pada SREG (status register) juga satu , maka interupsi
eksternal 1 akan aktif.
� Bit INT0 adalah bit untuk mengaktifkan interupsi eksternal 0. Apabila bit tersebut
diberi logika 1 dan bit I pada SREG (status register) juga satu , maka interupsi
eksternal 0 akan aktif.
� Bit INT2 adalah bit untuk mengaktifkan interupsi eksternal 2. Apabila bit tersebut
diberi logika 1 dan bit I pada SREG (status register) juga satu , maka interupsi
eksternal 2 akan aktif.
SREG (Status Register)
Digunakan untuk menyimpan informasi dan hasil operasi aritmatika terakhir. Data
SREG selalu berubah setiap instruksi atau operasi pad ALU dan datanya tidak otomatis
tersimpan apabila terjadi instruksi percabangan baik karena interupsi maupun
lompatan.
Petunjuk Praktikum AVR-Triwiyanto Page 136
Bit 7 – I : Global interrupt enable
Bit I digunakan untuk mengaktifkan interupsi secara umum (interupsi global). Jika bit I
bernilai ‘1’ maka interupsi secara umum aktif, tetapi jika ‘0’ maka tidak satupun interupsi
yang aktif.
10.1. Percobaan Interupsi LED
Pada percobaan ini, dua buah interupsi yang dibangkitkan secara eksternal dari INT0
dan INT1 akan merubah kondisi LED yang terhubung pada PORTC. Bila terjadi
interupsi pada INTO maka kondisil LED adalah : 11110000, sebaliknya bila terjadi
inteerupsi pada INT1 maka kondisi LED adalah : 00001111.
Pada percobaan ini akan menggunakan tiga buah interupsi eksternal INT0, INT1
dan INT2, masing-masing interupsi akan menampilkan LED yang berbeda-beda.
a. Konfigurasi pada Codevision
b. Listing Program.
#include <mega8535.h> // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { // Place your code here PORTC=0xf0; } // External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { // Place your code here PORTC=0x0f; } // External Interrupt 2 service routine
Petunjuk Praktikum AVR-Triwiyanto Page 139
interrupt [EXT_INT2] void ext_int2_isr(void) { // Place your code here PORTC=0x55; } // Declare your global variables here void main(void) { PORTD=0x00; DDRD=0x00; DDRC=0xff; PORTC=0xff; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Low level // INT1: On // INT1 Mode: Low level // INT2: On // INT2 Mode: Falling Edge GICR|=0xE0; //aktifkan semua external interupsi MCUCR=0x00; //level rendah INT0 dan INT1 MCUCSR=0x00;//Falling edge, transisi turun GIFR=0xE0; // Global enable interrupts #asm("sei") while (1) { };}
Petunjuk Praktikum AVR-Triwiyanto Page 140
PERCOBAAN 11
Serial communication
USART (universal synchronous and asynchronous serial receiver and transmitter) juga
merupakan salah satu mode komunikasi serial yang dimiliki atmega8535. USART
memiliki fleksibilitas yang tinggi, yang dapat digunakan untuk melakukan transfer data
baik antar mikrokontroller maupun dengan modul-modul ekternal termasuk PC yang
memiliki fitur UART.
USART memungkinkan transmisi data baik secara synchronous maupun asynchronous
sehingga dengan demikian USART pasti kompatible dengan UART. Pada atmega8535,
secara umum pengaturan mode komunikasi baik synchronous maupun asynchronous
adalah sama. Perbedaan hanyalah terletak pada sumber clock saja. Jika pada mode
asynchronous masing-masing peripheral memiliki sumber clock sendiri maka pada
mode synchronous hanya ada satu clock sumber yang digunakan bersama-sama.
Dengan demikian secara hardware untuk mode asynchronous hanya membutuhkan 2
pin yaitu TXD dan RXD sedangkan untuk asynchronous harus 3pin yaitu TXD,RXD, dan
XCK.
USART Data Register (UDR)
Digunakan sebagai buffer untuk menyimpan data baik yang akan dikirimkan maupun
yang diterima dalam komunikasi USART.
KONFIGURASI TIMER/COUNTER DAN INTERRUPT
Gambar dan table berikut ini dikutipkan dari datasheet ATMega 8525:
Petunjuk Praktikum AVR-Triwiyanto Page 141
• Pengaturan sumber clock (hal. 85)
Pahami Timing Diagram!
• Register-register penting lain (hal. 85)
Petunjuk Praktikum AVR-Triwiyanto Page 142
Petunjuk Praktikum AVR-Triwiyanto Page 143
Berikut adalah contoh program komunikasi 2 buah mikrokontroller
Pada program ini, mikrokontroller1 akan mengirimkan data sesuai penekanan tombol
pada PORTA, dan mikrokontroller2 menerima data kemudian mengeluarkan ke
PORTA. Dalam penyambungan antara 2 mikrokontroller ini, TXD mikro1 dihubungkan
dengan RXD mikro2 dan RXD mikro1 dihubungkan dengan TXD mikro2.
Program mikrokontroller1
#include<mega8535.h>
#include<delay.h>
const long int osilator = 8000000;
unsigned long int UBRR;
unsigned char data;
void inisialisasiuart (unsigned long int baud_rate)
{
UBRR=(osilator/(16*baud_rate))-1;
UBRRL=UBRR;
UBRRH=UBRR>>8;
Petunjuk Praktikum AVR-Triwiyanto Page 144
UCSRB=0b00011000;
UCSRC=0x8e;
}
void kirim()
{
while(!(UCSRA & 0x20));
UDR=data;
}
void check()
{
while(!(UCSRA & 0x20));
UDR='*';
}
void main(void){
DDRA=0x00;
PORTA=0xff;
inisialisasiuart(9600);
while(1){
data=PINA;
check();
kirim();
}
}
Program mikrkontroller2
#include<mega8535.h>
#include<delay.h>
const long int osilator = 8000000;
Petunjuk Praktikum AVR-Triwiyanto Page 145
unsigned long int UBRR;
unsigned char data,check;
void inisialisasiuart (unsigned long int baud_rate)
{
UBRR=(osilator/(16*baud_rate))-1;
UBRRL=UBRR;
UBRRH=UBRR>>8;
UCSRB=0b00011000;
UCSRC=0x8e;
}
unsigned char terima_byte(void)
{
while(!(UCSRA & 0x80));
return UDR;
}
void main(void){
DDRA=0xff;
PORTA=0;
inisialisasiuart(9600);
while(1){
ulangi:
check=terima_byte();
if(check=='*')goto lanjut;
else{goto ulangi;};
lanjut:
data=terima_byte();
PORTA=data;
Petunjuk Praktikum AVR-Triwiyanto Page 146
}
}
Komunikasi dengan komputer
Komunikasi komputer dengan mikrokontroller membutuhkan hardware tambahan yaitu
dengan menggunakan max232 yang berfungsi sebagai penyama level tegangan antara
komputer dan mikrokontroller. Sedangkan tuk penyambungannya sama yaitu TXD
mikro dengan RXD komputer dan sebaliknya. Berikut contoh program kirim data serial
komputer yang disimulasikan dengan proteus melalui virtual terminal.
#include<mega8535.h>
#include<stdio.h>
#include<delay.h>
const long int osilator=8000000;
unsigned long int UBRR;
unsigned char data;
unsigned char pesan[ ]={"\n TEST SERIAL\n\r"};
/*fungsi Inisialisasi UART*/
void InisialisasiUART ( unsigned long int baud_rate)
{
UBRR=(osilator/(16*baud_rate))-1;
UBRRL=UBRR;
Petunjuk Praktikum AVR-Triwiyanto Page 147
UBRRH=UBRR>>8;
UCSRB=0b00011000;
UCSRC=0x8e;
}
void inisialisasi_io()
{
DDRA=0x00; //input
PORTA=PORTB=0xff; //pull up
DDRC=DDRB=DDRD=0xff; //output
PORTD=PORTC=0xff;
}
void KirimByte( unsigned char data)
{
while (!(UCSRA & 0x20));// tunggu data yang lalu selesai
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
DDRC=0xFF;
DDRD=0xFF;
// I2C Bus initialization
i2c_init();
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);
rtc_set_time(8,19,0); // set jam 08:19:00
Petunjuk Praktikum AVR-Triwiyanto Page 155
rtc_set_date(24,4,11); // set tanggal: 24 april 2011
while (1)
{
// Place your code here
rtc_get_time(&jam,&menit,&detik); // mengakses jam
rtc_get_date(&tanggal,&bulan,&tahun); //mengakses tanggal
data = detik;
detiksat = data % 10; // sat = sisa dari data dibagi 10
detikpul = data / 10;
data = menit;
menitsat = data % 10; // sat = sisa dari data dibagi 10
menitpul = data / 10;
;
ubah=detiksat;
ubah_ke_format7segment();
detiksat=ubah;
;
ubah=detikpul;
ubah_ke_format7segment();
detikpul=ubah;
;
ubah=menitsat;
ubah_ke_format7segment();
menitsat=ubah;
;
ubah=menitpul;
ubah_ke_format7segment();
menitpul=ubah;
;
tampil_7segment();
delay_ms(10);
};
}
Petunjuk Praktikum AVR-Triwiyanto Page 156
APLIKASI AVO METER DIGITAL
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
#define ADC_VREF_TYPE 0x40
float data,data2,data3,data4,hasil;
char lcd_buffer[30];
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
Petunjuk Praktikum AVR-Triwiyanto Page 157
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void adc_init(){
// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: On
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x83;
SFIOR&=0xEF;
SFIOR|=0x10;
}
void io_init(){
DDRA=0x00;
Petunjuk Praktikum AVR-Triwiyanto Page 158
DDRC=0xff;
}
void main(void)
{
io_init();
adc_init();
// LCD module initialization
lcd_init(16);
PORTA.1=1;
while (1)
{
awal:
data=read_adc(0);
data2=read_adc(2);
data3=read_adc(3);
data4=read_adc(4);
if(PINA.1==0){
data=(float)data/1023*5;
hasil=(float)((float)400*data)-1000;
Petunjuk Praktikum AVR-Triwiyanto Page 159
lcd_clear();
lcd_putsf("multimtr digital");
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"R=%4.0f ohm",hasil);
lcd_puts(lcd_buffer);
delay_ms(50);
goto awal;
};
if(data==data2){data=data;};
if(data==data3){data=data*2;};
if(data==data4){data=data*4;};
data=(float)data/1023*5;
lcd_clear();
lcd_putsf("multimtr digital");
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"Tegangan=%2.2f V",data);
lcd_puts(lcd_buffer);
delay_ms(50);
Petunjuk Praktikum AVR-Triwiyanto Page 160
};
}
Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk PDF, dengan uraian meliputi
a. Gambar rangkaian dan berilah penjelasan b. Rencanakan flowchart untuk masing-masing percobaan tersebut diatas c. Jelaskan masing-masing program tersebut diatas. d. Laporan dibuat dalam bentuk PDF, dikerjakan per individu e. Lakukan simulasi untuk rangkaian tersebut diatas dengan menggunakan
PROTEUS, dan PASTE gambar tersebut pada Laporan praktikum
Petunjuk Praktikum AVR-Triwiyanto Page 161
RANGKAIAN PROGRAMMER
Membuat Project dengan CodeVisionAVR.
Pada penjelasan berikutnya, sebagai contoh digunakan modul AVR yang mempunyai