Anda di halaman 1dari 14

TUTORIAL PEMROGRAMAN MENGGUNAKAN CODE VISION AVR

Chip yang digunakan pada tutorial ini adalah AT mega 16/32/8535, ketiga chip tersebut memiliki
konfigurasi yang sama sehingga kita bisa menggunakan salah
h satu dari ketiga chip tersebut. Adapun
spesifikasi dari chip ini adalah sebagai berikut:

Mempunyai 32 buah pin I/O


Mempunyai 8 buah pin ADC (Port A)
Mempunyai 2 timer/counter 8 bit dan 1 timer/counter 16 bit,
bit, dengan beberapa fitur menu
didalamnya
Mempunyai 4 channel PWM
Dan masih banyak lagi spesifikasi yang lain

Adapun konfigurasi Atmega 16/32/8535 adalah sebagai berikut.

1. Modul LED
Pemrograman LED secara garis besar ada 2 macam, Aktif High dan Aktif Low, perbedaan dari
keduanya ada pada kofigurasi rangkaian led itu sendiri, untuk lebih jelasnya perhatikan
gambar dibawah ini.

Pada rangkaian Aktif High LED akan menyala jika inputannya High, sebaliknya Aktif LOW LED
akan menyalaketika inputannya Low (Tips: untuk rangkaian Aktif Low kita perlu untuk
memPul-Up AVR, karena defaultnya
nya AVR akan terus mengirim logika Low ketika tidak ada
perintah). Setelah kita tahu apa itu Aktif High dan Aktif Low, saatnya kita akan belajar cara
untuk mengcodingnya, proyek yang akan kita buat adalah Running LED
LED dengan ketentuan
sebagai berikut:
Menggunakan Atmega 16
Menggunakan Port A
1

Menggunakan 8 LED Aktif High


Clok : 11,059200 MHz

Setting AVR :

Coding AVR :
#include <mega16.h>
#include <delay.h> //header untuk delay_ms
void main(void)
{
PORTA=0x00; //pull up non aktif
DDRA=0xFF; //set output pada semua pin A
while (1)
//codingndibawah while terus mengulang
{
PORTA=0b00000001; //led paling kiri hidup
delay_ms(100);
//jeda waktu 100 ms
PORTA=0b00000010;
delay_ms(100);
PORTA=0b00000100;
delay_ms(100);
PORTA=0b00001000;
delay_ms(100);
PORTA=0b00010000;
delay_ms(100);
PORTA=0b00100000;
delay_ms(100);
PORTA=0b01000000;
delay_ms(100);
PORTA=0b10000000; //led paling kanan hidup
delay_ms(100);
};
}

2. Modul LCD
LCD yang akan kita gunakan adalah LCD 16x2,
16x2 adapun konfigurasi pinnya adalah sebagai
berikut:

Penulisan karakter pada LCD menggunakan metode sumbu (X,Y). Adapun karakteristik LCD
adalah sebgai berikut:
Terdapat 16 x 2 karakter huruf yang bisa ditampilkan.
Setiap huruf terdiri dari 5x7 dot-matrix
dot
cursor.
Terdapat 192 macam karakter.
Terdapat 80 x 8 bit display RAM (maksimal 80 karakter).
Memiliki kemampuan penulisan dengan 8 bit maupun dengan 4 bit.
Dibangun dengan osilator lokal.
Satu sumber tegangan 5 volt.
Otomatis reset saat tegangan dihidupkan.
dihidupka
Bekerja pada suhu 00C sampai 550C.
Adapun pemrograman dasar LCD adalah sebagai berikut:
lcd_clear();
lcd_gotoxy(x,y);

//berfungsi untuk menghapus layar lcd


//berfungsi untuk memberi alamat pada karakter,
apabila tidak menggunakan lcd_gotoxy(x,y); maka
alamat karakter otomatis berada pada koordinat
(0,0) / setelah karakter sebelumnya.
lcd_putsf(Karakter); //berfungsi untuk menulis string
lcd_putchar(C);
//berfungsi untuk menulis karakter
tips: untuk mengakses karakter yang tidak disediakan pada k
keyboard
kita bisa gunakan perintah lcd_putchar(nilai_karakter); bisa diisi
dari nilai 0-255.

