Anda di halaman 1dari 30

DRIVER MOTOR DC DENGAN IC L293D

IC L293D adlah IC yang didesain khusus sebagai driver motor DC dan dapat
dikendalikan dengan rangkaian TTL maupun mikrokontroler. Motor DC yang dikontrol
dengan driver IC L293D dapat dihubungkan ke ground maupun ke sumber tegangan
positif karena di dalam driver L293D sistem driver yang digunakan adalah totem pool.
Dalam 1 unit chip IC L293D terdiri dari 4 buah driver motor DC yang berdiri sendiri
sendiri dengan kemampuan mengalirkan arus 1 Ampere tiap drivernya. Sehingga
dapat digunakan untuk membuat driver H-bridge untuk 2 buah motor DC. Konstruksi
pin driver motor DC IC l293D adalah sebagai berikut.

Konstruksi Pin Driver Motor DC IC L293D

Fungsi Pin Driver Motor DC IC L293D

Pin EN (Enable, EN1.2, EN3.4) berfungsi untuk mengijinkan driver menerima perintah
untuk menggerakan motor DC. Pin In (Input, 1A, 2A, 3A, 4A) adalah pin input sinyal
kendali motor DC Pin Out (Output, 1Y, 2Y, 3Y, 4Y) adalah jalur output masing-masing
driver yang dihubungkan ke motor DC Pin VCC (VCC1, VCC2) adalah jalur input
tegangan sumber driver motor DC, dimana VCC1 adalah jalur input sumber tegangan
rangkaian kontrol dirver dan VCC2 adalah jalur input sumber tegangan untuk motor
DC yang dikendalikan. Pin GND (Ground) adalah jalu yang harus dihubungkan ke
ground, pin GND ini ada 4 buah yang berdekatan dan dapat dihubungkan ke sebuah
pendingin kecil.

Feature Driver Motor DC IC L293D

Driver motor DC IC L293D memiliki feature yang lengkap untuk sebuah driver motor
DC sehingga dapat diaplikasikan dalam beberapa teknik driver motor DC dan dapat
digunakan untuk mengendalikan beberapa jenis motor DC. Feature yang dimiliki driver
motor DC IC L293D sesuai dengan datasheet adlah sebagai berikut :
 Wide Supply-Voltage Range: 4.5 V to 36 V
 Separate Input-Logic Supply
 Internal ESD Protection
 Thermal Shutdown
 High-Noise-Immunity Inputs
 Functionally Similar to SGS L293 and SGS L293D
 Output Current 1 A Per Channel (600 mA for L293D)
 Peak Output Current 2 A Per Channel (1.2 A for L293D)
 Output Clamp Diodes for Inductive Transient Suppression (L293D)

Rangkaian Aplikasi Driver Motor DC IC L293D

Pada gambar driver IC L293D diatas adalah contoh aplikasi dari keempat unit driver
motor DC yang dihubungkan secar berbeda sesuai dengan keinginan dan kebutuhan.
DRIVER MOTOR DC MENGGUNAKAN IC L293D

Pada dasarnya beberapa aplikasi yang menggunakan motor DC harus dapat


mengatur kecepatan dan arah putar dari motor DC itu sendiri. Untuk dapat melakukan
pengaturan kecepatan motor DC dapat menggunakan metode PWM (Pulse Width
Modulation) sedangkan untuk mengatur arah putarannya dapat menggunakan
rangkaian H-bridge yang tersusun dari 4 buah transistor. Tetapi dipasaran telah
disediakan IC L293D sebagai driver motor DC yang dapat mengatur arah putar dan
disediakan pin untuk input yang berasal dari PWM untuk mengatur kecepatan motor
DC.

Untuk lebih memahami tentang membangkitkan sinyal PWM menggunakan fitur Timer
pada mikrokontroler AVR dapat membacanya pada postingan tutorial AVR tentang
PWM.

Sebelum membahas tentang IC L293D, alangkah baiknya jika kita membahas driver
motor DC menggunakan rangkaian analog terlebih dahulu.

