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:
- Regulator 5v menghasilkan tegangan VCC 5v dan akan mencatu rangkaian selama terdapat tegangan Vin (input regulator).
- 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.
- 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
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 ...
mantap gan....
BalasHapusijin copy scripnya y..