Project yang akan kita buat adalah menampilkan karakter Laoading pada LCD, dengan
spesifikasi sebagai berikut:
Menggunakan Atmega 16
Menggunakan PORT C
Clok : 11,059200 MHz
Setting AVR :

Coding AVR :
#include <mega16.h>
#include <delay.h>
int i;
//deklarasi variabel i dengan tipe data integer
//setting lcd dari AVR
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
void main(void)
{
PORTC=0x00;
DDRC=0xFF;
//semua port c menjadi output
lcd_init(16); //setting lcd dari AVR
while (1)
{
lcd_clear();
for(i=0;i<16;i++)
{

//menghapus karakter
//looping sebanyak 16 kali

lcd_gotoxy(4,0);
//alamat karakter loading
lcd_putsf("Loading.");
lcd_gotoxy(i,1);
//alamat karakter block
lcd_putchar(255);
//kode karakter block
delay_ms(800);
//jeda looping for
}
lcd_clear();
lcd_gotoxy(5,0);
lcd_putsf("Sukses");
_putsf("Sukses");
lcd_gotoxy(0,1);
lcd_putsf("Karakter LCD16x2");
delay_ms(2000);
//jeda tampil karakter
};
}

3. Modul Saklar
Saklar sendiri terdiri dari berbagai macam tipe, diantaranya switch (saklar yang terus aktif
ketika dan
an setelah ditekan), push button (saklar yang aktif ketika ditekan) dan lain
sebagainnya. Konfigurasi saklar disini dibagi menjadi dua, yaitu Aklif High dan Aktif Low,
sebagaimana LED perbedaan saklar hanya pada kondisinya, LED sebagai Output sedangkan
saklar
lar sebagai Input. Pada kesempatan kali ini kita akan membuat program untuk kalibrasi 4
buah push button.. Adapun spesifikasi project adalah sebagai berikut :
Menggunakan Atmega 16
LCD PORTC
Push Button menggunakan PINB 0-PINB 3 Aktif Low
Clok : 11,059200 MHz
Setting AVR :