Jika diinginkan sebuah motor DC yang dapat diatur kecepatannya tanpa dapat
mengatur arah putarnya, maka kita dapat menggunakan sebuah transistor sebagai
driver. Untuk mengatur kecepatan putar motor DC digunakan PWM yang dibangkitkan
melalui fitur Timer pada mikrokontroler. Sebagian besar power supply untuk motor DC
adalah sebesar 12 V, sedangkan output PWM dari mikrokontroler maksimal sebesar
5 V. Oleh karena itu digunakan transistor sebagai penguat tegangan. Dibawah ini
adalah gambar driver motor DC menggunakan transistor.
Sedangkan jika diinginkan sebuah motor DC yang dapat diatur kecepatan atau arah
putarnya maka digunakanlah rangkaian H-brigde yang tersusun dari 4 buah transistor.

Dari gambar diatas jika diinginkan motor DC berputar searah jarum jam maka harus
mengaktifkan transistor1 dan transistor4 dengan cara memberikan logika high pada
kaki Basis transistor tersebut. Sedangkan untuk berputar berlawanan arah jarum jam
maka harus mengaktifkan transistor2 dan transistor 3 dengan cara memberikan logika
high pada kaki Basis transistor tersebut. Untuk lebih jelasnya perhatikan gambar
dibawah ini.

Dari gambar diatas terlihat jelas bahwa dengan mengaktifkan transistor1 dan
transistor4 akan menyebabkan motor DC berputar searah jarum jam. Dimana arus
listrik akan mengalir dari power supply (12 V) melalui transistor1, lalu ke motor DC,
lalu ke transistor4 dan akan berakhir di ground. Begitu juga sebaliknya untuk putaran
berlawanan arah jarum jam.

Sedangkan untuk pengaturan kecepatannya anda dapat menghubungkan output


PWM ke kaki basis transistor1 untuk putaran searah jarum jam. Dan untuk putaran
berlawanan arah jarum jam, output PWM dapat dihubungkan kekaki basis transistor2.

Saatnya membahas tentang IC L293D, untuk lebih jelasnya dapat dibaca di datasheet.
Silakan download disiniuntuk datasheet IC L293D. Disini saya akan menjelaskan
sedikit dasar teori tentang IC L293D, tetapi saya akan lebih banyak memfokuskan
tentang bagaimana cara penggunaannya.

Sekarang saya akan membuat sebuah aplikasi yang akan mengatur kecepatan dan
arah putar sebuah motor DC menggunakan IC L293D jika di hubungkan dengan
mikrokontroler AVR.
Dari gambar diatas pin EN1 merupakan sebuah pin yang difungsikan untuk meng-
enable-kan motor DC (ON/OFF motor DC), oleh karena itu pin EN1 dapat
dihubungkan dengan output PWM dari mikrokontroler. Sedangkan pin IN1 dan IN2
digunakan sebagai input logika untuk mengatur putaran motor DC dan dapat juga
digunakan untuk memberhentikan motor DC secara cepat (fast motor stop). Untuk
lebih jelas tentang pin IN1 dan IN2 dapat dilihat pada tabel berikut.

IN1 IN2 Kondisi Motor

0 0 fast motor stop

0 1 putar searah jarum jam

1 0 putar berlawanan arah jarum jam

1 1 fast motor stop

Jika diinginkan motor berputar searah jarum jam, maka pin mikrokontroler PD6 (IN1)
diberi logika low dan PD7 (IN2) diberi logika high. Sedangkan EN1 dihubungkan
dengan output PWM mikrokontroler (PD4).
Bagaimana jika akan mengatur arah dan kecepatan putar 2 buah motor DC? Berikut
adalah rangkaiannya dan cara kerjanya pun sama seperti cara kerja menggunakan
sebuah motor DC.

