Driver Motor DC Dengan Ic l293d [PDF]

  • 0 0 0
  • Suka dengan makalah ini dan mengunduhnya? Anda bisa menerbitkan file PDF Anda sendiri secara online secara gratis dalam beberapa menit saja! Sign Up
File loading please wait...
Citation preview

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 mengenable-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 #include 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 #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 #include 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,batterybackup 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 #include #include // I2C Bus functions #asm .equ __i2c_port=0x1B ;PORTA .equ __sda_bit=0 .equ __scl_bit=1 #endasm #include // DS1307 Real Time Clock functions #include // Alphanumeric LCD Module functions #asm .equ __lcd_port=0×15 ;PORTC



#endasm #include 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 }; }