Timer Interrupt ungenau

Hallo zusammen,

in meinem ersten Arduino Projekt will ich eine Uhr, Temperaturanzeige und DAB Radiomodul für meine Tochter bauen.

Mit viel lesen und ausprobieren funktioniert das auch ganz gut. Für die Zeitsteuerung nehme ich einen CTC HW Interrupt, siehe hier:

noInterrupts(); // Alle Interrupts temporär abschalten
TCCR3A = 0; // Reset TCCR3A Register
TCCR3B = 0; // Reset TCCR3B Register
TIMSK3 = 0; // Reset TIMSK3 Register (disable Timer Compare Interrupts)
TCNT3 = 0; // nullen
OCR3A = 15624; // TOP Wert bestimmt mit Prescaler den Takt, 0,5Hz
TCCR3B = (1<<WGM32)| (1<<CS32) | (1<<CS30); // CTC, Prescaler 1024
TIMSK3 |= (1<<OCIE3A);
interrupts(); // alle Interrupts aktivieren, Uhr starten

Mir ist nun aber aufgefallen das dieser Interrupt seht ungenau ist. In 12 Stunden geht die Uhr ca 6 Minuten nach. Ich verwende einen MEGA2560 Clone und habe im Netz gelesen das die manchmal nicht mit exact 16Mhz laufen. Wenn das so wäre würde es den Zeitunterschied erklären.

Gibt es eine Möglichkeit die aktuelle Taktrate softwareseitig zu ermitteln um die Berechnung entsprechend anzupassen ?
Ich habe zwar eine RTC integriert aber nur zum Zeit setzen nach Power on.

Danke für Eure Tipps
Lutz

Gibt es eine Möglichkeit die aktuelle Taktrate softwareseitig zu ermitteln um die Berechnung entsprechend anzupassen ?

Natürlich!
Denn du hast ja eine RTC zum vergleichen.

Allerdings?

Was willst du überhaupt mit Timer3, wenn du doch schon eine RTC hast?
Nutze doch die RTC!

Natürlich kann ich mit der RTC vergleichen. Es sollte doch aber möglich sein einen HW Timer einigermaßen genau einzustellen.

Wie wäre das zu bewerkstelligen ?

Detroit:
Es sollte doch aber möglich sein einen HW Timer einigermaßen genau einzustellen.

Ja natürlich, das ist in der RTC mittels Temperaturkompensatiuon auch gemacht.

Der Mega-Clone nutzt aber wahrscheinlich einen Resonator anstelle Quarz. Du kannst den Timer problemlos kalibrieren, dann wird er für den Augenblick genauer. Bei einer anderen Temperatur wird es aber wieder ungenau.

Hallo,

mal davon abgesehen das man gegen die Genauigkeit einer DS3231 RTC keine Chance hat, musst du doch irgendwie deinen Top Wert für die 0,5Hz berechnet haben. CTC & TOP =15624 & 16MHz ergeben jedoch genau 0,5Hz ohne rechnerische Abweichung. Mehr kannst du nicht machen. Die Timergenauigkeit hängt vom Taktgeber, wenn der ungenau ist über die Zeit, dann ist es eben so.

Man könnte den Resonator gegen einen Quarz tauschen. Aber selbst das ist keine Garantie für höhere Genauigkeit. Nur das der Takt selbst stabiler ist, also weniger schwankt, sprich weniger Jitter hat. Man müßte dann mittels Kondensator den Takt trimmen und natürlich erstmal genau messen können, sonst macht das keinen Sinn. Macht bestimmt niemand. Praktischer mit Quarz wäre ein Langzeittest gegen die Atomuhr um zu ermitteln das man zum Bsp. nach einer Woche seinen Zähler um x Counts korrigieren muss. Temperaturabweichungen bleiben jedoch auch hier unberücksichtigt.

Ob dir ein 32,768kHz Uhrenquarz etwas nützt weiß ich nicht, damit könnte man den Timer von extern genau takten lassen.

Rein praktisch gesehen würde ich es machen wie schon gesagt wurde mit der RTC ohne viel Firlefanz. Aber nur wenn es eine mit DS3231 ist - wegen der Langzeitgenauigkeit. Die kann man konfigurieren um 1Hz auszugeben. Das auf einen Interrupteingang - fertig.

Hi

Der Arduino wurde nie für den Zweck einer hoch genauen Uhr entwickelt - Das ist ein reines Arbeitstier, kein Chronograph.
Dafür hat man Spezialisten - hier eine RTC (real Time Clock), Die Ihren internen Takt temperaturabhängig zählt - denn auch Die 'geht falsch' - man weiß aber, wie viel und in welcher Richtung.
So kann die RTC Das ausgleichen und Dir nach einem Jahr eine Zeit liefern, Die nur wenige Minuten abweicht.

Rausgeworfen Geld wäre eine RTC1307, Die ist zwar superduper genau, aber leider nur bei einer einzigen Temperatur.
Wenn das Ding 'in the wild' entlassen wird und außerhalb des Labor mit realen Bedingungen konfrontiert wird, geht auch Diese falsch - und Die ist als Uhr konzipiert - halt ohne Kompensation.

Wenn jetzt schon eine Uhr 'nach dem Mond' geht, wieso sollte ein Arbeitstier Das genauer machen?
(zugegeben - der Mond wird wohl gar nicht sooo ungenau gehen, ist halt ein Sprichwort)

Nimm eine DS3231 und statt anzuzeigen, wie falsch der Arduino nun schon wieder geht, übernimmst Du die Uhrzeit halt alle paar Minuten - Problem gelöst und die RTC frisst auch nicht nur umsonst Strom sondern bringt Dir Das, wofür Sie gebaut wurde - eine recht genaue Uhrzeit.

MfG