Dari gambar diatas, untuk pengaturan arah dan kecepatan 2 buah motor DC maka
hanya tinggal menambahkan sebuah motor pada output3 dan output4. Dan pin EN2
merupakan sebuah pin yang difungsikan untuk meng-enable-kan motor DC 2
(ON/OFF motor DC), oleh karena itu pin EN2 dapat dihubungkan dengan output PWM
dari mikrokontroler. Sedangkan pin IN3 dan IN4 digunakan sebagai input logika untuk
mengatur putaran motor DC 2 dan dapat juga digunakan untuk memberhentikan motor
DC 2 secara cepat (fast motor stop). Tabel input logika IN3 dan IN4 sama dengan
tabel logika IN1 dan IN2.

Cara pengaturan arah dan kecepatan 2 buah motor DC sama dengan menggunakan
sebuah motor DC.

Untuk mempermudah, dari gambar diatas saya tambahkan garis kotak berwarna
merah dan berwarna biru. Garis berwarna merah terdiri input dan output untuk
mengatur arah dan kecepatan motor DC 1. Sedangkan garis berwarna biru terdiri dari
input dan output untuk mengatur arah dan kecepatan motor DC 2.

CATATAN: pin VS (kaki 8 IC L293D) merupakan power supply untuk motor DC,
sedangkan pin VSS (kaki 16 IC L293D) merupakan power supply untuk IC L293D.
Direkomendasikan pada pin ground IC L293D dihubungkan dengan Heat sink, untuk
mengurangi panas pada IC dikarenakan motor DC merupakan beban yang relatif
cukup besar.
MEMBUAT SINYAL PWM MENGGUNAKAN TIMER AVR

Mungkin teman-teman semua sudah tau pengertian dari PWM (Pulse Width
Modulation), jadi saya tidak akan membahasnya lagi. Disini saya akan menjelaskan
beberapa istilah yang berhubungan dengan PWM sehingga nantinya akan
mempermudah teman-teman dalam pembuatan sinyal PWM menggunakan Timer
pada AVR.

Gambar diatas merupakan sinyal PWM dengan amplitudo 5 volt. Dari gambar diatas
dapat diketahui pengertian dari 1 periode gelombang, yaitu lamanya interval waktu
dalam 1 panjang gelombang, gambar diatas mempunyai periode 10 ms. sedangkan
duty cycle, yaitu lamanya pulsa high (on) selama 1 periode, terlihat bahwa lamanya
duty cycle 7 ms. Biasanya duty cycle ditulis dalam satuan persentase (%). Jika dari
gambar diatas ingin mengubah duty cycle kedalam persen yaitu:

Duty cycle = (interval pulsa high dalam 1 periode/periode gelombang)*100%

Sehingga gambar diatas mempunyai duty cycle sebesar 70%.

Jika periode suatu gelombang diketahui, maka dapat dihitung berapa frekuensinya,
menggunakan:

F=1/T

F = Frekuensi (Hz)

T = Periode (detik)

Maka frekuensi dari gambar diatasa adalah F = 1/10 ms= 100 Hz.
Untuk menghasilkan sinyal PWM pada AVR digunakan fitur timer. AVR Atmega 8535
mempunyai 3 buah timer, tetapi disini saya akan membahas Timer0 dan Timer1 saja
yang digunakan untuk membangkitkan sinyal PWM. Pada dasarnya Timer0 dan
Timer1 mempunyai 4 buah mode untuk membangkitkan sinyal PWM. Untuk lebih
jelasnya teman-teman baca datasheet saja.

Disini saya akan membangkitkan sinyal PWM menggunakan Timer0 dan timer1
dengan menggunakan 2 buah mode saja, yaitu Phase Correct PWM dan Fast PWM.
Untuk pengertian dan penjelasan masing-masing mode dapat dilihat didatasheet.

Output pin PWM pada Atmega8535 terdapat pada 2 buah pin yaitu PD4 (OC1B) dan
PD5 (OC1A).

Timer0

Mode Phase Correct PWM

Foc0 = Fosc/(N*512)

D = (OCR0/255)*100%

Mode Fast PWM

Foc0 = Fosc/(N*256)

D = (OCR0/255)*100%

Dimana:

Foc0 = Frekuensi output OC0

N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)

D = Duty cycle

Fosc = Frekuensi clock kristal yang digunakan

