Forum: Mikrocontroller und Digitale Elektronik Wie eine externe RTC sinnvoll einbinden?


von Martin (Gast)


Lesenswert?

Hallo zusammen,

für ein kleines Projekt möchte ich mit einem µC ein paar Verbraucher 
zeitabhängig ein- bzw. ausschalten. Zwei Anforderungen sind hier 
relevant:

a) Ich möchte eine relativ genaue Uhrzeit haben (ca. 1 Minute/Monat wäre 
akzeptabel)
b) Die Uhrzeit muss auch nach einem Stromausfall korrekt sein.

Den Punkt (a) könnte ich auch intern mit den Bordmitteln des µC lösen. 
Für Punkt (b) benötige ich aber eine externe RTC. Ich habe (um I/O-Pins 
zu sparen) an einen Baustein mit I²C-Anschluss gedacht - bspw. den 
PCF8583 oder den DS1307.

Nun zu meiner eigentlichen Frage: Wie binde ich eine externe RTC 
sinnvoll in meine Software ein (ein PIC 18F4550 soll es werden)?

Zyklisch die RTC pollen und den Timer des µC für die Zeit zwischen zwei 
Poll-Vorgängen nutzen? Und bspw. alle 60 Sekunden einmal pollen?

Oder viel öfters pollen?

Oder nur einmalig beim Systemstart die Uhrzeit abfragen und danach den 
µC benutzen, weil er evtl. eine genauere Zeit liefern kann? Da ich 
später vielleicht aber auch mal Wochentage berücksichtigen möchte, ist 
diese Variante IMHO unsinnig, da ich dann ja die Funktion der RTC per 
Software duplizieren würde.

Wie macht ihr das mit externen RTCs in eurer Software?

Gruß,
Martin

von Peter D. (peda)


Lesenswert?

Martin schrieb:
> b) Die Uhrzeit muss auch nach einem Stromausfall korrekt sein.
>
> Den Punkt (a) könnte ich auch intern mit den Bordmitteln des µC lösen.
> Für Punkt (b) benötige ich aber eine externe RTC.

Nö.

Viele MCs haben spezielle Stromsparmodi, wo mit wenigen µA nur ein Timer 
an einem Uhrenquarz weiterläuft.
Das ist oftmals einfacher, als ein Protokoll zu einem externen 
Uhrenchip.


Peter

von Bernd O. (bitshifter)


Lesenswert?

Martin schrieb:
> Hallo zusammen,
>
> für ein kleines Projekt möchte ich mit einem µC ein paar Verbraucher
> zeitabhängig ein- bzw. ausschalten. Zwei Anforderungen sind hier
> relevant:
>
> a) Ich möchte eine relativ genaue Uhrzeit haben (ca. 1 Minute/Monat wäre
> akzeptabel)
> b) Die Uhrzeit muss auch nach einem Stromausfall korrekt sein.
>
> Den Punkt (a) könnte ich auch intern mit den Bordmitteln des µC lösen.
> Für Punkt (b) benötige ich aber eine externe RTC. Ich habe (um I/O-Pins
> zu sparen) an einen Baustein mit I²C-Anschluss gedacht - bspw. den
> PCF8583 oder den DS1307.
>
> Nun zu meiner eigentlichen Frage: Wie binde ich eine externe RTC
> sinnvoll in meine Software ein (ein PIC 18F4550 soll es werden)?
>
> Zyklisch die RTC pollen und den Timer des µC für die Zeit zwischen zwei
> Poll-Vorgängen nutzen? Und bspw. alle 60 Sekunden einmal pollen?
>
> Oder viel öfters pollen?
>
> Oder nur einmalig beim Systemstart die Uhrzeit abfragen und danach den
> µC benutzen, weil er evtl. eine genauere Zeit liefern kann? Da ich
> später vielleicht aber auch mal Wochentage berücksichtigen möchte, ist
> diese Variante IMHO unsinnig, da ich dann ja die Funktion der RTC per
> Software duplizieren würde.

Wie oft und wie schnell brauchst Du denn die aktuelle Zeit?
Wenn es nur relativ selten ist und nicht besonders schnell gehen muß, 
dann lese die RTC doch einfach dann aus, wenn Du die Zeit brauchst.