Coding AVR :
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
int i;
char data[100];
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
void cek_tombol()
{
lcd_gotoxy(0,0); lcd_putsf("KALIBRASI
TOMBOL\nMULAI..........!");
nMULAI..........!"); delay_ms(1500);
satu:
lcd_clear();
lcd_gotoxy(0,0); lcd_putsf("PINB.0"); delay_ms(200);
if (PINB.0==0) {lcd_clear();
{lcd_clear(); lcd_gotoxy(0,0);
lcd_putsf("PINB.0\
\n[BERHASIL]");
n[BERHASIL]"); delay_ms(500); goto dua;}
goto satu;
dua:
lcd_clear();
lcd_gotoxy(0,0); lcd_putsf("PINB.1"); delay_ms(200);
if (PINB.1==0)
(PINB.1==0) {lcd_clear(); lcd_gotoxy(0,0);
lcd_putsf("PINB.1\
\n[BERHASIL]");
n[BERHASIL]"); delay_ms(500); goto tiga;}
goto dua;
tiga:
lcd_clear();
lcd_gotoxy(0,0); lcd_putsf("PINB.2"); delay_ms(200);
if
f (PINB.2==0) {lcd_clear(); lcd_gotoxy(0,0);
lcd_putsf("PINB.2\
\n[BERHASIL]");
n[BERHASIL]"); delay_ms(500); goto empat;}
goto tiga;
empat:
lcd_clear();
lcd_gotoxy(0,0); lcd_putsf("PINB.3");
lcd_putsf("PINB.3"); delay_ms(200);
if (PINB.3==0) {lcd_clear(); lcd_gotoxy(0,0);
lcd_putsf("PINB.0\
\n[BERHASIL]");
n[BERHASIL]"); delay_ms(500); goto selesai;}
goto empat;
selesai:
lcd_gotoxy(0,0); lcd_putsf("KALIBRASI
TOMBOL\nSELESAI.....
nSELESAI........!"); delay_ms(1500);
}
void main(void)
{
PORTB=0x0F;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
lcd_init(16);

while (1)
{
cek_tombol();
};}

4. Modul Sensor Photodiode


Sensor photodione merupakan salah satu dari keluarga Diode dengan kemampuan khusus
yaitu dapat mengatur tegangan yang yng dikeluarkan berdasarkan seberapa banyak
intensitas cahaya yang mengenainya, sehingga banyak digunakan oleh para pembuat robot
Line Follower sebagai acuan untuk membedakan antara garis dan baground.
baground. Sensor ini tidak
dapat bekerja sendiri melainkan butuh sebuah triger cahaya dari LED dan pembatas arus
menggunakan resistor. Data yang dikelurkan dari photodiode merupakan data analog,
sehingga perlu diubah menjadi dat digital untuk dapat diproses oleh
oleh AVR.
Ada 2 cara untuk mengubah data analog menjadi data digital, yaitu dengan menambahkan
rangkaian Op Amp pada rangkaian atau dengan menggunakan menu ADC pada AVR itu
sendiri, terdapat 8 buah pin ADC (pin A) pada Atmega 16/32/8535 dengan pilihan 8 bit dan
10 bit, sehingga lebih memudahkan para programmer untuk mensetting menu ADC
menggunakan program.
Project kali ini kita akan menggunakan ADC dan menampilkan data binner 1 atau 0 pada
LCD, untuk membedakan garis hitam dan putih.
Setting AVR :

Coding AVR:
#include <mega16.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>
int n=100; //nilai pembanding data digital sensor
int adc0, adc1, adc2,
adc2 adc3, adc4, adc5, adc6, adc7;
bit acc0, acc1, acc2, acc3, acc4, acc5, acc6, acc7;
char data[100]; //media penyimpanan dari dasil convert int
int-char
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
#define ADC_VREF_TYPE 0x00
// 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;
}
unsigned char sensor;
void adc() //untuk mengambil data digital dan membandingkannya
{
adc0=read_adc(0);
if (adc0>n) {acc0=1;} else {acc0=0;}
adc1=read_adc(1);
if (adc1>n) {acc1=1;} else {acc1=0;}
adc2=read_adc(2);
if (adc2>n) {acc2=1;} else {a
{acc2=0;}

adc3=read_adc(3);
adc4=read_adc(4);
adc5=read_adc(5);
adc6=read_adc(6);
adc7=read_adc(7);

if
if
if
if
if

(adc3>n)
(adc4>n)
(adc5>n)
(adc6>n)
(adc6>n)
(adc7>n)

{acc3=1;}
{acc4=1;}
{acc5=1;}
{acc6=1;}
{acc7=1;}

else
else
else
else
else

{acc3=0;}
{acc4=0;}
{acc5=0;}
{acc6=0;}
{acc7=0;}

}
void tamp_acc() //untuk menampilkan hasil pembandingan pada LCD
{
adc();
lcd_clear(); lcd_gotoxy(0,0);
lcd_gotoxy(0,0
sprintf(data,"%d-%d
%d-%d-%d-%d-%d-%d-%d"
,acc7,acc6,acc5,acc4,acc3,acc2,acc1,acc0); //convert int
int-char
lcd_puts(data); delay_ms(1); //menampilkan data pada lcd
}
void main(void)
{
PORTA=0xFF;
DDRA=0x00;
PORTC=0x00;
DDRC=0xFF;
//setting ADC dan LCD dari AVR
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x86;
lcd_init(16);
while(1)
{
tmp_acc(); //menampilkan data acc
}};

5. Modul Motor DC
Motor sendiri mempunyai banyak macamnya, diantaranya motor DC, motor stepper, motor
servo dan lain sebagainya, kali ini kita akan membahas tentang kontrol motor DC. Disamping
itu driver (kontroller) untuk motor DC secara umum ada dua, yaitu menggunakan chip dan
non chip, driver non chip salah satunya menggunakan Mosfet, sedangkan untuk driver chip
ada banyak pilihan chip yang bisa digunakan, salah satunya menggunakan IC L293D.
Project kita kali ini adalah kontrol manuver motor DC dengan menggunakan IC L293D, disini
kita akan kontrol dengan menggunakan timer yang dibangkitkan dari timer/counter 0
dengan outputan enable PORTD.4 dan PORTD.5 dari AVR. Kontrol driver disini mengguna
menggunakan
2 buah PORT untuk direction dan sebuah
sebuah PORT timer untuk enable. Pin direction berfungsi
untuk kontrol arah motor (cw/ccw), sedangkan pin enable berfungsi untuk mengontrol pin
direction (seumpama enable tidak diaktifkan maka pin direction tidak akan ber
berfungsi) dan
mengatur kecepatan motor.
Spesifikasi project:
Driver motor menggunakan L293D
Dir motor kiri PORTD.0 dan PORTD.1 dengsn enable PORTD.4
Dir motor kanan PORTD.2 dan PORTD.3 dengsn enable PORTD.5
Menggunakan timer/counter 0 dengan frekuensi paling
palin rendah

Setting AVR :

10

Coding AVR:
#include <mega16.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>
#define EnKi
PORTD.4 // Enable L298 untuk motor kiri
#define dirA_Ki PORTD.0 // Direction A untuk motor kiri
#define dirB_Ki PORTD.1 // Direction B untuk motor kiri
#define EnKa
PORTD.5 // Enable L298 untuk motor kanan
#define dirC_Ka PORTD.2 // Direction C untuk motor kanan
#define dirD_Ka PORTD.3 // Direction D untuk motor kanan
//Coding Interrupt Timer 0
unsigned
ed char xcount,lpwm,rpwm;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
xcount++;
// xcount=xcount+1
if(xcount<=lpwm)EnKi=1;
// EnKi=1 jika xcount <= lpwm
else EnKi=0;
// EnKi=0 jika xcount > lpwm
if(xcount<=rpwm)EnKa=1;
(xcount<=rpwm)EnKa=1;
// EnKa=1 jika xcount <= rpwm
else EnKa=0;
// EnKa=0 jika xcount > rpwm
TCNT0=0xFF;
// Timer0 Value Menentukan periode
pulsa PWM
}
//Coding Manufer
void maju(unsigned char l, unsigned char r)
{
lcd_clear(); lcd_gotoxy(0,0);
lcd_gotoxy(0,0
lcd_putsf("MOTOR MAJU");
"); delay_ms(1);
lpwm=l; rpwm=r;
dirA_Ki=1;dirB_Ki=0;
dirC_Ka=1;dirD_Ka=0;
}
void mundur(unsigned char l, unsigned char r)
{
lcd_clear(); lcd_gotoxy(0,0);
lcd_gotoxy(0,0
lcd_putsf("MOTOR
MOTOR MUNDUR");
delay_ms(1);
lpwm=l; rpwm=r;
dirA_Ki=0;dirB_Ki=1;
dirC_Ka=0;dirD_Ka=1;
}
void stop()
{
lcd_clear(); lcd_gotoxy(0,0);
lcd_gotoxy(0,0
lcd_putsf("MOTOR STOP"); delay_ms(1);
lpwm=0; rpwm=0;
dirA_Ki=1;dirB_Ki=1;
dirC_Ka=1;dirD_Ka=1;
_Ka=1;dirD_Ka=1;
}
void parkir ()
{
while(1){ lcd_clear(); lcd_gotoxy(0,0);
lcd_gotoxy(0,0
lcd_putsf("MOTOR
MOTOR PARKIR
PARKIR");
delay_ms(1); stop();}
}
void kiri(unsigned char l, unsigned char r)
{
lcd_clear(); lcd_gotoxy(0,0);
lcd_gotoxy(0,0
lcd_putsf("MOTOR KIRI");
"); delay_ms(1);
lpwm=l; rpwm=r;
dirA_Ki=0;dirB_Ki=1;
dirC_Ka=1;dirD_Ka=0;
}
void kanan(unsigned char l, unsigned char r)
{
lcd_clear(); lcd_gotoxy(0,0);
lcd_gotoxy(0,0
lcd_putsf("MOTOR KANAN");
");
delay_ms(1);
lpwm=l; rpwm=r;
dirA_Ki=1;dirB_Ki=0;
dirC_Ka=0;dirD_Ka=1;

11

}
void main(void)
{
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
/* Timer/Counter 0 initialization. Clock source: System Clock. Clock
value: 10,800 kHz
Mode: Normal top=FFh. OC0 output: Disconnected */
TCCR0=0x05;
TCNT0=0x00;
OCR0=0x00;
// External Interrupt(s)
terrupt(s) initialization
// INT0: Off. INT1: Off. INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization. Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization. ADC Clock frequency: 172,800 kHz
// ADC Voltage Reference: AREF pin. ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x86;
// LCD module initialization
lcd_init(16);
// Global enable
ble interrupts
#asm("sei")
//Coding Dengan Perulangan
while (1)
{
maju(100,100); // bisa diganti dengan kiri(kecepatan
maju(100,100);
kiri,kecepatan kanan); dan lain sebagai nya.
}};

6. Modul Sensor Ultrasonic


Sensor ultrasonic merupakan salah satu dari sensor jarak yang paling diminati oleh para
programmer dan penghobi robotika pasalnya sensor ini harganya lebih murah dan terdapat
banyak dipasaran serta mudah dalam mengcodingnya. Sersor ultrasonic yang kita gunakan
kali ini adalah sensor ultrasonic SRF04,
S
adapun
un spesifikasinya adalah sebagai berikut:
Inputan 5 V
Jarak minimum 3 cm sedangkan jarak maxsimum 3 m (jangkauan diluar jarak
tersebut akan menghasilkan nilai pembacaan yang tidak sesuai)
Dimensi : 43mm x 20mm x 17mm
Sensor ultrasonic
sonic ini terdiri dari 5 buah pin, yaitu Vcc, Echo, Trigger, Output, dan Ground.
Prinsip keja dari sensor ini adalah pin Trigger mengirimkan sinyal yang kemudian terpantul
pada objek didepannya dan diterima oleh pin Echo, sampainya sinyal dari Trigger pada pin
Echo membutuhkan sebuah delay, delay inilah yang digunakan sebagai acuan untuk
mendapat nilai jarak dari sensor pada objek didepannya, semakin lama delay, maka jarak
sensor dari objek akan semakin jauh.

12

Pada pemrograman sensor ultasonic kita membutuhkan


membutuhkan suatu rumus tertentu untuk
mendapatkan besaran jarak, tapi pada tutorial kali ini penulis tidak akan membahas tentang
cara membuat rumus tersebut (pembahasan tentang rumus sensor ultrasonic insyaallah
akan diulas pada tutorial selanjutnya), tapi yang pasti
pasti sinyal clock pada AVR (nilai Crystal
external) akan berpengaruh pada rumus tersebut.
Selanjutnya kita akan membuat sebuah project sensor ultrasonic dengan gabungan animasi
LCD, dengan spesifikasi sebagai berikut :
Menggunakan Atmega 16
LCD menggunakan
menggunak PORTC
Trigger PORTA.1 & Echo PINA.0 (istilah PORT digunakan untuk Output sedangkan PIN
digunakan untuk Input)
Clok : 11,059200 MHz
Setting AVR :

Coding AVR :
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#define trigger PORTA.1
#define echo PINA.0
int i;
char data[100];
#asm
.equ __lcd_port=0x15 ;PORTC

13

#endasm
#include <lcd.h>
int jarak;
void ukur_jarak()
{
int i;
jarak=0;
delay_us(100);
trigger=1;
delay_us(15);
trigger=0;
delay_us(100);
while(!echo);
for (i=0;i<=500;i++)
{
if
f (echo) {jarak++;}
delay_us(58);
}
sprintf (data,"%d cm",jarak);
lcd_clear();
lcd_gotoxy(6,0);
lcd_puts(data);
delay_ms(100);
}
void main(void)
{
PORTA=0x00;
DDRA=0x0E;
PORTC=0x00;
DDRC=0xFF;
lcd_init(16);
while (1)
{
lcd_clear();
for(i=0;i<16;i++)
{
lcd_gotoxy(4,0);
lcd_putsf("Loading.");
lcd_gotoxy(i,1);
lcd_putchar(255);
delay_ms(400);
}
lcd_clear();
lcd_gotoxy(5,0);
lcd_putsf("Sukses");
lcd_gotoxy(0,1);
lcd_putsf("Karakter LCD16x2");
delay_ms(1000);
while(1){
ukur_jarak();
}};}

Bangkalan, 24 Februari 2015


14