Timer1

Mode Phase Correct PWM

Foc1a = Fosc/(2*N*(1+TOP))

Foc1b = Fosc/(2*N*(1+TOP))
D = (OCR1X/TOP)*100%

Mode Fast PWM

Foc1a = Fosc/(N*(1+TOP))

Foc1b = Fosc/(N*(1+TOP))

D = (OCR1X/TOP)*100%

Dimana:

Foc1a = Frekuensi output OC1A

Foc1b = Frekuensi output OC1B

N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)

D = Duty cycle

Fosc = Frekuensi clock kristal yang digunakan

TOP = nilai maksimum counter (TCNT1), TOP mempunyai 3 buah nilai untuk kedua

mode tersebut yaitu 8 bit (FF), 9 bit (1FF) dan 10 bit (3FF)

Sekarang saya akan membuat aplikasi membangkitkan sinyal PWM dengan periode
20 ms dengan duty cycle 75%, menggunakan Timer1 10 Bit Mode Fast PWM.

Dengan menggunakan kristal 12 Mhz, N = 256 dan TOP = 10 bit = 3FF = 1023

Maka akan didapat frekuensi output (Foc1x) sebesar 45,77 Hz atau jika diubah
kedalam peroide 21,8 ms ≈ 20 ms

Untuk Duty cycle:

D = (OCR1X/TOP)*100%

75% = (OCR1X/1023)*100%

OCR1X = 767 = 2FF (dalam hexa)

Untuk membangkitkan periode yang benar-benar presisi pada sinyal PWM sangat sulit
sekali karena kita hanya mampu memanipulasinya lewat 3 parameter saja
yaitu, frekuensi kristal yang kita gunakan (tidak semua nilai frekuensi kristal ada
dipasaran), skala clock atau N (hanya mempunyai nilai 1, 8, 64, 256, 1024)
dan TOP(untuk kedua mode diatas mempunyai 3 buah nilai 8, 9 dan 10 bit). Dengan
kombinasi ketiga variabel diatas kita harus benar-benar dapat menentukan periode
output yang kita inginkan, menurut saya itu sangat sulit sekali.

Untuk aplikasi diatas berikut adalah setting untuk CodeVision CodeWizard


AVR. Clock Value bernilai 46.875 berasal dari Fosc/N atau 12 MHz/256.

Penjelasan diatas adalah untuk membangkitkan sinyal PWM sesuai dengan output
yang kita inginkan, sedikit sulit memang. Tetapi pada dasarnya banyak sekali aplikasi
yang menggunakan PWM tanpa harus memperdulikan kepresisian periode output,
contohnya pengaturan motor DC. Untuk aplikasi pengaturan motor DC sangat simple
sekali programnya.

Baiklah sekarang saya akan mengimplementasikan aplikasi pengaturan kecepatan


motor DC menggunakan input yang berasal dari potensiometer. Cara kerjanya
kecepatan motor DC diatur oleh potensio yang nilainya didapat dari pembacaan ADC.
Untuk PWM nya saya gunakan hasil dari yang diatas (Timer1 10 bit mode Fast PWM).
Berikut adalah setting untuk CodeWizard AVR dan schematicnya:
Berikut adalah listing program lengkapnya (sangat simple):
#include <mega16.h>
#include <delay.h>

int potensio;

#define ADC_VREF_TYPE 0×00

// Read the AD conversion result


unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0×40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0×10)==0);
ADCSRA|=0×10;
return ADCW;
}

void main(void)
{
// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In
Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTD=0×00;
DDRD=0×30;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 46.875 kHz
// Mode: Ph. correct PWM top=03FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// 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=0xA3;
TCCR1B=0×04;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×02;
OCR1AL=0xFF;
OCR1BH=0×00;
OCR1BL=0×00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0×84;

while (1)
{
potensio=read_adc(0);//membaca nilai ADC potensio
OCR1A=potensio;//nilai potensio diumpan ke register PWM untuk ngatur
kecepatan motor
};
}
PENGISIAN TANGKI (TANDON) AIR OTOMATIS
MENGGUNAKAN ATMEGA8535

