Forum: Mikrocontroller und Digitale Elektronik Artikel: die genaue Sekunde / RTC


von ich (Gast)


Lesenswert?

Ich habe folgendes Szenario: ein Mega88 wird von extern mit 12MHz 
getaktet. Timer 1 läuft ungeteilt alle 100us über (IR-Dekodierung 
mittels IRMP). Zum energiesparen wird der System-Takt (und damit auch 
der Takt von Timer 1) mittels CLKPR verringert, wenn die IR-Dekodierung 
gerade nicht benötigt wird. Zusätzlich wird der uC in den Idle-Mode 
geschickt.

Der evtl. benötigte Korrekturwert soll nicht bereits zur Compile-Zeit 
festgelegt werden müssen, sondern z.B. über die USART änderbar sein.

Welche Variante aus dem Artikel AVR - Die genaue Sekunde / RTC ist 
für so eine Anwendung am besten geeignet? Anpassen lassen sich alle, das 
ist klar. Leider fehlt mir der Blick (und das absolute Verständnis über 
die Funktionsweise) um selbst sagen zu können, welche am besten 
funktioniert.

von Michael A (Gast)


Lesenswert?

ich schrieb:
> Welche Variante aus dem Artikel AVR - Die genaue Sekunde / RTC ist
> für so eine Anwendung am besten geeignet?

Das geht mit beiden Varianten, indem du Timertakt und Output Compare 
Interrupt anpaßt, insbesondere die Restzeitverarbeitung

> Anpassen lassen sich alle, das
> ist klar. Leider fehlt mir der Blick (und das absolute Verständnis über
> die Funktionsweise) um selbst sagen zu können, welche am besten
> funktioniert.

Um ein gewisses Verständnis wirst du für solche Änderungen nicht drumrum 
kommen.

von ich (Gast)


Lesenswert?

Ich habe mich jetzt für die "Bresenham-Methode" aus dem Artikel 
entschieden, nur dass ich meine Zeitbasis nicht verändere, da es mir 
nicht um eine konstante Zeitbasis geht, sondern nur um die Zeit an sich.
1
void TIMER1_COMPA_vect(void)
2
{
3
   static int16_t ticks = 0;        // Hilfsvariable für Messintervall -> 1/10000tel Sekunde
4
   static int16_t time_error = 0;   // RTC Fehlerkompensation
5
6
   // RTC Fehler korrigieren
7
   if ( time_error >= 1200 )       // RTC zu schnell
8
   {
9
     //ticks += 0;
10
      time_error -= 1200;
11
   }
12
   else if ( time_error <= -1200 )    // RTC zu langsam
13
   {
14
     ticks += 2;
15
      time_error += 1200;     
16
   }
17
   else
18
   {
19
     ticks += 1;
20
   }
21
22
   // Echtzeituhr
23
   if ( ticks >= 10000 )          // Sekundenintervall
24
   {
25
      time_error += clockDeviation;        // RTC Fehler akkumulieren
26
      //update time here
27
      ticks -= 10000;
28
   }
29
}
Jetzt möchte ich noch wie geschrieben den Takt mittels CLKPR verringern 
um Energie zu sparen. Allerdings komme ich nicht drauf wie ich den 
Fehler, der durch die Umschaltung entsteht, kompensieren oder zumindest 
quantifizieren kann.

Zitat aus dem Datenblatt:
1
From the time the CLKPS values are written, it takes between T1 + T2 and T1 + 2 * T2 before the new clock frequency is active.

Hat schonmal jemand soetwas gemacht oder einfach so eine Idee wann der 
beste Zeitpunkt ist um die Frequenz umzustellen und wie die optimale 
Vorgehensweise aussieht?

Während der "Stromsparperiode" muss die Zeit nicht genau abrufbar sein, 
es geht nur darum, den Puffer (Lithium-Zelle) möglichst wenig zu 
belasten und hinterher im normalen Betrieb die Zeit noch möglichst genau 
zu haben.

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.