Post on 28-Dec-2015
description
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 <mega8535.h> void main(void) { DDRC=0xFF; PORTC=0x0F; }
2. Percobaan LED On/ Off dengan fungsi delay
Pada percobaan ini LED akan ON dan OFF dengan waktu tunda tertentu,
yang ditentukan dengan fungsi delay_ms.
#include <mega8535.h>
#include <delay.h>
void main(void)
{
DDRC= 0xFF;
while (1)
Petunjuk Praktikum AVR-Triwiyanto Page 8
{
PORTC=0xFF;
delay_ms(1000);
PORTC=0x00;
delay_ms(1000);
}
}
3. Percobaan LED dengan data Tabel
Pada percobaan ini kombinasi display LED yang ON ditentukan berdasarkan
table pada array urutan[8] dengan perpindahan satu pola ke pola yang
lainnya berdasarkan delay.
#include <mega8535.h>
#include <delay.h>
void main(void)
{
char urutan[8]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
char i;
DDRC=0xFF;
PORTC=0xFF;
while(1)
{
for (i=0;i<8;i++)
{
PORTC=urutan[i];
delay_ms(1000);
}
}
}
Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas dalam bentuk PDF,
dengan uraian meliputi:
a. Gambar rangkaian dan penjelasannya
Petunjuk Praktikum AVR-Triwiyanto Page 9
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. Gambar Simulasi percobaan tersebut dengan dengan menggunakan
Proteus, file gambar di PASTE pada laporan praktikum.
2. Buatlah rangkaian programmer per individu (waktu 2 minggu)
3. Buatlah rangkaian minimum system AVR, bagilah berdasarkan jumlah pin (
ATtiny 15, 2313, ATMEGA8, ATMEGA8535 ) per individu. Minimum system
berisi LED, SW, motor DC, Buzzer (waktu 2 minggu)
Petunjuk Praktikum AVR-Triwiyanto Page 10
PERCOBAAN 2
S W Push Button
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 dengan menggunakan Saklar
Push Button.
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 input/ output pada mikrokontroler AVR
4. Dapat mengerjakan tugas yang diberikan dengan bahasa-C.
III. Dasar Teori
Petunjuk Praktikum AVR-Triwiyanto Page 11
Gambar 2.1. Rangkaian LED terhubung ke PORTC
Gambar 2.2. Rangkaian Push Button terhubung ke PORTB
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
12D6
LED
R1220
D2
LED
R3220
D3
LEDP
B1
PB
5
SW
3
PB
3S
W4
SW
5
PB
2
PB
0
SW
2
PB
6
PB
4
SW
6
PB
7
SW
1
SW
8
SW
7
Petunjuk Praktikum AVR-Triwiyanto Page 12
(a) (b)
Gambar 2.3. Konfigurasi PORTB dan PORTC pada CodeVision
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
1. Percobaan Input/Ouput
Pada percobaan ini PORTB difungsikan sebagai input dan PORTC
difungsikan sebagai output.
Petunjuk Praktikum AVR-Triwiyanto Page 13
#include <mega8535.h>
void main(void)
{
DDRC=0xFF;
DDRB=0x00;
PORTB=0xFF;
while (1)
{
PORTC=PINB;
}
}
2. Percobaan Input/ Output dengan fungsi BIT.
Pada percobaan ini, anda akan belajar bagaimana mengambil data per bit. Dengan
menggunakan instruksi PINB.X, dengan X adalah nilai bit.
#include <mega8535.h>
void main(void)
{
DDRC=0xFF;
DDRB=0x00;
PORTB=0xFF;
while(1)
{
if (PINB.0==0) {PORTC=0x01;}
else if (PINB.1==0){PORTC=0x02;}
else if (PINB.2==0){PORTC=0x04;}
else if (PINB.3==0){PORTC=0x08;}
else {PORTC=0x00;}
}
}
3. Percobaan SW dengan pemilihan kombinasi LED
Pada percobaan ini anda akan mengambil data dengan menggunakan SW push
button, setiap penekanan SW akan menampilkan pola LED tertentu.
Petunjuk Praktikum AVR-Triwiyanto Page 14
#include <mega8535.h>
#include <delay.h>
//declare global arrays for two patterns
unsigned char p1[4] = { 0b10000001,
0b01000010,
0b00100100,
0b00011000 };
unsigned char p2[4] = { 0b11111111,
0b01111110,
0b00111100,
0b00011000 };
void main()
{
unsigned char i; //loop counter
DDRC = 0xFF; //PB as output
PORTC= 0x00; //keep all LEDs off
DDRB = 0x00; //PC as input
PORTB.0 = 1; //enable pull ups for
PORTB.1 = 1; //only first two pins
while(1)
{
//# if SW0 is pressed show pattern 1
if(PINB.0==0)
{
for(i=0;i<3;i++)
{
PORTC=p1[i]; //output data
delay_ms(300); //wait for some time
}
PORTC=0; //turn off all LEDs
}
//# if SW1 is pressed show pattern 2
if(PINB.1==0)
Petunjuk Praktikum AVR-Triwiyanto Page 15
{
for(i=0;i<3;i++)
{
PORTC=p2[i]; //output data
delay_ms(300); //wait for some time
}
PORTC=0; //turn off all LEDs
}
};
}
Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut diatas diatas dalam bentuk
PDF, dengan uraian meliputi
a. Gambar rangkaian dan penjelasannya
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
2. Rancanglah aplikasi dari minimum system yang sudah anda buat tersebut
untuk keperluan elektronika medic, dalam bentuk gambar di Proteus dikerjakan
per individu (waktu 1 minggu, dikumpulkan minggu depan)
Petunjuk Praktikum AVR-Triwiyanto Page 16
PERCOBAAN 3
DISPLAY 7 SEGMEN
I. Pendahuluan
Pada percobaan ini akan menggunakan display 7 segmen sebanyak 8 buah,
dengan menggunakan scanning data, maka jumlah port yang dibutuhkan
menjadi sedikit. Display 7 segmen yang digunakan pada percobaan ini adalah 7
segmen common anoda, dengan driver transistor PNP dan decoder 74LS138
untuk scanning 7 segmen..
II. Tujuan
Setelah menyelesaikan praktikum ini, yang anda peroleh adalah :
1. Dapat menceritakan kembali alur pengembangan software pada
mikrokontroler AVR menggunakan CodeVisionAVR.
2. Dapat menggunakan fungsi output pada mikrokontroler AVR dengan
interface ke 7 segmen common anoda
3. Dapat mengerjakan tugas yang diberikan dengan bahasa-C.
III. Dasar Teori
Tabel kebenaran 74LS138
SELEKTOR ENABLE OUTPUT C B A G1 /G2A /G2B Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
0 0 0 1 0 0 0 1 1 1 1 1 1 1
0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 1 1 1 1
0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1
1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 0 1
1 1 1 1 0 0 1 1 1 1 1 1 1 0
1. Pada tabel kebenaran tersebut tampak bahwa seven segmen yang hidup tergantung
pada output dari dekoder 74LS138, yang sedang mengeluarkan logika low ”0”,
sehingga dari 8 buah display tersebut, selalu hanya satu display yang akan
dihidupkan. Agar display tampak nyala secara bersamaan maka ketiga display
tersebut harus dihidupkan secara bergantian dengan waktu tunda tertentu.
Petunjuk Praktikum AVR-Triwiyanto Page 17
2. Pada gambar tersebut seven segment commont anoda dikendalikan dengan
menggunakan transistor PNP melalui decoder 74LS138, apabila ada logika low
pada basis transistor, maka 7 segment akan nyala dan sebaliknya akan padam.
Gambar 3.1. Modul 7 Segment tunggal
Tabel Data Display 7 Segmen
P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 Display g f e d c b a
1 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1
0 1 0 0 1 0 0 2
0 1 1 0 0 0 0 3 :
: 0 0 0 1 0 0 0 A
0 0 0 0 0 1 1 b 1 0 0 0 1 1 0 C :
Pada tabel tersebut tampak bahwa untuk menghidupkan sebuah segmen, harus
dikirimkan data logika low ”0” dan sebaliknya untuk mematikan segmen, harus
dikirimkan data logika high ”1”.
Petunjuk Praktikum AVR-Triwiyanto Page 18
Gambar 3.3. Rangkaian decoder dan driver 7 Segmen
IV. Peralatan
1. 1 set PC yang dilengkapi dengan software CodeVision AVR.
2. set development board AVR ATmega8535
3. 1 power-supply +5VDC
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
2Y5
PC
2 Y0
Q22N
53223
2
1
SEGMENT1
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
3SEGMENT8
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
VCCP
C0
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
Y3P
C3
PC
0
PC
4
Y1
PC
1
PD6
Petunjuk Praktikum AVR-Triwiyanto Page 19
V. Prosedure Percobaan
1. Percobaan Display 7 Segmen
Pada percobaan ini anda akan belajar bagaimana mencetak sebuah karakter ke
7 segmen, konversi data decimal ke 7 segmen, menggunakan fungsi SWITCH.
a. Konfigurasi pada Code Vision
Gambar 3.4. Konfigurasi PORTC dan PORTD
Petunjuk Praktikum AVR-Triwiyanto Page 20
b. Listing Program
#include <mega8535.h>
#include<delay.h>
unsigned char data;
void convert(){
switch(data)
{
// gfedcba
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;
}
}
void main (void)
{
DDRC=DDRD=PORTC=0xff;
PORTD.5=1;
PORTD.6=1;
PORTD.7=1;
while(1)
{
data=5;
convert();
}
}
2. Percobaan Display 7 segmen increment data 0 sd 9
Petunjuk Praktikum AVR-Triwiyanto Page 21
Pada percobaan ini data ditampilkan ke sebuah 7 segmen, data ditampilkan
secara berurutan mulai dari 0 sd 9, dengan waktu tunda 1 detik. Untuk setiap
kenaikan angka.
a. Konfigurasi Code Vision
Gambar 3.5. Konfigurasi PORTC dan PORTD
b. Listing Program
#include <mega8535.h>
#include<delay.h>
unsigned char data;
void convert(){
switch(data)
{
// gfedcba
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;
Petunjuk Praktikum AVR-Triwiyanto Page 22
case 6: PORTC=0b10000010;break;
case 7: PORTC=0b11111000;break;
case 8: PORTC=0b10000000;break;
case 9: PORTC=0b10010000;break;
default: PORTC=0xff;
}
}
void main (void)
{
DDRC=DDRD=PORTC=0xff;
PORTD.5=1;
PORTD.6=1;
while(1)
{
convert();
data=data+1;
if(data==10){data=0;};
delay_ms(1000);
}
}
3. Display 7 Segmen dengan Simulasi Setting data
Pada percobaan ini anda akan belajar bagaimana mensimulasikan setting data
dengan display pada 7 segmen.
a. Konfigurasi Codevision
Petunjuk Praktikum AVR-Triwiyanto Page 24
b. Listing program
#include <mega8535.h>
#include <delay.h>
void convert();
int data,dataTemp,dataPul,dataSat;
void main(void)
{
DDRC=0xFF;
DDRB=0x00;
PORTB=0xFF;
PORTC=0xFF;
DDRD=0xFF;
data=00;
while(PINB.2==1)
{
if (PINB.0==0)
{
data=data+1;
}
else if (PINB.1==0)
{
data=data-1;
}
dataTemp=data;
dataSat = dataTemp % 10; // sat = sisa dari data dibagi 10
dataPul = dataTemp / 10;
dataTemp=dataSat;
convert();
PORTD.5=1;
PORTD.6=0;
delay_ms(30);
dataTemp=dataPul;
convert();
PORTD.5=0;
PORTD.6=0;
Petunjuk Praktikum AVR-Triwiyanto Page 25
delay_ms(30);
}
PORTC=0x00;
delay_ms(2000);
}
void convert(){
switch(dataTemp)
{
// 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. Presentasi rangkaian untuk tugas minimum system aplikasi dibidang elektronika
medic, sesuai penugasan minggu II
Petunjuk Praktikum AVR-Triwiyanto Page 26
PERCOBAAN 4
LCD KARAKTER 2 X 16
I. Pendahuluan
Pada percobaan ini anda akan mempelajari interface LCD (liquid crystal display )
dengan mikrokontroller. LCD merupakan komponen display yang dapat menampilkan
berbagai macam karakter. Jenis LCD ada berbagai macam, dan yang paling sering
digunakan adalah LCD Karakter 2 x 16. Pada percobaan iini akan menggunakan LCD
karakter 2 x16, dengan interface pada PORTC, Codevision menyediakan fungsi-fungsi
untuk keperluan pengelolaan LCD.
II. Tujuan
Setelah menyelesaikan praktikum ini, yang anda peroleh adalah :
1. Dapat menceritakan kembali alur pengembangan software pada
mikrokontroler AVR menggunakan CodeVisionAVR.
2. Dapat menggunakan fungsi output pada mikrokontroler AVR dengan
interface ke LCD Karakter 2 x 16
3. Dapat mengerjakan tugas-tugas yang diberikan dengan bahasa-C.
III. Teori
Modul LCD Character dapat dengan mudah dihubungkan dengan mikrokontroller
seperti AT89S51. LCD yang akan kita praktikumkan ini mempunyai lebar display 2 baris
16 kolom atau biasa disebut sebagai LCD Character 2x16, dengan 16 pin konektor,
yang didifinisikan sebagai berikut:
Petunjuk Praktikum AVR-Triwiyanto Page 27
Gambar 4.2. Modul LCD Karakter 2x16
Tabel 4.1 Pin dan Fungsi
PIN Name Function
1 VSS Ground voltage
2 VCC +5V
3 VEE Contrast voltage
4 RS
Register Select
0 = Instruction Register
1 = Data Register
5 R/W
Read/ Write, to choose write or read mode
0 = write mode
1 = read mode
6 E
Enable
0 = start to lacht data to LCD character
1= disable
7 DB0 LSB
8 DB1 -
9 DB2 -
10 DB3 -
Petunjuk Praktikum AVR-Triwiyanto Page 28
11 DB4 -
12 DB5 -
13 DB6 -
14 DB7 MSB
15 BPL Back Plane Light
16 GND Ground voltage
Display karakter pada LCD diatur oleh pin EN, RS dan RW:
Jalur EN dinamakan Enable. Jalur ini digunakan untuk memberitahu LCD bahwa anda
sedang mengirimkan sebuah data. Untuk mengirimkan data ke LCD, maka melalui
program EN harus dibuat logika low “0” dan set pada dua jalur kontrol yang lain RS dan
RW. Ketika dua jalur yang lain telah siap, set EN dengan logika “1” dan tunggu untuk
sejumlah waktu tertentu ( sesuai dengan datasheet dari LCD tersebut ) dan berikutnya
set EN ke logika low “0” lagi.
Jalur RS adalah jalur Register Select. Ketika RS berlogika low “0”, data akan dianggap
sebagi sebua perintah atau instruksi khusus ( seperti clear screen, posisi kursor dll ).
Ketika RS berlogika high “1”, data yang dikirim adalah data text yang akan ditampilkan
pada display LCD. Sebagai contoh, untuk menampilkan huruf “T” pada layar LCD maka
RS harus diset logika high “1”.
Jalur RW adalah jalur kontrol Read/ Write. Ketika RW berlogika low (0), maka informasi
pada bus data akan dituliskan pada layar LCD. Ketika RW berlogika high ”1”, maka
program akan melakukan pembacaan memori dari LCD. Sedangkan pada aplikasi
umum pin RW selalu diberi logika low ”0”.
Pada akhirnya, bus data terdiri dari 4 atau 8 jalur ( bergantung pada mode operasi yang
dipilih oleh user ). Pada kasus bus data 8 bit, jalur diacukan sebagai DB0 s/d DB7.
Petunjuk Praktikum AVR-Triwiyanto Page 29
Beberapa perintah dasar yang harus dipahami adalah inisialisasi LCD Character,
Function Set Mengatur interface lebar data, jumlah dari baris dan ukuran font karakter
KONTROL DATA
RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 pulse 0 0 0 1 DL N F X X
CATATAN:
X : Don’t care
DL: Mengatur lebar data
DL=1, Lebar data interface 8 bit ( DB7 s/d DB0)
DL=0, Lebar data interface 4 bit ( DB7 s/d DB4)
Ketika menggunakan lebar data 4 bit, data harus dikirimkan dua kali
N=1, Display dua baris
N=0, Display satu baris
Entry Mode Set Mengatur increment/ decrement dan mode geser
KONTROL DATA
RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 pulse 0 0 0 0 0 0 1 I/D S
Catatan:
I/D: Increment/ decrement dari alamat DDRAM dengan 1 ketika kode karakter dituliskan
ke DDRAM.
I/D = “0”, decrement
I/D= “1”, increment
Petunjuk Praktikum AVR-Triwiyanto Page 30
S: Geser keseluruhan display kekanan dan kekiri
S=1, geser kekiri atau kekanan bergantung pada I/D
S=0, display tidak bergeser
Display On/ Off Cursor Mengatur status display ON atau OFF, cursor ON/ OFF dan fungsi Cursor Blink
KONTROL DATA
RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 pulse 0 0 0 0 0 1 D C B
D : Mengatur display
D = 1, Display is ON
D = 0, Display is OFF
Pada kasus ini data display masih tetap berada di DDRAM, dan dapat ditampilkan
kembali secara langsung dengan mengatur D=1.
C : Menampilkan kursor
C = 1, kursor ditampilkan
C = 0, kursor tidak ditampilkan
B : Karakter ditunjukkan dengan kursor yang berkedip
B=1, kursor blink
Clear Display Perintah ini hapus layar
KONTROL DATA
RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 pulse 0 0 0 0 0 0 0 0 1
Petunjuk Praktikum AVR-Triwiyanto Page 31
Geser Kursor dan Display
Geser posisi kursor atau display ke kanan atau kekiri tanpa menulis atau baca data
display. Fungsi ini digunakan untuk koreksi atau pencarian display
KONTROL DATA
RS EN R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 pulse 0 0 0 0 1 D/C R/L X X
Catatan : x = Dont care
D/C R/L Note
0 0 Geser posisi kursor ke kiri
0 1 Geser posisi kursor ke kanan
1 0 Geser keseluruhan display ke kiri
1 1 Geser keseluruhan display ke kanan
Memori LCD
1. DDRAM ( Display Data RAM )
Memori DDRAM digunakan untuk menyimpan karakter yang akan ditampilkan. Semua
teks yang kita tuliskan ke modul LCD adalah disimpan didalam memory ini, dan modul
LCD secara berturutan membaca memory ini untuk menampilkan teks ke modul LCD itu
sendiri.
Petunjuk Praktikum AVR-Triwiyanto Page 32
Gambar 4.3. Lokasi memori display LCD Karakter
Pada peta memori tersebut, daerah yang berwarna kuning ( 00 s/d 0F dan 40 s/d 4F )
adalah display yang tampak. Sebagaimanan yang anda lihat, jumlahnya sebanyak 16
karakter per baris dengan dua baris. Angka pada setiap kotak adalah alamat memori
yang bersesuaian dengan posisi dari layar. Demikianlah karakter pertama di sudut kiri
atas adalah menempati alamah 00h. Posisi karakter berikutnya adalah alamat 01h dan
seterusnya.
INISIALISASI
Sebelum kita dapat menggunakan modul LCD, kita harus melakukan inisialisasi dan
mengkonfigurasikannya. Hal ini dijalankan dengan mengirimkan sejumlah instruksi ke
LCD. Antara lain: pengaturan lebar data interface 8 bit atau 4 bit data bus, pemilihan
ukuran font karakter 5x8 atau 5x7 dan lain-lain, dengan instruksi sebagai berikut.
Petunjuk Praktikum AVR-Triwiyanto Page 33
Gambar 4.4. Konfigurasi Codevision dan koneksi hardware
Fungsi LCD
Fungsi LCD terletak pada header lcd.h yang harus di-include-kan sebelum digunakan.
Sebelum melakukan include terlebih dahulu sebutkan port mikrokontroller yang akan
dihubungkan ke LCD. Hal ini juga dapat dengan mudah dilakukan dengan
menggunakan CodeWizardAVR.
/* modul LCD dihubungkan dengan PORTC */
#asm
.equ __lcd_port=0x15
#endasm
/* sekarang fungsi LCD dapat di-include*/
#include <lcd.h>
Fungsi-fungsi untuk mengakses LCD diantaranya adalah :
a. unsigned char lcd_init(unsigned char lcd_columns)
Petunjuk Praktikum AVR-Triwiyanto Page 34
Untuk menginisialisasi modul LCD, menghapus layar dan meletakkan posisi karakter
pada baris ke-0 kolom ke-0. Jumlah kolom pada LCD harus disebutkan (misal, 16).
Kursor tidak ditampakkan. Nilai yang dikembalikan adalah 1 bila modul LCD terdeteksi,
dan bernilai 0 bila tidak terdapat modul LCD. Fungsi ini harus dipanggil pertama kali
sebelum menggunakan fungsi yang lain.
b. void lcd_clear(void)
Menghapus layar LCD dan meletakkan posisi karakter pada baris ke-0 kolom ke-0.
c. void lcd_gotoxy(unsigned char x, unsigned char y)
Meletakkan posisi karakter pada kolom ke-x baris ke-y. Nomor baris dan kolom
dimulai dari nol.
d. void lcd_putchar(char c)
Menampilkan karakter c pada LCD.
e. void lcd_puts(char *str)
Menampilkan string yang disimpan pada SRAM pada LCD.
2. Peralatan
1. 1 set PC yang dilengkapi dengan software CodeVision AVR.
2. set development board AVR ATmega8535
3. 1 power-supply +5VDC
V. Prosedur Percobaan
1. Percobaan Cetak Karakter pada baris 1
#include <mega8535.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
//
Petunjuk Praktikum AVR-Triwiyanto Page 35
#include <lcd.h>
// Declare your global variables here
void main(void)
{
PORTB=0xFF;
DDRB=0x00;
// LCD module initialization
lcd_init(16);
while (1)
{
lcd_gotoxy(0,0);
lcd_putsf("Selamat Datang");
}
}
2. Percobaan manipulasi nilai
#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 int LCD; char lcd_buffer[33]; unsigned char x,y,hasil,hasil_1,hasil_2; void main (void) { //PORT initialization as input or output DDRA=DDRB=0x00; DDRC=DDRD=PORTB=0xFF; PORTA=PORTC=0x00; LCD=1; lcd_init(16); // inisialisasi lcd, kolom modul lcd =16. lcd_gotoxy(0,0); // ke kolom x=0 dan baris y=0 lcd_putsf("Ngetes LCD"); //menampilkan tulisan Ngetes LCD lcd_gotoxy(0,1); // kebaris ke 2 y=1 lcd_putsf("Program C & AVR"); delay_ms(1500); x=1;y=1; ulang: //label ulang hasil=x+y;
Petunjuk Praktikum AVR-Triwiyanto Page 36
lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buffer,"hsl:%i",hasil); lcd_puts(lcd_buffer); lcd_gotoxy(8,0); sprintf(lcd_buffer,"hsl-1:%i",hasil_1); lcd_puts(lcd_buffer); lcd_gotoxy(0,1); sprintf(lcd_buffer,"hsl-2:%i",hasil_2); lcd_puts(lcd_buffer); hasil_2=hasil_1; hasil_1=hasil; x++; delay_ms(500); goto ulang; //kelabel ulang }
Pada program diatas, terdapat beberapa perintah..
#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.
4. Percobaan manipulasi data III
#include <mega8535.h> #include <lcd.h> #include <stdio.h> #include <delay.h> #asm .equ __lcd_port=0x15 ;PORTC #endasm unsigned char data1=9; signed char data2=-10; char lcd_buffer[33]; int data; float data3; void main(void) { data1=data1+data2; lcd_init(16); lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buffer,"hasilnya=%i",data1); lcd_puts(lcd_buffer); delay_ms(1200); data=data1/2; lcd_clear(); sprintf(lcd_buffer,"9/2=%i",data); lcd_puts(lcd_buffer); delay_ms(1200); data=20.4; lcd_clear(); sprintf(lcd_buffer,"20.4=%i",data); lcd_puts(lcd_buffer); delay_ms(1200); data3=5/2; lcd_clear(); sprintf(lcd_buffer,"5/2=%f",data3); lcd_puts(lcd_buffer); delay_ms(1200); }
Petunjuk Praktikum AVR-Triwiyanto Page 39
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 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 }; }
Berikut merupakan contoh ADC dengna display LCD
#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 0x40 char lcd_buffer[33]; unsigned int dataADC; void inisialisasi_LCD() {// LCD module initialization lcd_init (16); lcd_gotoxy (0,0); lcd_putsf (" Diploma III "); lcd_gotoxy (0,1); lcd_putsf (" TEM Surabaya "); delay_ms (1000); } 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; }
Petunjuk Praktikum AVR-Triwiyanto Page 53
// 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)
{ dataADC=read_adc (0); //baca adc0 10bit (0-1024) lcd_clear (); lcd_gotoxy (0,0); sprintf (lcd_buffer,"ADC0=%i",dataADC); lcd_puts (lcd_buffer); delayms (100);
}; }
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
difungsikan sebagai pembagi tegangan.
Petunjuk Praktikum AVR-Triwiyanto Page 65
a. Konfigurasi codevision
b. Listing Program
#include <mega8535.h> #include <stdio.h>. #include <delay.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 #endasm #include <lcd.h> #define heater PORTB.0;//simulasi heater di hubungkan dg PORTB.0 #define ADC_VREF_TYPE 0x40 unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; ADCSRA|=0x40; delay_us(10); while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } unsigned char buff[33];
Petunjuk Praktikum AVR-Triwiyanto Page 66
void lcd_putint(unsigned int dat) { sprintf(buff,"%d ",dat); lcd_puts(buff); } void main(void) { unsigned int suhu; float adc; DDRB=0xff; PORTB=0x00; // ADC initialization // ADC Clock frequency: 125.000 kHz // ADC Voltage Reference: AVCC pin // ADC High Speed Mode: Off // ADC Auto Trigger Source: None ADMUX=ADC_VREF_TYPE; ADCSRA=0x85; SFIOR&=0xEF; // LCD module initialization lcd_init(16); while (1) { // Place your code here adc = read_adc(0); adc=adc/255; suhu=adc*175; suhu=suhu-12; if (suhu<27)heater=1; // simulasi if (suhu>32)heater=0; // simulasi lcd_putsf("Suhu= "); lcd_putint(suhu); delay_ms(1000); lcd_clear(); }; }
5. Simulasi Thermometer Digital
Pada percobaan ini, akan disimulasikan thermometer digital dengan memanfaatkan
fasilitas ADC pada ATMEGA8535 melalui channel 0, dengan resolusi 10 bit. Pada
aplikasi ini, ADC diaktifkan dengan menggunakan mode free running. Data ADC 10
bit ditampilkan pada LCD Karakter, dengan data maksimal 0 – 500,0 oC. Untuk
Petunjuk Praktikum AVR-Triwiyanto Page 67
merubah data decimal ke FLOAT. Konfersi dilakukan dengan menggunakan
persamaan sebagai berikut:
Merubah dari data decimal ke suhu: suhu_c=(float)SUHU*500/1023; Merubah dari float ke array: ftoa(suhu_c,1,sementara);
a. Konfigurasi codevision
b. Listing Program
int SUHU; char sementara[8]; float suhu_c; // #include <stdlib.h> #include <lcd.h> #include <delay.h> #include <mega8535.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm
Petunjuk Praktikum AVR-Triwiyanto Page 68
#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
Bit5- Timer/Counter1 Input Capture interupt enable
Bit6- Timer/Counter2 overflow interupt 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
ditampilkan pada LCD Karakter.
Petunjuk Praktikum AVR-Triwiyanto Page 108
a. Konfigurasi codevision
b. Listing program
#include <mega8535.h>
#include <stdlib.h>
unsigned char temp[6];
int data;
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
TCNT1H=0x0b;
TCNT1L=0xdc;
data++; //setelah 1 detik increament data
Petunjuk Praktikum AVR-Triwiyanto Page 109
}
// 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;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
Petunjuk Praktikum AVR-Triwiyanto Page 110
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16.56 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0xC2;
TCNT1L=0xF7;
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
Petunjuk Praktikum AVR-Triwiyanto Page 111
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
if (data==100)
{
lcd_clear();
data=0;
}
lcd_gotoxy(0,0);
lcd_putsf(" Lab Mikro-TEM ");
itoa(data,temp); //menampilkan di LCD
lcd_gotoxy(0,1);
lcd_puts(temp);
};
}
7.4. Percobaan Timer pada Pembuatan Jam Digital, Detik, Menit, Jam
Pada percobaan ini, dibuat jam digital dengan waktu detik, menit dan jam yang
ditampilkan pada LCD karakter. Pada percobaan ini menggunakan TIMER1 16 bit yang
Petunjuk Praktikum AVR-Triwiyanto Page 112
memberikan interupsi setiap 1 detik, sehingga data detik akan increment, dilanjutkan
dengan increment pada menit dan jam.
a. Konfigurasi codevision
b. Listing Program
unsigned char temp[6];
int detik=0, menit=0, jam=12, indeks=6;
#include <mega8535.h>
#include <stdlib.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
// Timer 1 overflow interrupt service routine
Petunjuk Praktikum AVR-Triwiyanto Page 113
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
TCNT1H=0xD23A >> 8;
TCNT1L=0xD23A & 0xff;
detik++;
}
void jam_digital()
{
if (detik==60)
{
lcd_clear();
detik=0;
menit++;
}
if (menit==60)
{
lcd_clear();
menit=0;
jam++;
}
if (jam==24)
{
lcd_clear();
jam=0;
}
}
void tampil_lcd()
{
lcd_gotoxy(0,0);
lcd_putsf(" LAB-MIKRO TEM ");
itoa(jam,temp); //menampilkan JAM di LCD
lcd_gotoxy(0,1);
lcd_puts(temp);
Petunjuk Praktikum AVR-Triwiyanto Page 114
itoa(detik,temp); //menampilkan DETIK di LCD
lcd_gotoxy(6,1);
lcd_puts(temp);
lcd_gotoxy(5,1); //menampilkan :
lcd_putsf(":");
itoa(menit,temp); //menampilkan MENIT di LCD
lcd_gotoxy(3,1);
lcd_puts(temp);
lcd_gotoxy(2,1); //menampilkan :
lcd_putsf(":");
}
void set_jam()
{
if (PINB.0==0 && indeks==6)
{
TIMSK=0x00; //MENGHENTIKAN TIMER
delay_ms(300);
indeks=5;
while (PINB.0==1 && indeks==5)
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
jam=jam+10;
if (jam>=24)
{
jam=23;
}
}
if (PINB.2==0)
{
delay_ms(300);
Petunjuk Praktikum AVR-Triwiyanto Page 115
jam=jam-10;
if (jam<=9)
{
lcd_clear();
if (jam<0)
{
jam=0;
}
}
}
}
}
if (PINB.0==0 && indeks==5)
{
delay_ms(300);
indeks=4;
while (PINB.0==1 && indeks==4)
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
jam=jam+1;
if (jam>=24)
{
jam=23;
}
}
if (PINB.2==0)
{
delay_ms(300);
jam=jam-1;
if (jam<=9)
{
lcd_clear();
if (jam<0)
{
Petunjuk Praktikum AVR-Triwiyanto Page 116
jam=0;
}
}
}
}
}
if (PINB.0==0 && indeks==4)
{
delay_ms(300);
indeks=3;
while (PINB.0==1 && indeks==3)
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
menit=menit+10;
if (menit>=60)
{
menit=59;
}
}
if (PINB.2==0)
{
delay_ms(300);
menit=menit-10;
if (menit<=9)
{
lcd_clear();
if (menit<0)
{
menit=0;
}
}
}
}
}
Petunjuk Praktikum AVR-Triwiyanto Page 117
if (PINB.0==0 && indeks==3)
{
delay_ms(300);
indeks=2;
while (PINB.0==1 && indeks==2)
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
menit=menit+1;
if (menit>=60)
{
menit=59;
}
}
if (PINB.2==0)
{
delay_ms(300);
menit=menit-1;
if (menit<=9)
{
lcd_clear();
if (menit<0)
{
menit=0;
}
}
}
}
}
if (PINB.0==0 && indeks==2)
{
delay_ms(300);
indeks=1;
while (PINB.0==1 && indeks==1)
Petunjuk Praktikum AVR-Triwiyanto Page 118
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
detik=detik+1;
if (detik>=60)
{
detik=59;
}
}
if (PINB.2==0)
{
delay_ms(300);
detik=detik-1;
if (detik<=9)
{
lcd_clear();
if (detik<0)
{
detik=0;
}
}
}
}
}
if (PINB.0==0 && indeks==1)
{
delay_ms(300);
indeks=0;
while (PINB.0==1 && indeks==0)
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
detik=detik+1;
Petunjuk Praktikum AVR-Triwiyanto Page 119
if (detik>=60)
{
detik=59;
}
}
if (PINB.2==0)
{
delay_ms(300);
detik=detik-1;
if (detik<=9)
{
lcd_clear();
if (detik<0)
{
detik=0;
}
}
}
}
indeks=6;
TIMSK=0x04; //MEMULAI LAGI TIMER
delay_ms(450);
}
}
void main(void)
{
// 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
PORTB=0xff;
DDRD=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
Petunjuk Praktikum AVR-Triwiyanto Page 120
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0xD2;
TCNT1L=0x3A;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
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 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.
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 137
a. Konfigurasi pada Codevision
b. Listing Program
//INTERUPSI EKSTERNAL 0 DAN EKSTERNAL 1 #include<mega8535.h> void main() { DDRC=0xff; PORTC=0xff; DDRD=0xff; PORTD=0xff; GICR=0b11000000; #asm("sei") while(1) {;} } interrupt [2] void interupsi_ext0(void) { PORTC=0xF0; } interrupt [3] void interupsi_ext1(void) { PORTC=0x0F; }
Petunjuk Praktikum AVR-Triwiyanto Page 138
10.2. Percobaan Interupsi dengan LED
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 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
UDR = data;
}
void tampilan(){
putsf("*********************************************");
putchar(13);
putsf(" program terminal komunikasi serial UART ");
putchar(13);
putsf(" Micro club ");
putchar(13);
putsf(" Selamat Datang... ");
putchar(13);
}
Petunjuk Praktikum AVR-Triwiyanto Page 148
void send_message()
{
int i=0;
for(i=0;i<15;i++)
{
UDR=pesan[i];
while(!UCSRA.5)
{;}
}
}
void main(void){
inisialisasi_io();
InisialisasiUART(9600);
while(1){
data='u';
KirimByte(data);
send_message();
tampilan();
delay_ms(100);
}
}
Petunjuk Praktikum AVR-Triwiyanto Page 149
PERCOBAAN 12
REAL TIME CLOCK
1. REAL TIME CLOCK
Real Time Clock berhubungan dengan waktu mulai dari detik, menit, jam, hari,
tanggal, bulan dan tahun. Tetapi IC RTC ini juga bisa dipakai untuk menyimpan data di
dalam internal RAM RTC ini, di mana data tersebut tidak bisa hilang meskipun supply
diputus, hal ini karena di dalam
IC RTC tersebut ada battery-nya yang selalu hidup untuk menjalankan clock-nya
jadi waktu (clock) tetap berjalan meskipun supply dimatikan. IC RTC ini masih
mempunyai kelebihan bisa dipakai sebagai timer atau alarm. Untuk hitungan detik,
menit, jam, hari, tanggal, bulan dan tahun dengan tahun kabisat yang valid sampai
2100 karena compensation valid up to 2100. Mode yang dipilih juga bisa 12 or 24 hour
clock with AM dan PM in 12 hour mode.
RTC 1307 menggunakan teknik I2C yaitu memakai 2 jalur untuk keperluan
transfer data secara seri, sedangkan SPI dan MicroWire memakai 3 jalur. Semua teknik
mempunyai 1 jalur untuk Clock, I2C hanya punya satu jalur data 2 arah, sedangkan SPI
dan MicroWire mempunyai 2 jalur data satu arah, masing-masing untuk jalur data
masuk dan jalur data keluar.
Komunikasi dengan protokol I2C pada RTC 1307 mempunyai cara yang sama
seperti mengakses eeprom serial tipe 24C04 misalnya. Pertama kirim start-bit, alamat
RTC(0xC0) dengan bit R/W low, kemudian nomor register yang ingin diakses.
Petunjuk Praktikum AVR-Triwiyanto Page 150
2. KONFIGURASI PIN
Untuk lebih jelas mengenai fungsi dan kegunaan dari IC ini terlebih dahulu akan
dijelaskan fungsi dari tiap-tiap pin pada IC keluarga DS1307, di mana diketahui bahwa
IC DS1307 memiliki 8 pin atau kaki, seperti pada Gambar 1.
Gambar 1. Pin-pin IC DS1307 (Dallas, 2004)
Fungsi dari tiap pin RTC DS1307 antara lain :
1. X1, X2
Terhubung dengan kaki kristal 32768kHz
2. Vbat
Terhubung dengan battery 3,3 volt
3. GND, Vcc
Input tegangan Vcc adalah +5V.
4. SQW (Square Wave Output)
Pin SQW dapat mengeluarkan sinyal salah satu dari 13 taps yang disediakan oleh
15 tingkat pembagi internal dari RTC.
Petunjuk Praktikum AVR-Triwiyanto Page 151
5. SCL
Pin SCL mengeluarkan sinyal clock. Pin ini harus diberi resistor Pull Up.
6. SDA
Pin SCL mengeluarkan sinyal data
9.1. Percobaan RTC dengan display LED
#include <mega8535.h>
#include <ds1307.h>
#include <delay.h>
#include <stdio.h>
#include <i2c.h>
// I2C Bus functions
#asm
.equ __i2c_port=0x12 ;PORTD
.equ __sda_bit=2
.equ __scl_bit=3
#endasm
void main(void)
{
unsigned char jam, menit, detik, tanggal, bulan, tahun;
VCC
Y2
ZTAPD3
VCC
R3010k
R2910k
VCC
U4 DS1307
7
5126
38
SQW/OUT
SDAX1X2SCLK
VBATVCC
PD2
J5
CON2
12
Petunjuk Praktikum AVR-Triwiyanto Page 152
// 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;
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
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
;
PORTC=detik;
};
}
9.2. Percobaan RTC dengan display 7 Segmen
int data, ubah,menitsat, menitpul, detiksat, detikpul;
#include <mega8535.h>
Petunjuk Praktikum AVR-Triwiyanto Page 153
#include <ds1307.h>
#include <delay.h>
#include <stdio.h>
// I2C Bus functions
#asm
.equ __i2c_port=0x12 ;PORTD
.equ __sda_bit=2
.equ __scl_bit=3
#endasm
#include <i2c.h>
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()
{
PORTC=menitpul;//mengirimkan data kedigit5
PORTD.5=0;
PORTD.6=0;
delay_ms(10);
PORTC=menitsat;//mengirimkan data kedigit6
PORTD.5=1;
Petunjuk Praktikum AVR-Triwiyanto Page 154
PORTD.6=0;
delay_ms(10);
PORTC=detikpul;//mengirimkan data kedigit7
PORTD.5=0;
PORTD.6=1;
delay_ms(10);
PORTC=detiksat;//mengirimkan data kedigit8
PORTD.5=1;
PORTD.6=1;
delay_ms(10);
//lamanya waktu scanning ditentukan oleh intruksi delay
}
void main(void)
{
unsigned char jam, menit, detik, tanggal, bulan, tahun;
// 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;
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
hubungan sebagai berikut:
VCC
R268
VCC
+ C14U7
D1 3V6
VCC
R168
R6
10k
D4
LED
J5
CON5
12345
VCC
C5
22p
C3100n
R51k
VCC
JP4
USB
1 2 3 4
VCCY112M
C4 22p
VC
C
IC1
ATmega8-DIL28
123456789
1011121314 15
16171819202122232425262728
PC6 (RESET)PD0 (RxD)PD1 (TxD)PD2 (INT0)PD3 (INT1)PD4 (XCK/T0)VCCGNDPB6 (XT1/TOSC1)PB7 (XT2/TOSC2)PD5 (T1)PD6 (AIN0)PD7 (AIN1)PB0 (ICP) (OC1A) PB1
(SS/OC1B) PB2(OC2/MOSI) PB3
(MISO) PB4(SCK) PB5
AVCCAREFAGND
(ADC0) PC0(ADC1) PC1(ADC2) PC2(ADC3) PC3
(SDA/ADC4) PC4(SCL/ADC5) PC5
VCC
VCC
D2 3V6
R3
2k2
Petunjuk Praktikum AVR-Triwiyanto Page 162
• PortA terhubung dengan 8 buah LED dengan operasi aktif high
• PortB terhubung dengan 8 buah saklar dengan operasi aktif high
• PortC terhubung dengan LCD alphanumeric 16 kolom x 2 baris
Jalankan aplikasi CodeVisionAVR dengan cara melakukan klik ganda pada shortcut
ikon CodeVisionAVR yang terbentuk pada Desktop.
Gambar 16. Ikon CodeVisionAVR pada Desktop
Sebuah Splash Screen akan muncul seperti ditunjukkan oleh Gambar 17. Informasi
tentang versi yang dipakai dan keterangan evaluation akan terlihat.
Gambar 17. Tampilan Splash Screen
Petunjuk Praktikum AVR-Triwiyanto Page 163
Beberapa detik kemudian IDE dari CodeVisionAVR akan muncul seperti yang
ditunjukkan oleh Gambar 18.
Gambar 18. IDE CodeVisionAVR
Untuk memulai membuat project baru, pada menubar, pilih File � New, seperti yang
ditunjukkan oleh Gambar 19.
Gambar 19. Membuat file baru
Petunjuk Praktikum AVR-Triwiyanto Page 164
Anda harus membuat sebuah project sebagai induk desain dengan memilih Project, lalu
klik tombol OK seperti pada Gambar 20.
Gambar 20. Membuat project baru
Berikutnya Anda akan ditanya apakah akan menggunakan CodeWizardAVR. Tentu saja
lebih menyenangkan bila Anda memilih jawaban “ya” dengan cara menekan tombol Yes
seperti pada Gambar 21.
Gambar 21. Memilih untuk menggunakan CodeWizardAVR
Tampilan CodeWizardAVR yang sederhana namun lengkap ditunjukkan oleh Gambar
22. Pilih Chip dengan IC yang Anda gunakan. Sebagai contoh Anda memilih Chip
Petunjuk Praktikum AVR-Triwiyanto Page 165
ATmega8535. Tab-tab pada CodeWizardAVR menunjukkan fasilitas yang dimiliki oleh
chip yang Anda pilih. Cocokkan pula frekuensi kristal yang Anda gunakan pada bagian
Clock. Pengisian frekuensi clock digunakan oleh software untuk menghitung rutin-rutin
seperti delay agar diperoleh perhitungan yang cukup akurat.
Gambar 22. CodeWizardAVR pada tab Chip
Berikutnya Anda akan menginisialisasi Port A yang terhubung dengan LED. LED
merupakan modul output. Pada tab Port bagian Port A, ubah bagian Data Direction
menjadi OUT dengan nilai output sama dengan 0 seperti pada Gambar 23. Artinya Port
A digunakan sebagai port output dengan nilai awal nol setelah kondisi reset. Kemudian
lakukan inisialisasi Port B seperti pada Gambar 24. Port B tersambung dengan saklar
sebagai modul input. Pada sub-tab Port B, yakinkan Data Direction pada posisi IN
Petunjuk Praktikum AVR-Triwiyanto Page 166
dengan resistor pullup internal yang disingkat dengan huruf P. Dengan mengaktifkan
resistor pull-up internal, Anda tidak perlu menambahkan resistor pull-up pada saklar.
Gambar 23. Seting Port A sebagai pin output
Petunjuk Praktikum AVR-Triwiyanto Page 167
Gambar 24. Seting Port B sebagai pin input dengan pull-up resistor
LCD alphanumeric yang dihubungkan dengan Port C haruslah mempunyai
pengkawatan seperti yang ditunjukkan oleh Gambar 25. Pada tab LCD, pilihlah Port C.
Gambar 25. Seting LCD pada Port C
Karena pada contoh ini tidak digunakan fasilitas lain maka seting CodeWizardAVR siap
disimpan dalam file. Pada menu CodeWizardAVR, pilih File � Generate, Save and Exit,
seperti yang ditunjukkan oleh Gambar 26.
Petunjuk Praktikum AVR-Triwiyanto Page 168
Gambar 26. Menyimpan seting
Agar file yang dihasilkan tidak berantakan, buatlah sebuah folder baru, misalnya folder
bernama “my project”, seperti yang ditunjukkan oleh Gambar 27.
Gambar 26. Membuat folder baru
Petunjuk Praktikum AVR-Triwiyanto Page 169
Kemudian masuk kedalam folder tersebut untuk menyimpan file-file yang dihasilkan
oleh CodeWizardAVR. Yang pertama Anda diminta untuk memberikan nama file C yang
dihasilkan. Misalnya beri nama “coba”, lalu klik tombol Save. Lebih jelas pada Gambar
27. File tersebut nantinya akan mempunyai akhiran .C.
Gambar 27. Menyimpan file pertama
Yang kedua Anda diminta untuk memberikan nama file project yang dihasilkan.
Misalnya beri nama “coba”, lalu klik tombol Save. Lebih jelas pada Gambar 28. File
tersebut nantinya akan mempunyai akhiran .prj.
Petunjuk Praktikum AVR-Triwiyanto Page 170
Gambar 28. Menyimpan file kedua
Yang terakhir Anda diminta untuk memberikan nama file project CodeWizard yang
dihasilkan. Misalnya beri nama “coba”, lalu klik tombol Save. Lebih jelas pada Gambar
29. File tersebut nantinya akan mempunyai akhiran .cwp.
Gambar 29. Menyimpan file ketiga
Petunjuk Praktikum AVR-Triwiyanto Page 171
Setelah ketiga file disimpan maka pada Project Navigator akan muncul nama project
beserta file C-nya. Secara bersamaan isi file C akan dibuka pada jendela editor seperti
ditunjukkan oleh Gambar 30.
Gambar 30. Project baru telah siap dalam hitungan detik
Sekarang Anda coba untuk menyisipkan instruksi utama. Instruksi ini ditambahkan pada
badan program file coba.c seperti yang ditunjukkan oleh Gambar 31.
Gambar 31. Menambahkan inti program
Petunjuk Praktikum AVR-Triwiyanto Page 172
Program tambahan tersebut bertujuan untuk menampilkan kata-kata pada LCD
kemudian menampilkan nilai pada saklar pada LED yang terpasang. Jika nanti saklar
iaktifkan maka LED yang bersesuaian akan aktif pula. Kemudian pilih menu Project �
Compile untuk melakukan kompilasi seperti yang ditunjukkan oleh Gambar 32. Lalu
kotak dialog seperti ditunjukkan Gambar 33 akan muncul. Klik tombol OK.
Gambar 32. Melakukan kompilasi
Petunjuk Praktikum AVR-Triwiyanto Page 173
Gambar 33. Informasi hasil kompilasi
Program yang Anda buat siap untuk ditransfer kedalam mikrokontroler. Sebelumnya
Anda harus melakukan seting pada programmernya. Pada menu pilih Setting �
Programmer, seperti pada Gambar 34.
Gambar 34. Melakukan seting pada programmer
Petunjuk Praktikum AVR-Triwiyanto Page 174
Pilihlah programmer sesuai dengan yang Anda gunakan. Pada Gambar 35 ditunjukkan
menggunakan programmer Kanda Systems STK200+/300 sebagai contoh. Programmer
ini menggunakan kabel paralel yang terhubung dengan port paralel pada komputer
Anda.
Gambar 35. Menggunakan programmer STK200+/300
Kemudian pilih menu Project � Configure, seperti yang ditunjukkan oleh Gambar 36.
Kotak dialog pada Gambar 37 akan muncul, pada tab After Make, pilih “Program the
Chip”. Lalu klik tombol OK.
Petunjuk Praktikum AVR-Triwiyanto Page 175
Gambar 36. Melakukan konfigurasi project
Gambar 37. Memilih opsi “Program the Chip” After Make
Petunjuk Praktikum AVR-Triwiyanto Page 176
Setelah melakukan seting, lakukan make project dengan memilih menu Project � Make,
seperti ditunjukkan oleh Gambar 38. Apabila tidak ada kesalahan maka kotak dialog
informasi seperti pada Gambar 39 akan muncul. Klik tombol Program untuk mentransfer
program kedalam mikrokontroler.
Gambar 38. Melakukan make project
Petunjuk Praktikum AVR-Triwiyanto Page 177
Gambar 39. Kotak dialog informasi hasil make
Apabila muncul kotak dialog seperti pada Gambar 40 menandakan telah terjadi suatu
hal yang menyebabkan proses transfer gagal. Penyebabnya adalah: suplai tegangan
mikrokontroler dan programmer belum dinyalakan, tipe programmer tidak sama dengan
yang digunakan, alamat port paralel tidak cocok, atau mikrokontrolernya rusak.
Gambar 40. Gagal melakukan transfer program
Bila kerusakan seperti yang ditampilkan oleh Gambar 40 telah diperbaiki atau bila tidak
ada kerusakan maka proses transfer atau yang umum disebut dengan proses download
akan berlangsung seperti yang ditunjukkan oleh Gambar 41.
Gambar 41. Proses transfer ke mikrokontroler
Petunjuk Praktikum AVR-Triwiyanto Page 178
Coba Anda perhatikan yang terjadi dengan modul yang terpasang, apakah pada LCD
muncul tulisan seperti yang telah Anda program dan bila saklar diubah posisinya maka
LED yang bersesuaian akan menyala. Bila Anda ingin menambahkan instruksi lain
maka Anda dapat melakukan penyuntingan program pada file .C-nya. Kemudian
lakukan kompilasi dan make project berikutnya proses download.
Contoh Program Jam Digital
#include <mega8535.h>
#asm
.equ __lcd_port=0x15
#endasm
/* now you can include the LCD Functions */
#include <lcd.h>
#include <delay.h>
#include <stdio.h>
#define sw_ok PINB.0
#define sw_cancel PINB.1
#define sw_up PINB.2
#define sw_down PINB.3
unsigned char detik=0,menit=0,jam=0;
unsigned char buffer1=0,buffer2=0,buffer3=0;
long int data;
unsigned char lcd_buffer[33];
void inisialisasi_tim0_on()
{
TCNT0=0x00; // setting inisial counter0
TCCR0=0x05;
TIMSK=0x01; // aktifkan interrupt timer0
TIFR=0x00; // hapus bendera interrupt timer0
#asm ("sei");
}
void inisialisasi_tim0_off(){
Petunjuk Praktikum AVR-Triwiyanto Page 179
TCCR0=0x00;
#asm ("cli");
}
void atur()
{
lcd_clear();
lcd_gotoxy(0,1);
lcd_putsf("atur== ");
buffer1=detik;
buffer2=menit;
buffer3=jam;
set1:
if(sw_cancel==0){goto selesei;};
if(sw_ok==0){delay_ms(500);goto set2;};
if(sw_up==0){buffer1++;delay_ms(50);};
if(sw_down==0){buffer1--;delay_ms(50);};
if(buffer1>=60){buffer1=0;};
lcd_gotoxy(7,1);
lcd_putsf("detik");
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i : %i",buffer3,buffer2,buffer1);
lcd_puts(lcd_buffer);
goto set1;
set2:
if(sw_cancel==0){goto set1;};
if(sw_ok==0){delay_ms(500);goto set3;};
if(sw_up==0){buffer2++;delay_ms(50);};
if(sw_down==0){buffer2--;delay_ms(50);};
if(buffer2>=60){buffer2=0;};
lcd_gotoxy(7,1);
lcd_putsf("menit");
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i : %i",buffer3,buffer2,buffer1);
lcd_puts(lcd_buffer);
goto set2;
set3:
if(sw_cancel==0){goto set2;};
if(sw_ok==0){delay_ms(500);goto selesei;};
if(sw_up==0){buffer3++;delay_ms(50);};
Petunjuk Praktikum AVR-Triwiyanto Page 180
if(sw_down==0){buffer3--;delay_ms(50);};
if(buffer3>=12){buffer3=0;};
lcd_gotoxy(7,1);
lcd_putsf("jam ");
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i : %i",buffer3,buffer2,buffer1);
lcd_puts(lcd_buffer);
goto set3;
selesei:
menit=detik=jam=data=0;
menit=buffer2;
jam=buffer3;
lcd_clear();
inisialisasi_tim0_on();
data=(int)buffer1*10;
return;
}
void main()
{
DDRB=0x00;
PORTB=0xff;
lcd_init(16);
inisialisasi_tim0_on();
lcd_clear();
while(1)
{
if(PINB.3==0){inisialisasi_tim0_off();delay_ms(500);atur();}
detik=data/10;
if(detik>=60) {detik=0;data=0;menit=menit+1;};
if(menit>=60){menit=0;jam=jam+1;};
if(jam>=12){jam=0;};
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i : %i",jam,menit,detik);
lcd_puts(lcd_buffer);
delay_ms(100);
}