Beberapa bulan yang lalu saya telah membuat aplikasi pengisian tangki air otomatis
menggunakan mikrokontroler. Mungkin aplikasi ini sangat sederhana dan terbilang
cukup mahal jika menggunakan mikrokontroler, dikarenakan dipasaran sudah banyak
yang menjual sensor level air menggunakan bandul dan sudah mempunyai output
untuk relay. Tetapi tidak ada salahnya jika kita mencoba membuatnya menggunakan
mikrokontroler, anggap saja sebagai latihan.

Pada aplikasi ini saya menggunakan prinsip penekanan push button sebagai cara
untuk mendeteksi level air (sensor level air). Terdapat 2 buah sensor level air yaitu
MAX dan MIN, sedangkan GND digunakan untuk mendeteksi sensor mana yang
sedang terbaca. Cara kerjanya jika air berada dibawah sensor MIN maka sensor MIN
(PC3) akan belogika high. Kemudian jika air berada diatas sensor MIN maka sensor
MIN (PC3) akan berlogika low (terhubung ke GND karena terkena air). Begitu juga
untuk sensor MAX (PC2), jika air sudah penuh (menyentuh sensor MAX) maka yang
awalnya sensor MAX (PC2) berlogika high akan berubah menjadi low.

Dengan kata lain jika tangki air sedang kosong maka sensor MIN dan MAX akan
berlogika high dan jika air sudah penuh sensor MIN dan sensor MAX akan berlogika
low.

Kemudian terdapat duah buah saklar yaitu saklar MODE dan POMPA. Saklar MODE
digunakan untuk pemilihan mode yaitu otomatis dan manual. Jika mode otomatis
maka motor pompa akan bekerja (mengisi) jika tangki air sedang kosong (dibawah
sensor MIN), dan akan berhenti mengisi ketika terdeteksi sensor MAX (penuh). Untuk
mode manual motor pompa dapat dinyalakan secara manual menggunakan saklar
POMPA, jika dinyalakan motor pompa tersebut dan air sudah penuh, maka saya buat
motor pompa tersebut mati dengan sendirinya. Dan terdapat beberapa LED yang
digunakan sebagai indikator untuk masing-masing parameter.
Berikut adalah listing program lengkapnya:

//kondisi=0 adalah keadaan kosong,


//kondisi=1 adalah keadaan penuh,
//penggunaan variabel kondisi berfungsi sebagai penghilang
//efek bouncing yg disebabkan oleh gelombang air
bit kondisi;

#include <mega16.h>

#define pompa PORTA.0


#define ind_pompa PORTA.5
#define ind_min PORTA.7
#define ind_max PORTA.6
#define mode PINC.0
#define on_off PINC.1
#define maxim PINC.2
#define minim PINC.3
void otomatis()//pemilihan mode otomatis
{
if (mode==1)//mode otomatis
{
if (kondisi==0)
{
if (maxim==1)//kosong
{
pompa=0;
ind_pompa=0;
}

if (maxim==0)//penuh
{
pompa=1;
ind_pompa=1;
kondisi=1;
}
}

if (kondisi==1)
{
if (minim==1)
{
kondisi=0;
}
}
}
}

void manual()//pemilihan mode manual


{
if (mode==0)//manual
{
if (maxim==0)
{
pompa=1;
ind_pompa=1;
}
else
{
if (on_off==0)
{
pompa=0;
ind_pompa=0;
}
else
{
pompa=1;
ind_pompa=1;
}
}
}
}

void indikator()//menyalakan indikator LED MIN dan MAX


{
if (maxim==0) ind_max=0;
else ind_max=1;
if (minim==0) ind_min=0;
else ind_min=1;
}

void main(void)
{
DDRA=0xff; //inisialisasi port mikro
PORTA=0xff;
DDRC=0×00;
PORTC=0xff;
while (1)
{
otomatis();
manual();
indikator();
};
}
COUNTER (PENGHITUNG) 0-9999 MENGGUNAKAN
PENAMPIL SEVEN SEGMENT DENGAN CODEVISION AVR

