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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.