Professional Documents
Culture Documents
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:
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
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);
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();
};}
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.
}};
12
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();
}};}