Hallo, ik ben nu bezig met twee 7-segmenten display's een digitale klok na te bootsen. Dit doe ik met een atmega32. De makkelijkste manier om de tijd bij te houden leek me met de macro
#include <avr/io.h>
#define F_CPU 1000000LU
#include <util/delay.h>
_delay_ms(xx)Maar helaas is hij niet zo precies als ik dacht. Hoe komt dit precies? En wat is dan de beste manier om de tijd zo accuraat mogelijk weer te geven? Timers en kristallen?
Huh? Delays om de tijd bij te houden? Wablief?
Laat ergens een counter lopen die getriggerd wordt door je clock. Prescaler ervoor en zorg ervoor dat je een Xtal hebt waarvan de frequentie mooi deelbaar is zodat je 1 IRQ per sec. kunt doen. In de IRQ update je je tijd, in de main kun je evt. de displays multiplexen.
De nauwkeurigheid is dan net zo hoog als die van je Xtal.
Je zal sowieso een kristal nodig hebben, kijk maar eens naar de karakteristieken van de interne oscillator vanaf pagina 317 van de datasheet - dat stelt qua precisie echt helemaal niks voor. Verder is inderdaad een timer gebruiken beter, omdat je tussendoor natuurlijk ook tijd verbruikt door de displays te updaten.
Ik heb toevallig een paar dagen geleden precies hetzelfde gedaan met dezelfde atmel. Ik gebruikte een 16 MHz kristal en timer0 met de volgende instellingen: 64x prescaler, OC op 250, CTC mode. Dan geeft die om de milliseconde een OC interrupt. Daarin telde ik gewoon de milliseconden, seconden, etc. met globale variabelen. Hij had na 4 1/2 uur testen ongeveer een halve seconde afwijking ten opzichte van mijn horloge.
SparkyGSX
Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Als je een netvoeding hebt, kun je het beste synchroniseren met het net. De energieleverancier garandeert dat dit, op langere termijn (per dag, geloof ik) precies klopt.