"Kembali Ke Dasar Elektronika Digital ... "

Kamis, 27 Juni 2013

Tutorial : Membuat RTC internal pada AVR


Real Time Clock mempunyai fungsi sebagai pewaktu stand-alone yang akan hidup walaupun rangkaian utama mati. Jadi pada intinya informasi waktu akan tersedia kapanpun diinginkan. Sadarkah kamu kalau RTC yg umum dipasaran seperti DS1307 (serial) atau 12C887 (parallel) memiliki note ini pada datasheet ?



Nah...untuk itu kita kembali review ke posting yang membahas mengenai timer/counter disini . Semua fungsi timer dapat dihasilkan oleh sebuah IC AVR. Tingkat akurasi? asal programmingnya tidak menggunakan delay manual dan proses interupt dijaga sesimple mungkin maka sesuai pengalaman penulis sangatlah akurat, apalagi menggunakan clock input yang berasal dari xtal dengan kualitas yang bagus.

Kalau power diputus bagaimana cara pewaktu tetap jalan ? Tenang saja, cukup menggunakan baterai 4.5v(3 x AA) seperti rangkaiana berikut :





Prinsip rangkaian diatas adalah sebagai berikut:


  1. Regulator 5v menghasilkan tegangan VCC 5v dan akan mencatu rangkaian selama terdapat tegangan Vin (input regulator).
  2. Baterai 4.5v dan dioda akan menghasilkan tegangan 4.5v dikurangi 0.7v  = 3.8 volt yang sesuai dengan hukum khircof maka tegangan yang muncul di ujung dioda (ketika ada input di regulator) adalah 5 volt. Baterai akan aman dari tegangan balik karena ada dioda.
  3. Ketika tegangan input (Vin) hilang alias mati lampu, maka otomatis baterai akan mencatu rangkaian walaupun hanya menggunakan 3.8 volt. Microcontroller sekelas AVR menggunakan tegangan dengan range yang lebar (2.7 - 5.5  volt) terutama pada seri yang ada embel2nya "L" atau "LV", dengan catatan tidak ada proses yang sensitif terhadap penurunan catu daya seperti ADC. Ini dapat diakali dengan berbagai cara salah satunya melakukan pengukuran Vref atau menghentikan perhitungan ADC dan sebagainya.


Kita akan lanjut pada contoh pemakaiannya dengan memperhatikan script menulis tanggal dan jam di LCD dibawah ini, siapkan rangkaian seperti pada penjelasan menulis lcd disini :



Untuk lebih akurat, kaki 4 & 5 dihubungkan ke xtal (sesuai script 4Mhz) 
dan tiap kaki xtal dihubungkan dengan capasitor 22pF ke ground
Untuk Baterai backup dan tegangan 5v digunakan seperti contoh sebelumnya



/*=============================
JAM AKURAT dengan RTC INTERNAL
ATTINY 2313 , 4Mhz Xtal Clock
by: ahocool@gmail.com    
www.aisi555.com
=============================*/
#define F_CPU 4000000UL //sesuaikan dengan clock yang dipakai
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd.h" //silahkan baca pembahasan menulis di LCD
#include <string.h>

uint8_t jam,menit,detik,bulan,tanggal,tahun; 
char bul_max[13]={0,31,28,31,30,31,30,31,31,30,31,30,31} ;
const char bul_name[13][4] PROGMEM={"xxx","Jan","Feb","Mar","Apr","Mei","Jun","Jul","Ags","Sep","Okt","Nov","Des"} ;
void reverse(char s[]) 
{ 
   int c, i, j; 
    
   for (i = 0, j = strlen(s)-1; i < j; i++, j--){ 
      c = s[i]; 
      s[i] = s[j]; 
      s[j] = c; 
   } 
} 
void itoa(int n, char s[]) 
{ 
   int i, sign; 
    
   if ((sign = n) < 0) // record sign 
      n = -n;         // make n positive 
   i = 0; 
   do {   // generate digits in reverse order 
      s[i++] = n % 10 + '0'; // get next digit 
   } while ((n /= 10) > 0); // delete it 
   if (sign < 0) 
      s[i++] = '-'; 
   s[i] = '\0'; // add null terminator for string 
   reverse(s); 
}
void init_jam(void)
{
   TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
   OCR1A  = 62499; //compare the CTC A 
   TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64
   TCNT1 = 0;
   sei();
} 



void tulis_lcd(void)
{
char dum;

lcd_clrscr();


lcd_gotoxy(3,0);
itoa(tanggal,&dum);
lcd_puts(&dum);
lcd_putc('-');
lcd_puts_p(bul_name[bulan]);
lcd_puts("-20");
itoa(tahun,&dum);
lcd_puts(&dum);

lcd_gotoxy(5,1);
itoa(jam,&dum);
lcd_puts(&dum);
lcd_putc(':')
if(menit<10) lcd_putc('0');
itoa(menit,&dum);
lcd_puts(&dum);
lcd_putc(':');
if(detik<10) lcd_putc('0');
itoa(detik,&dum);
lcd_puts(&dum);
}


ISR(TIMER1_COMPA_vect) //Interupt timer
{

detik++;
if(detik == 60)

{  detik=0;
   menit++;
}

if(menit == 60)
     {    jam++;
   menit=0;      
     }
if (jam == 24) 
     { tanggal++; 
       jam = 0 ; 
      }
if(tahun%4 == 0) bul_max[2]=29;  //kabisat
else bul_max[2]=28; 

if (tanggal > bul_max[bulan]) {bulan++; tanggal =1 ;}

if (bulan > 12) {tahun++;  bulan=1; }

tulis_lcd();

}


int main(void)
{

/*ini inisialisasi awal jam, untuk merubah jam saat program jalan dapat menggunakan tombol , cek di pembahasan lain untuk cara pembacaan tombol */ 
jam = 20;
menit=20;
detik=14;
tanggal=16;
bulan=6;
tahun=13;


init_jam();
lcd_init(LCD_DISP_ON);
lcd_clrscr();


while(1){ }

}
 

Mudah bukan? Selamat Mencoba ...
Share:

1 komentar:

Kontak Langsung



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

ANTI SPAM !



Blog Ini Mendukung Blogger Indonesia Yang Jujur dan Memberikan Informasi Sebenarnya, Bukan Menyampah Demi $Rp$ Yang Hanya Merendahkan Blogger Indonesia

Site View

Categories

555 (6) 7 segmen (3) adc (3) amplifier (1) analog (9) android (11) attiny (1) attiny2313 (16) blog (1) bluetooth (1) cmos (1) dasar (31) display (2) gcc (1) infrared (2) Input Output (3) jam (6) jualan (10) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (9) komputer (3) komunikasi (1) kontrol (2) lain-lain (8) lcd (2) led (9) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (48) mikrokontroller (1) mikrotik (4) paket belajar (19) palang pintu otomatis (1) pcb (2) project (33) proyek (1) radio (3) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (2) sms (5) software (16) tachometer (2) telepon (7) televisi (16) transistor (1) troubleshoot (3) tulisan (34) tutorial (67) vu meter (1) vumeter (1) wav player (3) wayang (1) wifi (1)

Diskusi


kaskus
Forum Hobby Elektronika