Pada aplikasi counter 0-9999 saya menggunakan fitur timer/counter1 yang dapat
menghitung sampai 65536 (16 bit). Untuk lebih jelasnya mengenai timer dan counter
AVR, dapat membaca postingan saya di tutorial timer dan counter AVR.

Dikarenakan saya menggunakan 4 buah seven segment tipe CA (common anoda),


maka hanya dapat menampilkan maksimal 9999 penghitungan. Untuk mendapatkan
datasheet penampil seven segment silakan download disini. Metode yang saya
gunakan untuk menampilkan di seven segment adalah metode scanning, untuk lebih
jelasnya tentang seven segment silakan baca tutorial seven segment. Jika
penghitungan telah mencapai 10000 maka akan saya set kembali menjadi 0000.
Berikut adalah schematic rangkaiannya.
Input timer/counter1 berasal dari pin PB1(T1), dimana untuk aplikasi ini saya
menggunakan sebuah push button sebagai inputnya. Pada program yang saya buat,
jika terjadi perubahan logika dari high ke low (falling edge) maka akan dideteksi
sebagai input counter. Untuk input yang berupa push button diatas dapat diganti
menggunakan sensor yang sesungguhnya. Berikut adalah listing program
lengkapnya:

#include <mega16.h>
#include <delay.h>
int data, data_temp;
char ribuan, ratusan, puluhan, satuan, ubah;
void ambil_data_counter()
{
if (TCNT1==10000){TCNT1=0;}//jika counter bernilai 10000 maka kembali lagi ke
0000
data=TCNT1;//nilai dari register counter1 diumpankan ke data
}
void tampil_7segment()
{
PORTC=ribuan;//mengirimkan data ribuan
PORTD=0b11110111;//menyalakan digit1
delay_ms(5);
PORTC=ratusan;//mengirimkan data ratusan
PORTD=0b11111011;//menyalakan digit2
delay_ms(5);
PORTC=puluhan;//mengirimkan data puluhan
PORTD=0b11111101;//menyalakan digit3
delay_ms(5);
PORTC=satuan;//mengirimkan data satuan
PORTD=0b11111110;//menyalakan digit4
delay_ms(5);
//lamanya waktu scanning ditentukan oleh intruksi delay
}
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=0×99;}
if (ubah==5){ubah=0×92;}
if (ubah==6){ubah=0×82;}
if (ubah==7){ubah=0xf8;}
if (ubah==8){ubah=0×80;}
if (ubah==9){ubah=0×90;}
}
void ambil_nilai_tiap_digit()
{
data_temp=data;
satuan=data_temp%10;//sisa dari pembagian disimpan di variabel satuan
ubah=satuan;
ubah_ke_format7segment();//panggil fungsi mengubah kedalam format
7segment
satuan=ubah;
data_temp=data_temp/10;
puluhan=data_temp%10;
ubah=puluhan;
ubah_ke_format7segment();
puluhan=ubah;
data_temp=data_temp/10;
ratusan=data_temp%10;
ubah=ratusan;
ubah_ke_format7segment();
ratusan=ubah;
data_temp=data_temp/10;
ribuan=data_temp%10;
ubah=ribuan;
ubah_ke_format7segment();
ribuan=ubah;
}
void main(void)
{
PORTC=0xff;
DDRC=0xff;
PORTD=0x0f;
DDRD=0x0f;
// Timer/Counter 1 initialization
// Clock source: T1 pin Falling Edge
// 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=0×00;
TCCR1B=0×06;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;
while (1)
{
ambil_data_counter();
ambil_nilai_tiap_digit();
tampil_7segment();
};
}
JAM DIGITAL MENGGUNAKAN RTC DS1307 DENGAN
CODEVISION AVR

