Je hebt geen RTC nodig om een klok te bouwen: de ATmega-chip heeft alle hardware die nodig is om de taken van de RTC zelf uit te voeren. Hier is hoe:
-
Koop een 32768 Hz horlogeglas: koop het of demonteer een oude klok. Deze kristallen, speciaal ontworpen om de tijd bij te houden, hebben een extreem temperatuurverloop. Je zou er ook een nodig hebben als je een RTC-chip zou willen gebruiken.
-
Configureer de zekeringen van je ATmega zodat ze op de 8 MHz RCoscillator lopen. Dit maakt uw millis ()
-functie vreselijk onnauwkeurig en maakt ook de XTAL1- en XTAL2-pinnen vrij.
-
Verbind het horlogekristal met de TOSC1- en TOSC2-pinnen . Dit zijn dezelfde pinnen als XTAL1 en XTAL2 (9 en 10 op de 328P). De verschillende namen worden gebruikt om verschillende functies aan te duiden.
-
Configureer de timer / teller 2 voor asynchrone werking, normale telmodus, presaler ingesteld op 128 en schakel de timer overflowonderbreking in.
Nu krijg je een TIMER2_OVF-interrupt met een zeer constante snelheid van één keer per seconde. U hoeft de klokweergave slechts één seconde vooruit te zetten in de ISR. Tussen de onderbrekingen door kunt u de MCU in zeer diepe slaap zetten (energiebesparende slaapstand: niets werkt behalve Timer / Teller 2) en jarenlang op een paar AA-cellen draaien. Tenzij het beeldscherm veel stroom verbruikt, natuurlijk.
Ik heb precies dit gedaan om mijn 24-uurs eenhandige muurklok te bouwen. Deze link verwijst nu naar de Engelse vertaling van de originele documentatie in Frans.
Kwarts-kalibratie
Als u uw kwarts niet kalibreert, kunt u een aanzienlijke afwijking verwachten, meestal een paar seconden per week . De driftsnelheid is afhankelijk van de straalcapaciteit van de sporen die het kristal met de MCU verbinden. In principe zou het kunnen worden verwijderd door wat extra, fijn afgestemde capaciteit toe te voegen. Het is vermeldenswaard dat u hetzelfde driftprobleem zou hebben met een RTC.
Als u tevreden bent met dit soort nauwkeurigheid, leef er dan mee en
wees vrolijk. Als u echter de drift wilt meten, zult u merken dat deze erg stabiel is. U kunt dit dan gemakkelijk compenseren in software, en een nauwkeurigheid bereiken van een paar seconden per jaar .
Het algoritme voor het corrigeren van de drift is heel eenvoudig. Aan de hand van de gemeten afwijking bepaal je de precieze vertraging tussen de interrupts, die heel dicht bij 10 9 nanoseconden moet zijn, en dan:
#define ONE_SECOND 1000000000 // in nanoseconden # definieer ONE_INTERRUPT 999993482 // bijvoorbeeldISR (TIMER2_OVF_vect) {statische uint32_t unaccounted_time; unaccounted_time + = ONE_INTERRUPT; while (unaccounted_time > = ONE_SECOND) {advance_display_by_one_second (); unaccounted_time - = ONE_SECOND; }}
In het bovenstaande voorbeeld is de quartz iets te snel en compenseert de software door om de paar dagen een vinkje te "missen". Als het kwarts te laag was, zou dezelfde code in plaats daarvan elke paar dagen dubbel tikken.
Dit soort kalibratie kan ook worden gedaan voor een RTC, maar het zou aanzienlijk ingewikkelder zijn omdat de RTC de tijd rapporteert in afgebroken vorm die zich van nature niet leent voor rekenkundige bewerkingen.