Wenn die Anforderungen an die Zeit nicht besonders hoch sind, kann es 
auch reichen, die RTC zyklisch auszulesen - und zwar schneller als in 
der benötigten Auslösung. Wenn 1s reichen, dann kannst Du auch alle 
500ms auslesen und bist auf der sicheren Seite.

Wenn die Zeit oft und exakt gebraucht wird oder wenn Du eine exakte Zeit 
sehr schnell brauchst (beispielsweise wenn ein Ereignis eintritt), dann 
lese die Zeit regelmäßig von der RTC ein und vergleiche die "externe" 
Zeit mit der internen Zeit des µC. Je nach Abweichung passt Du dann die 
interne Zeitbasis proportional zur Abweichung an. Wenn die interne Zeit 
"vorgeht", dann erhöhst Du die Periodendauer des internen Zählers, wenn 
sie nachgeht, dann verringerst Du die Periodendauer. Quasi eine PLL in 
Software.
Damit bist Du aber gezwungen, zumindest Teile der RTC 
nachzuprogrammieren.

Wenn Du beim Systemstart die Zeit einliest und intern weiterrechnest, 
kann es passieren, dass der Unterschied der Zeiten nach 5 Monaten 
Nutzung 5 Minuten beträgt. Wenn dann ein Reset auftritt, liegen die 
neuen Zeiten erst mal 5 Minuten in der Vergangenheit, was sich 
üblicherweise nicht gut in einem Log macht. Das gleiche kann Dir 
passieren, wenn Du die RTC regelmäßig liest und die interne Zeit "hart" 
setzt. Ist dein µC schneller, "springt" die Zeit in die Vergangenheit. 
Je nach Anwendung ist das Springen störend, wenn beispielsweise real 
periodische Ereignisse aufgrund der Zeitsprünge falsch dargestellt 
werden.

Wie fast immer in der Technik:
Der Aufwand steigt mit den Anforderungen an die Genauigkeit.


Gruß,
Bernd

von GG (Gast)


Lesenswert?

Servus,

ich verwende DS1307 mit 5 Volt und DS1338 mit 3,3 Volt.

Beide liefern einen  quarzgenauen Sekundentakt, den man leicht mit einem 
PIN-Interupt abfangen kann. Die Stützbatterie hält jahrelang!

Das I2C Protokoll ist einfach und für nahezu jeden Microcontroller im 
Internet zu finden.

Die RTC Zeit direkt mit dem Microcontroller (Atxmega128a1) zu erzeugen, 
habe ich nach langen Versuchen wegen zu viel  Stromverbrauch 
eingestellt.

Die Genauigkeit des DS1307 hängt vom Quarz ab, ist aber für die meisten 
Uhren ausreichend.

Gruß GG

von Martin R. (cornholio)


Lesenswert?

Hallo zusammen.

Hinweis: Habe mir inzwischen einen Account angelegt, bin aber noch die 
selbe Person wie Eingangs...

> Viele MCs haben spezielle Stromsparmodi, wo mit wenigen µA nur ein Timer
> an einem Uhrenquarz weiterläuft.
> Das ist oftmals einfacher, als ein Protokoll zu einem externen
> Uhrenchip.

Eine Möglichkeit, an die ich gar nicht gedacht habe. Da ich allerdings 
sowieso einen anderen Baustein per I²C-Protokoll ansprechen muss, 
entsteht hier kein zusätzlicher Aufwand für eine externe RTC. Somit 
nehme ich lieber die weiteren Vorteile eines externen Bausteins mit.


Die eigentlichen Schaltzeiten sind eher unkritisch. +/- ein paar 
Sekunden stellen gar kein Problem dar. Wichtiger ist eher eine geringe 
Drift über die Laufzeit.

Ich werde mal schauen, ob ich ausschließlich pollen werde, oder ob ich 
evtl. eine Kombination aus dem 1 Hz Takt des DS1307 und daraus 
abgeleitet ein Polling implementieren werde.

Gruß,
Martin

von (prx) A. K. (prx)


Lesenswert?

Auch nicht viel teurer: Funkuhrmodul. Vorteile: muss man nicht stellen, 
keine Batterie nötig. Nachteil: es dauert nach Stromausfall ca. 3-4 
Minuten bis man die Zeit hat.

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.