RTC DS1307 berkomunikasi dengan antarmuka I2C (Inter Integrated Circuit). RTC
DS1307 memiliki pewaktu dalam variabel detik, menit, jam, hari, tanggal, bulan dan
tahun. Selain itu, RTC ini menyediakan pin battery-backup untuk dihubungkan pada
baterai lithium 3V atau catu daya lain sehingga ketika power (catu daya) mati,battery-
backup akan mengambil alih dan timer tetap akan berjalan sebagaimana mestinya.
Sedangkan kristal yang digunakan menurut datasheet bernilai 32,768 KHz.

Dengan menggunakan bantuan pada CodeWizardAVR pada Codevision AVR, yang


sudah terdapat library untuk DS1307, maka kita akan dengan mudah dapat
mengakses RTC DS1307. Setting seperti gambar dibawah ini:
Dan menurut CodeVisionAVR Help, terdapat beberapa instruksi untuk mengakses
DS1307:

void rtc_init(unsigned char rs, unsigned char sqwe, unsigned char out)
Instruksi ini untuk inisialisasi DS1307, dimana:
Parameter rs digunakan untuk menghasilkan nilai dari frekuensi gelombang kotak
pada pin SQW/OUT DS1307:
Jika rs bernilai:
0 untuk 1 Hz
1 untuk 4096 Hz
2 untuk 8192 Hz
3 untuk 32768 Hz
Jika parameter sqwe bernilai 1 maka output gelombang kotak pada pin SQW/OUT
DS1307 akan di enable.
Parameter out merupakan level logika pada pin SQW/OUT saat output gelombang
kotak di disable (sqwe=0)

void rtc_get_time(unsigned char *hour, unsigned char *min, unsigned char *sec)
Intruksi ini untuk mendapatkan nilai *hour (jam), *min (menit) dan *sec (detik). Untuk
variabel hour, min dan sec dapat kita ganti namanya sesuai keinginan kita tetapi
harus bertipe data unsigned char.

void rtc_get_date(unsigned char *date, unsigned char *month, unsigned char *year)
Intruksi ini untuk mendapatkan nilai *date (tanggal), *month (bulan) dan
*year (tahun). Untuk variabel date, month dan year dapat kita ganti namanya sesuai
keinginan kita tetapi harus bertipe data unsigned char.

void rtc_set_time(unsigned char hour, unsigned char min, unsigned char sec)
intruksi ini digunakan untuk menset nilai hour (jam), min (menit) dan sec (detik)
sesuai keinginan kita.

void rtc_set_date(unsigned char date, unsigned char month, unsigned char year)
intruksi ini digunakan untuk menset nilai date (tanggal), month (bulan) dan year
(tahun) sesuai keinginan kita.

Dibawah ini adalah listing program lengkapnya:

unsigned char h, m, s, d, mo, y, temp[16];


/*
h=hour, m=minute, s=second
d=day, mo=month, y=year
*/

#include <mega16.h>
#include <stdio.h>
#include <delay.h>

// I2C Bus functions


#asm
.equ __i2c_port=0x1B ;PORTA
.equ __sda_bit=0
.equ __scl_bit=1
#endasm
#include <i2c.h>

// DS1307 Real Time Clock functions


#include <ds1307.h>

// Alphanumeric LCD Module functions


#asm
.equ __lcd_port=0×15 ;PORTC
#endasm
#include <lcd.h>

void main(void)
{
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

// I2C Bus initialization


i2c_init();
rtc_init(0,0,0);
lcd_init(16);

//rtc_set_time(9,10,26); //untuk menset jam 09:10:26


//rtc_set_date(8,11,87); //untuk menset tanggal: 8 nov 1987

while (1)
{
rtc_get_time(&h,&m,&s); //mendapatkan nilai jam, menit dan detik
rtc_get_date(&d,&mo,&y); //mendapatkan nilai tanggal, bulan dan tahun

lcd_gotoxy(0,0);
sprintf(temp,”Time %d:%d:%d”,h,m,s);
lcd_puts(temp);//tampilkan jam di LCD baris pertama

lcd_gotoxy(0,1);
sprintf(temp,”Date %d-%d-%d”,d,mo,y);
lcd_puts(temp);//tampilkan tanggal di LCD baris kedua
};
}

Anda mungkin juga menyukai