Interner Taktgeber so ungenau?

  • Hallo zusammen,


    ich arbeite aktuell an einer Art Uhr, vielmehr möchte ich dazu auch noch nicht verraten. Jedenfalls läuft mein AVR (mega16) mit internem Taktgeber auf 8 MHz und der Timer ist so eingestellt, dass er alle 0,25 Sekunden überlaufen soll. Ich habe aber bereits nach einer Minute eine Abweichung von etwa 2-3 Sekunden. Ist der interne Taktgeber tatsächlich so ungenau, oder habe ich irgendwo einen Denkfehler im Code?



    In der späteren Anwendung soll natürlich nicht der interne Zeitgeber verwendet werden sondern ein Quarz. Außerdem überlege ich noch ob ich ihm eine RTC an die Seite stelle oder gar DCF77 so dass man garnichts mehr von Hand stellen muss.


    Gruß und guten Rutsch
    Dominique

  • Teil die 8 MHz zuerst runter, mit dem Prescaler , (google, datenblatt strg+f) , wieso vergleichst du auf viertel Sekunde, wenn du eh nur eine Sekunde brauchst ? Auch hier den Timer vorladen und dann bei Überlauf die Sekunde hochzählen.
    Bei einer Minute schon ein 2-3 sec Abweichung ist zu viel.


    hier etwas zum lesen:
    http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer
    http://www.rn-wissen.de/index.php/Timer/Counter_%28Avr%29
    es gibt extra dafür einen Artikel, " Die genaue Sekunde "
    http://www.mikrocontroller.net…_Die_genaue_Sekunde_/_RTC

  • Moin moin,

    ich würde dir wirklich empfehlen ein RTC oder DCF77 zu nehmen, normale Quarze haben Frequenztoleranz von ±30-50 ppm und Temperaturkoeffizient von ±30 ppm dadurch können natürlich Abweichungen entstehen.

    ja, eins von Beidem soll es auf jeden Fall werden. Ich tendiere in Richtung DCF77.


    Wie kommst du bei TCNT1 auf 34286 ?

    Mit [1] berechnet. 8 MHz, 16bit Timer, 0,25sec angestrebt.


    Frohes neues Jahr !

    Danke, euch allen auch!


    wieso vergleichst du auf viertel Sekunde, wenn du eh nur eine Sekunde brauchst ?

    Ich brauche an anderer Stelle die 1/4 Sekunde (Refresh-Rate der Anzeige), deswegen der Timer so eingestellt. In der Darstellung gibt es Zwischenschritte im Sekundenspung, damit es flüssiger aussieht und nicht der "Zeiger" springt.



    hier etwas zum lesen:

    Kenn ich soweit alles. Ob Overflow mit Preload oder Compare sollte aber keinen Unterschied in der Genauigkeit machen.



    10% diff ist aber schon enorm viel, für so ungenau hätte ich den internen Taktgeber nicht gehalten.




    [1] http://evolutec.publicmsg.de/i…re&content=prescalertools

  • 10% diff ist aber schon enorm viel, für so ungenau hätte ich den internen Taktgeber nicht gehalten.

    das gilt für den ganzen Spannungs- und Temperaturbereich, wenn die einigermassen Konstant bleiben hat man wenigstens weniger Drift.
    Braucht man es etwas genauer, kann man den internen Oszilator aber noch feintunen über das Register: OSCAL


    Ist das Projekt ein Einzelstück, kann man das Register im Programmcode mit einem fixen Wert beschreiben. Bei einer Serie schreibt man per Programmer einen Wert ins Flash oder EEProm, welcher später vom Programm ausgelesen wird und dort das OSCAL Register beschreibt. Der Vorteil ist dabei nur, dass nicht für jeden Baustein ein eigener Programmcode gebraucht wird.


    Wenns dann ausreicht mit der Genauigkeit gut und schön, wenn nicht.... hilft eben nur RTC oder Funk.
    3Sekunden pro Minute, da könnte man das nächste neue Jahr dann 18Tage früher oder später feiern ;)
    Schönes neues jedenfalls für dieses.