Artikel: die genaue Sekunde / RTC

Gast #2229974
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.
Gast #2229985
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.
Gast #2234944
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.