Manual
PETUNJUK PRAKTIKUM
MIKROKONTROLLER AVR
Oleh:
Triwiyanto
Media Pengembangan
Mikrokontroler
AVR dengan CodeVision
Page 1
Pendahuluan
Pada praktikum ini, anda akan mempelajari cara mengembangkan sebuah system
menggunakan
mikrokontroler
AVR
buatan
CodeVisionAVR.CodeVisionAVR merupakan
Atmel
software
menggunakan
C-cross
software
compiler, dimana
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
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.
Page 2
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
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)
kondisi
sebagai
transisi.
Tabel
Tabel diatas menunjukkan konfigurasi pin pada portport mikrokontroler. Bit 2 PUD =
Pull-up Disable, bila bit diset bernilai 1 maka pull-up pada port I/O akan dimatikan
Page 3
Codevision AVR C Compiler. Dengan C AVR program yang telah di tulis selanjutnya
dicompile agar diperoleh bentuk hexadesimal dengan bentuk file *.hex. bentuk hexa
inilah yang akan dapat di download ke mikrokontroller.
Page 4
Langkah selanjutnya yaitu, membuat file tempat penulisan source code yang ber ektensi
.c. yaitu, pilih File > New > Pilih Source > OK.
Page 5
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.
Fungsi Delay
Menghasilkan delay dalam program-C. Berada pada header delay.h yang harus
diIncludekan 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.
Page 6
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
R8
220
D8
Page 7
1. Percobaan LED ON
Pada percobaan ini akan menghidupkan LED sejumlah 4 buah
Page 8
PORTC=0xFF; delay_ms(1000);
PORTC=0x00;
delay_ms(1000);
}
}
Tugas
1. Buatlah laporan praktikum untuk percobaan tersebut 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
Petunjuk Praktikum AVR-Triwiyanto
Page 9
PERCOBAAN 2
S W Push Button
I.
Pendahuluan
Page 10
dapat
ditulis
menggunakan
bahasa-C.
Dengan
menggunakan
II.
Tujuan
Setelah menyelesaikan praktikum ini, yang anda peroleh adalah :
1. Dapat
menjelaskan
arsitektur
umum
dan
keistimewaan
dari
III.Dasar
Teori
R8
220
D8
Page 11
(a)
(b)
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
Page 12
1. Percobaan Input/Ouput
Pada percobaan
ini PORTB difungsikan sebagai input dan PORTC
difungsikan sebagai output.
#include <mega8535.h> void main(void)
{
DDRC=0xFF;
DDRB=0x00; PORTB=0xFF;
while (1)
{
PORTC=PINB;
}}
#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;}
}
}
Page 13
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;
PORTC= 0x00;
DDRB = 0x00;
PORTB.0 = 1;
PORTB.1 = 1;
//PB as output
//keep all LEDs off
//PC as input
//enable pull ups for
//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)
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)
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
Dasar Teori
B
0
0
1
1
0
0
1
1
A
0
1
0
1
0
1
0
1
ENABLE
G1 /G2A
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
/G2B
0
0
0
0
0
0
0
0
OUTPUT
Y0
0
1
1
1
1
1
1
1
Y1
1
0
1
1
1
1
1
1
Y2
1
1
0
1
1
1
1
1
Y3
1
1
1
0
1
1
1
1
Y4
1
1
1
1
0
1
1
1
Y5
1
1
1
1
1
0
1
1
Y6
1
1
1
1
1
1
0
1
Y7
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
Petunjuk Praktikum AVR-Triwiyanto
Page 17
dihidupkan. Agar display tampak nyala secara bersamaan maka ketiga display
tersebut harus dihidupkan secara bergantian dengan waktu tunda tertentu.
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.
P0.5
f
0
1
1
1
P0.4
e
0
1
0
1
P0.3
d
0
1
0
0
P0.2
c
0
0
1
0
P0.1
b
0
0
0
0
P0.0
a
0
1
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
1
0
1
1
0
1
0
Display
0
1
2
3
:
:
A
b
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.
Page 18
IV.
Peralatan
1. 1 set PC yang dilengkapi dengan software CodeVision AVR.
2. set development board AVR ATmega8535
3. 1 power-supply +5VDC
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
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();
}
}
Page 21
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;
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);
}
}
Page 23
b. Listing program
Petunjuk Praktikum AVR-Triwiyanto
Page 24
#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;
dataPul = dataTemp / 10;
dataTemp=dataSat; convert();
PORTD.5=1; PORTD.6=0;
delay_ms(30);
dataTemp=dataPul;
PORTD.5=0;
PORTD.6=0;
convert();
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
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:
Page 27
Name
Function
VSS
Ground voltage
VCC
+5V
VEE
Contrast voltage
RS
Register Select
0 = Instruction Register
1 = Data Register
R/W
DB0
LSB
DB1
DB2
10
DB3
11
DB4
12
DB5
13
DB6
Enable
0 = start to lacht data to LCD character
1= disable
Page 28
14
DB7
MSB
15
BPL
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.
Beberapa perintah dasar yang harus dipahami adalah inisialisasi LCD Character,
Function Set
Mengatur interface lebar data, jumlah dari baris dan ukuran font karakter
KONTROL
Petunjuk Praktikum AVR-Triwiyanto
DATA
Page 29
RS
EN
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
pulse
DL
CATATAN:
X : Dont 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
pulse
I/D
Catatan:
I/D: Increment/ decrement dari alamat DDRAM dengan 1 ketika kode karakter dituliskan
ke DDRAM.
I/D = 0, decrement
I/D= 1, increment
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
Page 30
KONTROL
DATA
RS
EN
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
pulse
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
pulse
DATA
RS
EN
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
pulse
D/C
R/L
Page 31
R/L
Note
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.
Page 32
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.
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
Petunjuk Praktikum AVR-Triwiyanto
Page 33
d. void lcd_putchar(char c)
Menampilkan karakter c pada LCD.
V. Prosedur Percobaan
1. Percobaan Cetak Karakter pada baris 1
Petunjuk Praktikum AVR-Triwiyanto
Page 34
#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
void main(void)
{ PORTB=0xFF;
DDRB=0x00;
// LCD module initialization lcd_init(16);
while (1) {
lcd_gotoxy(0,0);
lcd_putsf("Selamat Datang");
}
}
Page 35
#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;
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 }
Page 36
lcd_clear();
//mempersiapkan buffer
sprintf(lcd_buffer,"hsl-1:%i",hasil_1);
//menampilkan tulisan hsl-1 dengan variable hasil_1
lcd_puts(lcd_buffer);
Page 37
#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);
}
}
}
Page 38
#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);
}
Page 39
#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
void main(void)
{
PORTB=0xFF;
DDRB=0x00;
// LCD module initialization
Petunjuk Praktikum AVR-Triwiyanto
Page 40
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);
}
}
Tugas
Petunjuk Praktikum AVR-Triwiyanto
Page 42
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
PERCOBAAN 5
Petunjuk Praktikum AVR-Triwiyanto
Page 43
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.
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.
III.
Dasar Teori
Page 44
. 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.
Gambar berikut.
Page 45
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.
Page 46
Page 47
Page 48
Inisialisasi ADCSRA
ADCSRA merupakan register 8 bit yang berfungsi melakukan manajemen sinyal kontrol
dan status dari ADC. Memiliki sususan seperti gambar berikut.
Page 49
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 :
ADC
bekerja mode free running dan tidak ada interupsi yang dihasilkan. Detailnya dapat
ditujukkan tabet berikut.
Tabel Konfigurasi mode ADC
Petunjuk Praktikum AVR-Triwiyanto
Page 50
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
Page 51
#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;
SFIOR&=0xEF; //do nothing
SFIOR|=0x10; //do nothing
while (1)
{
// Place your code here
};
}
Page 52
#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;
}
Page 53
ADC pada mikrokontroler ini diakses 10bit, maka resolusi setiap bitnya bila kita
menggunakan referensi tegangan 5volt sebagai berikut.
Resolusi ADC
Resolusi ADC
Resolusi ADC
1
x
10
2
4.88mV
1
2 nbit
Vref
.
Hasil konversi =
Penjelasan program
Petunjuk Praktikum AVR-Triwiyanto
Page 54
inisialisasi_ADC
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;
}
Pada fungsi ini, ADMUX diisikan dengan adc_input dan di-or-kan dengan
Petunjuk Praktikum AVR-Triwiyanto
Page 55
ADC_VREF_TYPE.
Seperti
IV.
Peralatan
1. Modul Trainer
2. 1 set PC
3. Catu Daya +5V
V.
Prosedure Percobaan
Page 56
Pada percobaan ini data ADC diambil dan ditampilkan ke LED, dan pada
modul ini LED
terhubung ke
PORTC
R8
220
D8
Page 57
Page 58
Page 59
Page 60
Page 61
Page 62
sat=ubah;
Petunjuk Praktikum AVR-Triwiyanto
Page 63
//
ubah=pul;
ubah_ke_format7segment();
pul=ubah;
//
ubah=rat;
ubah_ke_format7segment();
rat=ubah;
//
ubah=rib;
ubah_ke_format7segment();
rib=ubah;
//
tampil_7segment();
}
}
Page 64
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;
}
else if (adc_data < (2*1023)/5)
{
Petunjuk Praktikum AVR-Triwiyanto
Page 65
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
};
}
Page 66
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 67
Page 68
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
Page 69
Page 70
Page 71
// 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;
Petunjuk Praktikum AVR-Triwiyanto
Page 72
SFIOR=0x00;
Page 73
// 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 74
simulasi
untuk
rangkaian
tersebut
diatas
dengan
PERCOBAAN 6
Petunjuk Praktikum AVR-Triwiyanto
Page 75
KEYPAD
J7
1
2
3
4
5
6
7
8
PB0
PB1
PB2
PB3
PB4
PB5
PB6
PB7
N8
1 2 3
COR
4 5 6
MEN
7 8 9 |
CAN 0 ENT |
CO
Page 76
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;
Page 77
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;
};
PORTB.7=1;
Petunjuk Praktikum AVR-Triwiyanto
Page 78
b. Listing Program
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
Page 79
Page 80
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;
Page 81
case 4: dtkey=0xe;
break;
case 8:
dtkey=0xf;
break;
};
PORTB.7=1;
}
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 82
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.
Page 83
Page 84
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 keluaran
OC0 bergulir (toggle) dapat membangkitkan gelombang kotak dengan frekuensi:
Petunjuk Praktikum AVR-Triwiyanto
Page 85
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
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 satu bit set.
Maka fungsi pin ini tergantung pada setting bit pada WGM00 dan WGM01.
Page 86
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
Page 87
Tabel 8.5. Konfigurasi Bit Clock Select untuk memilih sumber detak
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.
Petunjuk Praktikum AVR-Triwiyanto
Page 88
Page 89
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:
Page 90
Tabel 8.8. Konfigurasi Bit Compare Output Mode Phase Correct dan Frequency
Correct PWM
Page 91
Pengaturan Timer/Counter 1 juga diatur melalui register TCCR1B yang dapat dilihat
pada Gambar 2.7.
Page 92
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.
Petunjuk Praktikum AVR-Triwiyanto
Page 93
Page 94
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 .
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 95
Tabel 8.15 Konfigurasi Bit Clock Select untuk memilih sumber detak
Page 96
IC1
PB0
PB1
1
2
PB0(XCK/T0)
PA0(ADC0)
40
39
PA0
PA1
PB2
PB1(T1)
PA1(ADC1)
38
PA2
Page 97
PB2(INT2/AIN0) PA2(ADC2)
PA3 PB4
PA3(ADC3)
36
PB4(SS)
37
PB3(OC0/AIN1)
PA4 PB5
PA4(ADC4)
35
PA5
PB6
PB5(MOSI)
PA5(ADC5)
34
PA6
PB7
PB6[MISO)
PA6(ADC6)
33
PA7
PB7[SCK)
PA7(ADC7)
32
AREF
GND
XTAL113 XTAL2
AVCC
29
PC7
PC7(TOSC2)
28
PC6
PC6(TOSC1)
27
PC5
PD0 14
XTAL1
PD1 15
PD0(RXD)
PC5
26
PC4
PD2 16
PD1(TXD)
PC4
25
PC3
PD3 17
PD2(INT0)
PC3
24
PC2
PD4 18
PD3(INT1)
PC2
23
PC1
PD5 19
PD4(OC1B)
PC1(SDA)
22
PC0
PD6 20
PD5(OC1A) PC0(SCL)
PD6(ICP)
PD7(OC2)
21
PD7
ATMEGA8535-DIL40
Page 98
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
Page 99
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 100
}
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;
Petunjuk Praktikum AVR-Triwiyanto
Page 101
DDRC=0xFF;
Page 102
// 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;
Petunjuk Praktikum AVR-Triwiyanto
Page 103
TCNT2=0x00;
OCR2=0x00;
Page 104
Page 105
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)
Page 106
PERCOBAAN 7
TIMER
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,
temanteman dapat membacanya pada datasheet. Disini saya akan coba
membahas Timer0 dan Timer1 saja.
Perhitungan untuk Timero dan Timer1 adalah sebagai berikut:
.!34
Keterangan:
TCNT
: Nilai yang diberikan pada register timer (TCNT)
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.
C.
TCNT
#65.536& '
D
TCNT
49.911
Page 107
TCNT
C2F7h
C.
TCNT
#256& '
TCNT
TCNT
158,34
9Eh
Page 108
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.
pada
pada
Konfigurasi
codevision
TIMER0
R8
220
Page 109
D8
b. Listing program
Page 110
#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)
{
}
}
b. Listing Program
#include <mega8535.h> unsigned
char led=0xfe;
interrupt [TIM0_OVF] void timer0_overflow(void)
{
Page 111
{led=0xfe; }
PORTC=led; // keluarkan data led ke port C
}
void main (void)
{
DDRC=0xff; // port C sebagai output
PORTC=led;
TCNT0=0x00;
TCCR0=0x05;
TIMSK=0x01;
TIFR=0x00;
#asm ("sei");
{PORTC=led;
}
}
a. Konfigurasi codevision
Petunjuk Praktikum AVR-Triwiyanto
Page 112
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
Page 113
}
// 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;
Page 114
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
Page 115
// 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 116
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
Page 117
lcd_putsf("
Page 118
Page 119
lcd_clear();
(jam<0)
jam=0;
if
{
}
}
}
}
}
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;
(jam<=9)
lcd_clear();
(jam<0)
if
{
if
{
jam=0;
}
}
}
}
}
Petunjuk Praktikum AVR-Triwiyanto
Page 120
Page 121
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)
{
tampil_lcd();
if (PINB.1==0)
{
delay_ms(300);
detik=detik+1;
if
(detik>=60)
{
detik=59;
}
}
Page 122
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;
if
(detik>=60)
{
detik=59;
}
}
if (PINB.2==0)
{
delay_ms(300);
detik=detik-1;
if (detik<=9)
{
Page 123
lcd_clear();
(detik<0)
detik=0;
if
{
}
}
}
}
indeks=6;
TIMSK=0x04;
delay_ms(450);
}
}
//MEMULAI
LAGI
TIMER
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.
// 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;
Petunjuk Praktikum AVR-Triwiyanto
Page 124
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
lcd_init(16);
module
initialization
Page 125
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
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
masingmasing 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
Petunjuk Praktikum AVR-Triwiyanto
Page 126
Page 127
Page 128
JISP
1
2
3
4
5
RST
pinb.7
pinb.6
pinb.5
Page 129
int data1;
int data2;
Page 130
#define ADC_VREF_TYPE
0x60 unsigned
char data1,data2;
char
lcd_buffer[33];
Page 131
void inisialisasi_PORT()
{
//PORT initialization as input or output
DDRA=DDRB=0x00;
DDRC=DDRD=0xFF;
//input
//output
PORTB=0xff;//pull up
}
void inisialisasi_PWM_on()
{
TCCR1A=0xA1;
TCCR1B=0x0c;
}
void inisialisasi_PWM_off()
{
TCCR1A=0x00;
TCCR1B=0x00;
}
Page 132
Page 133
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();
Page 134
inisialisasi_LCD();
inisialisasi_PWM_on(); while(1){
if(PINB.0==0) {inisialisasi_PWM_off();
lcd_clear();
lcd_putsf("pwm off");
delay_ms(100);
}
else
{inisialisasi_PWM_on();
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"PWM1=%i",data1);
lcd_gotoxy(8,1);
lcd_puts(lcd_buffer);
lcd_clear();
lcd_puts(lcd_buffer);
sprintf(lcd_buffer,"PWM2=%i",data2);
delay_ms(100);
};
}}
Page 135
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
sumbersumber 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
Petunjuk Praktikum AVR-Triwiyanto
Page 136
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
Page 137
terjadi lebih dari satu interupsi maka perioritas yang akan diselesaikan terlebih dahulu
adalah interupsi yang memiliki urut lebih kecil sesuai tabel 19 berikut.
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 138
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
Page 139
Page 140
R8
220
D8
Pada percobaan ini, dua buah interupsi yang dibangkitkan secara eksternal dari INT0
dan INT1 akan merubah kondisi LED yang terhubung pada PORTC. Bila terjadi
Petunjuk Praktikum AVR-Triwiyanto
Page 141
interupsi pada INTO maka kondisil LED adalah : 11110000, sebaliknya bila terjadi
inteerupsi pada INT1 maka kondisi LED adalah : 00001111.
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)
{;}
}
Page 142
b. Listing Program.
#include <mega8535.h>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
Petunjuk Praktikum AVR-Triwiyanto
Page 143
Page 144
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.
Page 145
Page 146
Page 147
Page 148
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;
Page 149
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; unsigned
long int UBRR;
unsigned
Page 150
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;
}
}
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.
Petunjuk Praktikum AVR-Triwiyanto
Page 151
#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;
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;
Petunjuk Praktikum AVR-Triwiyanto
Page 152
}
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);
putchar(13);
}
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';
Petunjuk Praktikum AVR-Triwiyanto
Page 153
KirimByte(data);
send_message();
tampilan(); delay_ms(100);
}
}
PERCOBAAN 12
REAL TIME CLOCK
1.
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.
Petunjuk Praktikum AVR-Triwiyanto
Page 154
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.
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.
Page 155
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.
5. SCL
Pin SCL mengeluarkan sinyal clock. Pin ini harus diberi resistor Pull Up.
6. SDA
Pin SCL mengeluarkan sinyal data
VCC
VCC
10k
R29
PD3
R30
10k
U4
Y2
ZTA
1
2
6
J5
2
1
VCC
3
8
X1
X2
SCLK
DS1307
SDA
SQW/OUT
PD2
VBAT
VCC
CON2
Page 156
Page 157
PORTC=detik;
};
}
9.2. Percobaan RTC dengan display 7 Segmen
int data, ubah,menitsat, menitpul, detiksat, detikpul;
#include <mega8535.h>
#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
Petunjuk Praktikum AVR-Triwiyanto
Page 158
PORTD.5=0;
PORTD.6=0;
delay_ms(10);
PORTC=menitsat;//mengirimkan data kedigit6
PORTD.5=1;
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 159
Page 160
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
Page 161
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;
DDRC=0xff;
}
void main(void)
Petunjuk Praktikum AVR-Triwiyanto
Page 162
{ 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;
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;
Petunjuk Praktikum AVR-Triwiyanto
Page 163
};
if(data==data2){data=data;};
if(data==data3){data=data*2;};
if(data==data4){data=data*4;};
data=(float)data/1023*5;
lcd_putsf("multimtr digital");
lcd_clear();
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"Tegangan=%2.2f V",data);
lcd_puts(lcd_buffer);
delay_ms(50);
};
}
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
RANGKAIAN PROGRAMMER
Page 164
(AD
C3) PC3 (ADC2)
PC2 (ADC1)
PC1
A
D
C
0
)
P
C
0
A
G
N
D
AREF
AVCC
(SCK)
PB5
(MIS
O) PB4
(
OC2/MOSI)
PB3
S
S
/
O
C
1
B
) PB2 (OC1A) PB1
Page 165
Jalankan aplikasi CodeVisionAVR dengan cara melakukan klik ganda pada shortcut
ikon CodeVisionAVR yang terbentuk pada Desktop.
Sebuah Splash Screen akan muncul seperti ditunjukkan oleh Gambar 17. Informasi
tentang versi yang dipakai dan keterangan evaluation akan terlihat.
Page 166
Untuk memulai membuat project baru, pada menubar, pilih File New, seperti yang
ditunjukkan oleh Gambar 19.
Petunjuk Praktikum AVR-Triwiyanto
Page 167
Anda harus membuat sebuah project sebagai induk desain dengan memilih Project, lalu
klik tombol OK seperti pada Gambar 20.
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.
Page 168
Page 169
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
dengan resistor pullup internal yang disingkat dengan huruf P. Dengan mengaktifkan
resistor pull-up internal, Anda tidak perlu menambahkan resistor pull-up pada saklar.
Page 170
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.
Page 171
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.
Page 172
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.
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.
Page 173
Page 174
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.
Page 175
Page 176
Page 177
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.
Kotak dialog pada Gambar 37 akan muncul, pada tab After Make, pilih Program the
Chip. Lalu klik tombol OK.
Page 178
Setelah melakukan seting, lakukan make project dengan memilih menu Project Make,
seperti ditunjukkan oleh Gambar 38. Apabila tidak ada kesalahan maka kotak dialog
Petunjuk Praktikum AVR-Triwiyanto
Page 179
informasi seperti pada Gambar 39 akan muncul. Klik tombol Program untuk mentransfer
program kedalam mikrokontroler.
Page 180
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.
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.
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
Page 181
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(){
TCCR0=0x00;
#asm ("cli");
}
void atur()
{
Petunjuk Praktikum AVR-Triwiyanto
Page 182
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);};
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;
Petunjuk Praktikum AVR-Triwiyanto
Page 183
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);
}
}
interrupt [TIM0_OVF] void timer0_overflow(void)
{
TCNT0=0x00;
data=data+1;
}
Page 184