Forum: Mikrocontroller und Digitale Elektronik 2 Quarze an einem AVR für RTC


von Forumsgast (Gast)


Lesenswert?

Hallo,

gibt es AVRs an die ich 2 Quarze anschließen kann?

Ich möchte mit einem AVR eine RTC realisieren. Dazu hatte ich gedacht 
einen 32KHz Uhrenquarz zu verwenden. Im Falle eines Stromausfalls könnte 
sich der AVR schlafen legen, wobei ein Timer mit dem Uhrentakt 
weiterläuft. Dabei sollte der Stromverbrauch ja relativ gering sein, 
sodass die Stromversorgung für kurze Zeit mit einem Kondensator 
überbrückt werden kann.
Das Problem ist natürlich, dass so ein Uhrenquarz evtl. nicht so genau 
ist. Aber natürlich haben sich schon Leute Gedanken gemacht, wie man das 
Problem lösen kann. Wie zum Beispiel hier: [[AVR - Die genaue Sekunde / 
RTC]]. Da wird ja, wenn ich das richtig verstehe, der Takt des 
Uhrenquarzes auf einem Pin des AVR ausgegeben, sodass mit einem 
Frequenzzähler die exakte Bestimmung der Frequenz möglich ist und mit 
Hilfe dieser exakt bestimmten Frequenz die Ungenauigkeit des Quarzes 
kompensiert werden kann.
Nun habe ich mich gefragt, ob der AVR die genaue Bestimmung der 
Uhrenquarzfrequenz nicht selber durchführen kann. Dazu müsste der AVR 
aber einen genauen Referenztakt zur Verfügung haben, sprich einen 
zweiten Quarz, mit z.B. 20MHz. Ist das möglich?

Ich hoffe ihr könnt mir helfen.
Vielen Dank schonmal,

Forumsgast

von David P. (chavotronic)


Lesenswert?

ich persönliche nehme in solchen Fällen den DS1307, der hat seine eigene 
Pufferbatterie, dann kannst du jederzeit den AVR synchronisieren.

AVRs mit 2 Quarzen gibt es meiner Meinung nach nicht.

von (prx) A. K. (prx)


Lesenswert?

Forumsgast schrieb:

> Das Problem ist natürlich, dass so ein Uhrenquarz evtl. nicht so genau
> ist.

Mit 10ppm sind die zwar nicht so genau wie eine Funkuhr, aber genauer 
als ein üblicher Rechnerquarz (30-50ppm).

Diverse 40-Pinner aufwärts, wie beispielsweise der Mega32,  besitzen 
einen Timer, den man unabhängig vom Coretakt mit einem separat 
angeschlossenen Uhrenquarz betreiben kann. Es gibt also sehr wohl 
Modelle mit 2 Quarzen.

Beim Mega8 und Derivaten gibt es diesen Timer auch, aber man kann nur 
einen einzigen Quarz anschliessen, d.h. mit Uhrenquarz am asynchronen 
Timer muss der Core über den RC-Osz getaktet werden.

Wenn der AVR selbst keinen sehr genauen Takt benötigt, dann kann man 
auch den internen RC-Oszillator für den Core verwenden. Und mit dem 
Uhrenquarz automatisch justieren.

von Max D. (Firma: No RISC, no fun.) (metalfan)


Lesenswert?

1. Ich würds wie prx machen
2. aber wenn dus anders willst, kuk ma des ds von den gößeren avrs (z.B. 
mega16) da gibts XTAL und TOSC (als alternative Pin-Funktionen). du 
hängst an xtal deinen normalen Quarz (also den wo du mit 20MHz genannt 
hast) und an tosc den Uhrenquarz (der mega hat sogar interne kondis).

PS: Der Mega644 geht auch is aber bissele groß dafür

von Ziff (Gast)


Lesenswert?

Ein Uhrenquarz hat standardmaessig 10ppm oder weniger. Ein normaler 
Quarz hat 100ppm. Es macht also wenig Sinn, einen Vergleich mit 
billigstkomponenten selbst durchfuehren zu wollen. Viel sinnvoller ist 
es periodisch die Uhr mit einer Externen abzugleichen, also nicht den 
Oszillator, sondern die Zeit.

von Forumsgast (Gast)


Lesenswert?

Danke für eure Antworten!

Hatte irgendwie gedacht, dass die 30ppm des 20MHz-Quarz weniger 
ausmachen, als die 10ppm beim 32KHz-Quarz. Jetzt hab ich nochmal genau 
überlegt, und festgestellt, dass das Quatsch ist. :)

Wird also nichts werden mit der Korrektur des Taktes. Die einzige 
Möglichkeit, die mir jetzt einfällt, ist, die Quarzabweichung in dem 
Moment zu berechnen, wenn die Uhr nachgestellt werden muss, weil die 
Abweichung von der tatsächlichen Uhrzeit zu groß geworden ist.

Trotzdem gut, dass es doch AVRs gibt, an die 2 Quarze angeschlossen 
werden können. Wäre ja blöd, wenn man für die Nutzung der RTC-Funktion 
auf einen genauen Systemtakt verzichten müsste.

von Ziff (Gast)


Lesenswert?

>Trotzdem gut, dass es doch AVRs gibt, an die 2 Quarze angeschlossen
werden können. Wäre ja blöd, wenn man für die Nutzung der RTC-Funktion
auf einen genauen Systemtakt verzichten müsste.

