Anda tidak memerlukan RTC untuk membangun jam: chip ATmega memiliki semua perangkat keras yang diperlukan untuk melakukan tugas RTC itu sendiri. Begini caranya:
Dapatkan kristal jam tangan 32768 Hz: beli atau bongkar jam lama. Kristal-kristal ini, yang dirancang khusus untuk menjaga waktu, memiliki pergeseran suhu yang sangat kecil. Anda juga akan membutuhkan salah satunya jika ingin menggunakan chip RTC.
Konfigurasikan sekering ATmega Anda untuk menjalankan osilator RC 8 MHz. Ini akan membuat millis()
fungsi Anda sangat tidak akurat, dan juga membebaskan pin XTAL1 dan XTAL2.
Hubungkan kristal arloji ke pin TOSC1 dan TOSC2. Ini adalah pin yang sama dengan XTAL1 dan XTAL2 (9 dan 10 pada 328P). Nama yang berbeda digunakan untuk fungsi yang berbeda.
Konfigurasikan Timer / Penghitung 2 untuk operasi asinkron, mode penghitungan normal, prescaler diatur ke 128, dan aktifkan timer overflow.
Sekarang Anda akan mendapatkan interupsi TIMER2_OVF pada tingkat yang sangat stabil sekali per detik. Anda hanya perlu memajukan tampilan jam satu detik di ISR. Di sela-sela interupsi, Anda dapat menempatkan MCU dalam kondisi tidur sangat nyenyak (mode hemat daya tidur: tidak ada yang berjalan kecuali Timer / Penghitung 2) dan berjalan selama bertahun-tahun pada beberapa sel AA. Kecuali jika tampilannya haus daya, jelas.
Saya melakukan ini untuk membangun jam dinding satu tangan 24 jam saya . Tautan ini sekarang menunjuk ke terjemahan bahasa Inggris dari dokumentasi asli dalam bahasa Prancis.
Kalibrasi kuarsa
Jika Anda tidak mengkalibrasi kuarsa Anda, Anda dapat mengharapkan pergeseran yang signifikan, biasanya beberapa detik per minggu . Kecepatan drift tergantung pada kapasitansi liar dari jejak yang menghubungkan kristal ke MCU. Pada prinsipnya, itu bisa dihilangkan dengan menambahkan beberapa kapasitansi ekstra yang disetel dengan halus. Perlu dicatat bahwa Anda akan memiliki masalah drift yang sama dengan RTC.
Jika Anda puas dengan akurasi semacam ini, maka hiduplah dengan itu dan bahagia. Namun, jika Anda peduli untuk mengukur arus, Anda akan melihat bahwa itu sangat stabil. Anda kemudian dapat dengan mudah mengkompensasinya dalam perangkat lunak, dan mencapai akurasi beberapa detik per tahun .
Algoritma untuk mengoreksi drift sangat sederhana. Dari drift yang terukur, Anda mengetahui penundaan tepat antara interupsi, yang harus sangat dekat dengan 10 9 nanodetik, kemudian:
#define ONE_SECOND 1000000000 // in nanoseconds
#define ONE_INTERRUPT 999993482 // for example
ISR(TIMER2_OVF_vect)
{
static uint32_t unaccounted_time;
unaccounted_time += ONE_INTERRUPT;
while (unaccounted_time >= ONE_SECOND) {
advance_display_by_one_second();
unaccounted_time -= ONE_SECOND;
}
}
Dalam contoh di atas, kuarsa sedikit terlalu cepat, dan perangkat lunak mengkompensasi dengan "menghilangkan" tanda centang setiap beberapa hari. Jika kuarsa terlalu lambat, kode yang sama akan mencentang dua kali setiap beberapa hari.
Kalibrasi semacam ini juga dapat dilakukan untuk RTC, tetapi akan jauh lebih kompleks karena RTC melaporkan waktu dalam bentuk rusak yang tidak secara alami cocok untuk operasi aritmatika.