Saat oluşturmak için bir RTC'ye ihtiyacınız yoktur: ATmega çipi, RTC'nin görevlerini yerine getirmek için gereken tüm donanıma sahiptir. İşte böyle:
32768 Hz saat kristali edinin: ya satın alın ya da eski bir saati sökün. Özellikle zaman tutmak için tasarlanan bu kristaller, son derece küçük bir sıcaklık sapmasına sahiptir. Bir RTC yongası kullanmak isterseniz bunlardan birine ihtiyacınız olacaktır.
ATmega'nızın sigortalarını 8 MHz RC osilatörünü çalıştıracak şekilde yapılandırın. Bu, millis()
işlevinizi korkunç bir şekilde yanlış hale getirir ve ayrıca XTAL1 ve XTAL2 pinlerini serbest bırakır.
Saat kristalini TOSC1 ve TOSC2 pimlerine bağlayın. Bunlar XTAL1 ve XTAL2 ile aynı pimlerdir (328P'de 9 ve 10). Farklı isimler, farklı işlevler anlamına gelir.
Zamanlayıcı / Sayaç 2'yi eşzamansız çalışma, normal sayma modu, ön ölçekleyici 128 olarak ayarlanmış olarak yapılandırın ve zamanlayıcı taşma kesintisini etkinleştirin.
Şimdi saniyede bir kez çok sabit bir oranda bir TIMER2_OVF kesmesi alacaksınız. ISR'de saat ekranını yalnızca bir saniye ilerletmeniz gerekir. Kesintiler arasında MCU'yu çok derin uykuya alabilirsiniz (güç tasarrufu uyku modu: Zamanlayıcı / Sayaç 2'den başka hiçbir şey çalışmaz) ve birkaç AA hücresinde yıllarca çalışabilirsiniz. Tabii ki ekran güç tüketmiyorsa.
Tam da 24 saat tek elle duvar saatimi yapmak için yaptım . Bu bağlantı şimdi orijinal belgelerin Fransızca çevirisini göstermektedir.
Kuvars kalibrasyonu
Kuvarsınızı kalibre etmiyorsanız, genellikle haftada birkaç saniye olmak üzere önemli bir sapma bekleyebilirsiniz . Kayma hızı, kristali MCU'ya bağlayan izlerin başıboş kapasitansına bağlıdır. Prensip olarak, bazı ekstra, ince ayarlanmış kapasitans eklenerek çıkarılabilir. Bir RTC ile aynı sürüklenme problemine sahip olacağınızı belirtmek gerekir .
Bu tür bir doğruluktan memnunsanız, onunla yaşayın ve mutlu olun. Bununla birlikte, sapmayı ölçmeye özen gösterirseniz, bunun çok kararlı olduğunu fark edeceksiniz. Daha sonra yazılımda kolayca telafi edebilir ve yılda birkaç saniyelik bir doğruluk elde edebilirsiniz .
Kaymanın düzeltilmesi için algoritma çok basittir. Ölçülen sapmadan, 10 9 nanosaniyeye çok yakın olması gereken kesmeler arasındaki kesin gecikmeyi anlıyorsunuz , o zaman:
#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;
}
}
Yukarıdaki örnekte, kuvars biraz fazla hızlıdır ve yazılım her birkaç günde bir kene "eksik" olarak telafi edilir. Kuvars çok yavaş olsaydı, aynı kod birkaç günde bir çift işaretli olurdu.
Bu tür bir kalibrasyon bir RTC için de yapılabilir, ancak RTC zamanı doğal olarak aritmetik işlemlere borç vermeyen bölünmüş bir formda raporladığı için daha karmaşık olacaktır.