Das ist so nicht richtig. Ich hab einen Synchronisierer geschrieben, der 
den internen RC Oszillator auf den 32kHz RTC synchronisiert. So erreicht 
man eine 10ppm Praezision eines RC Clocks mit einer beliebigen Taktrate.

von Falk B. (falk)


Lesenswert?

@  Forumsgast (Gast)

>Uhrenquarzfrequenz nicht selber durchführen kann. Dazu müsste der AVR
>aber einen genauen Referenztakt zur Verfügung haben, sprich einen
>zweiten Quarz, mit z.B. 20MHz. Ist das möglich?

Ja. Hab ich mal mit DCF77 gemacht. Über 24h Abgleich hab ich dann auf 
ca. 0,1ppm genau automatisch abgleichen können. Wenn man einen WIRKLICH 
genauen Referenztakt hat, geht es natürlich deutlich schneller.

MFG
Falk

von Falk B. (falk)


Lesenswert?

@  Ziff (Gast)

>den internen RC Oszillator auf den 32kHz RTC synchronisiert. So erreicht
>man eine 10ppm Praezision eines RC Clocks mit einer beliebigen Taktrate.

So genau kannst du den RC Oszillator gar nicht abgleichen, dazu ist der 
viel zu grob steuerbar. Wenn man unter 1% kommt ist das schon ganz gut 
und ausreichend für UART.

MFG
Falk

von Ziff (Gast)


Lesenswert?

Falk, das ist korrekt, denn die Routine sollt ja mal fertig sein. Ich 
wuerde allerdings empfehlen sie bei wechselnden Temperaturen periodisch 
anzuwerfen, denn die Temperaturdrift ist happig.

Wenn man den Synchronisierer integrierend als Prozess mitlaufen liesse 
... wuerde man die (Langzeit-) spezifikationen des Quarzes erreichen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Forumsgast schrieb:
> gibt es AVRs an die ich 2 Quarze anschließen kann?

Ja, genügend.  Alle großen AVRs können das.  Ist aber letztlich gar
nicht effektiv, da du ja den AVR laufend schlafen legen können
willst.  Der Quarz-Hauptoszillator braucht dann (bedingt durch die
Physik des Quarzes und seiner Schwingung) ziemlich lange, bis er
wieder läuft, in dieser Zeit zieht dein Controller schon Strom,
obwohl er (da der Takt noch nicht stabil ist) nichts tun kann.  Das
ist verschenkte Energie.  Da du ja den 32-kHz-Quarz als exakte
Zeitbasis für die Uhr hast, genügt für den Rest im Allgemeinen die
Genauigkeit des RC-Oszillators als Hauptoszillator -- und dieser
schwingt vergleichsweise schnell an nach dem Aufwachen.

Damit bist du wieder nur bei einem Quarz als Forderung, der nur
nicht der Hauptoszillator sein sollte.  Dies lässt sich dann bereits
mit einem ATmega88 (bzw. seinen größeren und kleineren Geschwistern)
umsetzen, da man dort die XTAL-Pins alternativ für den 32-kHz-
Oszillator am Timer 2 aktivieren kann.

32-kHz-Quarze brauchen übrigens mehrere 100 ms zum Anschwingen.

von Purzel H. (hacky)


Lesenswert?

Der Hauptoszillator ist einstellbar wie lange der einschwingen soll. 4ms 
oder 64ms. Das Problem mit dem RTC als Sleep-wakeup ist die 
ueblicherweise kleine Zeit, die man so einstellen kann, ich glaube mich 
an 8 sec erinnern zu koennen(prescaler & counter), dh man muss alle 8sec 
wieder einschlafen und wecken.. Wenn man laenger schlafen moechte waere 
ev. ein externer RTC angebracht. Ein DS1302 oder so braucht nur 300nA

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ha-jetzt Aber schrieb:
> Der Hauptoszillator ist einstellbar wie lange der einschwingen soll. 4ms
> oder 64ms.

Das ist aber kein Vergleich zum RC-Oszillator, der nach 6 Takten
(also < 1 µs) wieder stabil ist.

Wie geschrieben, das Problem liegt in der Physik der Quarze, nicht
in der Unfähigkeit eines AVRs.  Durch ihre hohe Güte schaukelt sich
die Schwingung nur langsam auf.  Daher brauchen Keramikresonatoren
auch nicht ganz so lange.

Die 4,1 bzw. 65 ms sind übrigens die zusätzliche Zeit nach einem
Reset; die Startzeit nach dem Schlafen beträgt 16 Ki Taktzyklen
für Quarze und 1 Ki Taktzyklen für Keramikresonatoren.

> Das Problem mit dem RTC als Sleep-wakeup ist die
> ueblicherweise kleine Zeit, die man so einstellen kann, ich glaube mich
> an 8 sec erinnern zu koennen(prescaler & counter), dh man muss alle 8sec
> wieder einschlafen und wecken..

Das ist nicht tragisch, wenn man mit dem RC-Oszillator arbeiten kann.
Man erhöht eine Variable, stellt fest, dass nichts weiter zu tun ist,
und legt den Prozessor wieder schlafen.  Eine externe RTC läuft ja
auch nicht nur von der Luft allein.

Oft will man ohnehin die Zeit sekundengenau verfolgen können, dann
schläft man sowieso nur 1 s lang.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.