Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Das CLKPR-Register und das Geheimnis der Stromaufnahme

Basteleien analog und digital mit Strom und Spannung.

Moderator: radioscout

thomas_st
Geowizard
Beiträge: 1643
Registriert: Fr 18. Nov 2005, 16:30
Wohnort: ~ N 51°21' E 12°00'

Das CLKPR-Register und das Geheimnis der Stromaufnahme

Beitrag von thomas_st »

Kapitel 1: Das CLKPR-Register

Hallo zusammen,

ich beginne mal wieder mit einer kurzen Story. Vor ein paar Wochen mit einem befreundeten Cacher verabredet, um an einem seiner Caches eine RL-Stage zu installieren - das RL hatte er schon und war nun dabei etwas Tarnung drumherum zu bauen ... da kam der Anruf: die Tag-/Nachschwelle passt noch nicht (das RL wäre wohl nie in den Tagmodus gegangen) und ob man das nicht anpassen könnte. Also das alte Notebook mit dem alten seriellen Programmer eingepackt und los.

Tja und da saß ich nun. Der auf 128kHz getaktete Tiny ließ sich mit dem Programmer nicht ansprechen (keine Ahnung warum, früher war das kein Problem) und so endete das Ganze damit, dass ein neuer Tiny programmiert wurde und nun mit der originalen Taktfrequenz von ca. 1MHz im Baum hängt.

Aber nach diesen Problemen fiel mir doch wieder ein, was ich schon lange mal ausprobieren und für die RL nutzen wollte: das CLKPR-Register! Dieses Register hat eine ähnliche Aufgabe wie das CKDIV8-Fuse: es teilt den vom Oszillator bereitgestellten Takt runter, bevor daraus der µC-Takt erzeugt wird. Allerdings kommt das CLKPR-Register erst während der Programmlaufzeit zum tragen und es kann den Takt etwas feiner unterteilen (nicht nur 1:8, sondern von 1:2 bis 1:256 in allen Zweierpotenzen).

Hat jemand Erfahrungen mit diesem Register und hat es schon einmal genutzt? Folgende Hoffnung hatte ich damit jedenfalls: man lässt den µC auf den Werkseinstellungen (9,6MHz Oszill. (des Tiny 13) mit gesetzter CKDIV8-Fuse: Takt = 1,2MHz) und teilt den Takt erst im Programm durch Setzen des CLKPR-Registers weiter runter (ginge bis runter auf 37,5kHz). Damit hätte man beim Programmieren einen ordentlich flotten Tiny und während des Programmlaufs einen schön sparsamen. So dachte ich jedenfalls! Aber da hat mir Atmel einen Strich durch die Rechnung gemacht.

Die Experimente zum Runterteilen des Taktes habe ich mit einem Tiny 25 gemacht, da dieser ein CLKO-Pin besitzt, über den man den aktuellen µC-Takt von außen abfragen kann. Zunächst: das CLKPR-Register funktioniert perfekt. Man kann damit wunderbar den Takt während des Programmlaufs verändern und hoch oder runter setzen. Nur leider betrifft dieser Takt auch den Programmiermodus. Jedenfalls war es nichts mit "programmieren bei höherer Frequenz".

Mal ein Beispiel: der Tiny läuft mit dem 8MHz Oszill. des Tiny 25 ohne gesetztes CKDIV8-Fuse, wobei das CLKPR-Register im Programm auf 1:256 gesetzt wird. Damit müsste der Tiny im "Normalfall" mit 8MHz laufen (gemessen habe ich 8,42MHz) und nach setzen des CLKPR-Registers nur noch mit 31,25kHz (gemessen habe ich 32,1kHz). Soweit so gut. Allerdings sollte das Programmieren bis 8,42MHz/4 = 2,10MHz möglich sein. Es klappt allerdings nur bis zu einem Takt von ungefähr 8kHz! Offensichtlich wird beim Eintritt in den Programmiermodus das CLKPR-Register nicht gelöscht und der Tiny schwingt weiter mit 32kHz :( Damit waren meine Hoffnungen bzgl. "es ist doch alles so einfach" dahin.

Eine Lösung hätte ich jetzt mit Hilfe des Watchdog-Timers: Diesen initialisiere ich am Anfang und lasse ihn nach 8s einen Interrupt auslösen. Erst in dessen ISR wird dann das CLKPR-Register gesetzt, so dass ich nach einem RESET eben diese 8s Zeit habe, um mit dem Programmieren zu beginnen. Das klappt auch wunderbar, nur hätte ich es gerne einfacher gehabt.

Für mein RL-Programm würden die Änderungen folgendermaßen aus sehen (stark abgespecktes Listing, welches nur die Änderungen zeigt):

Code: Alles auswählen

[...]
#include <avr/power.h>
[...]
BOOL fInitCLKPR;				// Wurde das CLKPR-Register schon initialisiert?
[...]
ISR(SIG_WATCHDOG_TIMEOUT)
{
    [...]
	if(!fInitCLKPR)
	{
		clock_prescale_set(clock_div_256);  // Hier wird as CLKPR-Register gesetzt
		fInitCLKPR = TRUE;
	}
    [...]
}
[...]
int main (void)
{
    [...]
	fInitCLKPR = FALSE;
    [...]
}
Vielleicht hat ja mal jemand das Bedürfnis einen AVR bis fast zum Stillstand zu verlangsamen. Jedenfalls kann man auf diese Art und Weise den Takt bis auf 500Hz runter bringen - an so einen langsamen Tiny kommt man nämlich normal kaum noch heran, wie AVR Studio einen wissen lässt:

Bild
Bild 1.1: Warnung AVR-Studio

Soweit zum CLKPR-Register und viele Grüße,
Thomas(_st)
thomas_st
Geowizard
Beiträge: 1643
Registriert: Fr 18. Nov 2005, 16:30
Wohnort: ~ N 51°21' E 12°00'

Re: Das CLKPR-Register und das Geheimnis der Stromaufnahme

Beitrag von thomas_st »

Kapitel 2: Das Geheimnis der Stromaufnahme

Tja, wenn man die Möglichkeit hat den Takt des Tinys recht feinfühlig zu beeinflussen, kann man dies ja ausnutzen und den Stromverbrauch eines Reaktivlichtes in Abhängigkeit der Taktrequenz zu ermitteln - und dieses Ergebnis empfinde ich als recht interessant.

Für die Untersuchungen habe ich jetzt unser ganz normales RL genutzt, über ein RC-Glied die Versorgung stabilisiert und den Stromverbrauch mit einem DMM gemessen (meine Hoffnung ist, dass ich so den mittleren Strom bestimmt habe). Die Schaltung des Messaufbaus sieht so aus:

Bild
Bild 2.1: Schaltung

Das Ganze hab eich jetzt für den Tag- und den Nachmodus des RL mit und ohne Schlafenlegen des Tinys gemessen (mit und ohne "set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_cpu();"). Hier die Ergebnisse:

Bild
Bild 2.2: Stromaufnahme mit 9,6 MHz Oszillator

Betrachten wir erstmal die Werte, die man erhält wenn der interne Oszillator mit 9,6MHz läuft. Mittels CLKPR-Registers kann man hier den Takt zwischen ca. 37kHz und 9,6MHz ändern. Die Welt ist noch in Ordnung, wenn man die Stromaufnahme ohne Schlafzyklen betrachtet (die gestrichelten Linien). Hier steigt sie mit steigendem Takt stark an und ist auch sonst um Größenordnungen größer als die, die der Tiny mit Schlafzyklen dazwischen benötigt. Auch erklärlich, wenn auch erstaunlich, ist die Stromaufnahme mit Schlafzyklen im Tagmodus (durchgezogene, gelbe Linie): sie ist unabhängig vom Takt. Zu erklären ist das wohl so: der µC nimmt aufgrund des höheren Taktes bei seiner Arbeit zwar mehr Strom auf, ist aber mit seiner Arbeit auch schneller fertig und kann sich wieder schlafenlegen - im Mittel heben sich beide Effekte auf und die Stromaufnahme bleibt gleich. Für mich erstmal nicht zu erklären ist die Stromaufnahme im Nachtmodus (blaue, durchgezogene Linie). Diese sinkt (!) mit steigendem Takt.

Bild
Bild 2.3: Stromaufnahme mit 128kHz Oszillator

Wenn man den internen Oszillator mit 128kHz laufen lässt, sieht die Sache noch interessanter aus: hier sinkt die Stromaufnahme unter Ausnutzung des Schlafmodusses im Tag- und im Nachtmodus mit steigendem Takt. Ob das Ganze irgendwie mit meinem RL-Programm zusammenhängt, habe ich nicht überprüft - für mich sieht es jedenfalls so aus, als ob ein Tiny mit maximalem Takt (9,6MHz) unter Ausnutzung des Schlafmodusses am stromsparensten ist. Einen Grund konnte ich dafür noch nicht ausmachen.

Vielleicht hat ja jemand eine Erklärung dafür, ansonsten würde ich empfehlen, den Takt nicht auf Biegen und Brechen runter zuschrauben - das bringt nur Probleme beim Programmieren mit sich und führt dazu, dass die Batterie viel zu flott leer gesaugt ist.

So weit für heute und viele Grüße,
Thomas(_st)
Dr.Schmock
Geocacher
Beiträge: 36
Registriert: Fr 3. Apr 2009, 00:02
Wohnort: HD

Re: Das CLKPR-Register und das Geheimnis der Stromaufnahme

Beitrag von Dr.Schmock »

Ein schöner Beitrag, der mich zum Grübeln gebracht hat! :)
Ich denke, ich weiß jetzt, woran es liegt.

Der Watchdog-Timer verwendet einen Oszillator, der unabhängig von der System-Clock-Frequenz ist. Dadurch bleibt die Dauer der Sleep-Perioden gleich, auch wenn man CLKPR verändert. Bei sinkender Frequenz wird aber die Periode im Active-Modus länger. Das Verhältnis SLEEP/ACTIVE wird also kleiner – der Stromverbrauch steigt.
Ist der Sleep-Modus aber ausgeschaltet, dann spielt die Watchdog keine Rolle und der Stromverbrauch steigt wie erwartet mit steigender Frequenz.


Angewendet auf das RL bedeutet das:

Beim Warten aufs Auslösen des RL (Tag und Nacht) sollte das Verhältnis SLEEP/ACTIVE möglichst groß sein. (Anders ausgedrückt: das Abfagen des ADC muss schnell gehen, um schnell wieder in den Sleep-Modus zurückzukehren.)
Die System-Clock-Frequenz sollte groß sein (zB. 1-8 MHz) und der Watchdog-Prescaler auch (->Sleep-Zeit lang).

Wird das RL ausgelöst, dann soll die unvermeidbare längere Blink-Zeit möglichst wenig Strom verbrauchen (vor allem bei Morse..).
CLKPR wird dafür mit einem größeren Wert beschrieben.
Also zusammengefasst:
Warten --> (ausgelöst) --> CLKPR rauf --> Blinken --> CLKPR runter --> warten


Ich hoffe, ich habe zu so später Stunde nichts fehlinterpretiert.
Ohne deine Nachforschungen wär ich nicht draufgekommen, darüber nachzudenken.

Grüße
stonewood
Geowizard
Beiträge: 1062
Registriert: Mo 3. Apr 2006, 10:15
Kontaktdaten:

Re: Das CLKPR-Register und das Geheimnis der Stromaufnahme

Beitrag von stonewood »

Die CKDIV8-Fuse wird übrigens über CLKPR realisiert. Wenn die Fuse gesetzt ist wird CLKPR beim Reset auf 8 gesetzt. Viel mehr passiert da nicht.
(hab ich mal im Datenblatt von einem Tiny gelesen - sinnigerweise haben sie den Absatz beim Tiny13 weggelassen ...)

Man kann den Prescaler dann nach wie vor im Programm ändern, sollte dann nur bedenken daß z.B. CLKPR=4 den Tiny schneller macht als er eigentlich laut Fuses ist.
thomas_st
Geowizard
Beiträge: 1643
Registriert: Fr 18. Nov 2005, 16:30
Wohnort: ~ N 51°21' E 12°00'

Re: Das CLKPR-Register und das Geheimnis der Stromaufnahme

Beitrag von thomas_st »

Dr.Schmock hat geschrieben:Ein schöner Beitrag, der mich zum Grübeln gebracht hat! :)
Dies war u.a. die Absicht ;)

Dr.Schmock hat geschrieben:Ich denke, ich weiß jetzt, woran es liegt.

Der Watchdog-Timer verwendet einen Oszillator, der unabhängig von der System-Clock-Frequenz ist. Dadurch bleibt die Dauer der Sleep-Perioden gleich, auch wenn man CLKPR verändert. Bei sinkender Frequenz wird aber die Periode im Active-Modus länger. Das Verhältnis SLEEP/ACTIVE wird also kleiner – der Stromverbrauch steigt.
Ich denke, dass Du hier einen Effekt übersehen hast: in den kürzeren ACTIVE-Phasen ist der Stromfluss höher, so dass sich beides gegenseitig aufheben könnte - das war die Erklärung für den von der Taktfrequenz unabhängigen Stromfluss im Tagmodus mit Schlafphasen.

Ich versuche es anderes zu erklären. Wozu benötigt ein µC eigentlich Strom? Ich sehe da nur das Umladen der Gate-Kapazitäten beim Schalten der Transistoren. Wenn man den µC zwischen den aktiven Phasen schlafen lässt, ist die Anzahl der Schaltvorgänge unabhängig von der Taktfrequenz und damit ist eigentlich auch die Stromaufnahme davon unabhängig.

Anders, wenn man den µC nicht pennen lässt: hier muss er zwischen den aktiven Phasen Warterunden drehen in denen Schaltvorgänge Strom benötigen. Genau, wie von Dir beschrieben:
Dr.Schmock hat geschrieben:Ist der Sleep-Modus aber ausgeschaltet, dann spielt die Watchdog keine Rolle und der Stromverbrauch steigt wie erwartet mit steigender Frequenz.
Warum der Stromfluss nun im Nachtmodus absinkt ... :???: Könnte es mit dem ADC zusammenhängen?

Viele Grüße,
Thomas(_st)
Zuletzt geändert von thomas_st am Do 20. Aug 2009, 12:55, insgesamt 1-mal geändert.
thomas_st
Geowizard
Beiträge: 1643
Registriert: Fr 18. Nov 2005, 16:30
Wohnort: ~ N 51°21' E 12°00'

Re: Das CLKPR-Register und das Geheimnis der Stromaufnahme

Beitrag von thomas_st »

stonewood hat geschrieben:Die CKDIV8-Fuse wird übrigens über CLKPR realisiert. Wenn die Fuse gesetzt ist wird CLKPR beim Reset auf 8 gesetzt. Viel mehr passiert da nicht.
Stimmt! Hätte ich irgendwo erwähnen können.
stonewood hat geschrieben:(hab ich mal im Datenblatt von einem Tiny gelesen - sinnigerweise haben sie den Absatz beim Tiny13 weggelassen ...)
Nöp, haben sie nicht ;) :
Datenblatt ATtiny 13 / Abschnitt zum Clock Prescale Register - CLKPR hat geschrieben:If CKDIV8 is programmed, CLKPS bits are reset to “0011”, giving a division factor of eight at start up.
stonewood hat geschrieben:Man kann den Prescaler dann nach wie vor im Programm ändern, sollte dann nur bedenken daß z.B. CLKPR=4 den Tiny schneller macht als er eigentlich laut Fuses ist.
Das ist in jede Richtung zu sehen: wenn man am CLKPR Register Änderungen vornimmt, ist das CKDIV8 Fuse ab dieser Stelle ohne Bedeutung.

Viele Grüße,
Thomas(_st)
Benutzeravatar
huzzel
Geowizard
Beiträge: 2787
Registriert: Mi 10. Okt 2007, 22:01
Kontaktdaten:

Re: Das CLKPR-Register und das Geheimnis der Stromaufnahme

Beitrag von huzzel »

Klingt nett ;)
Und hier der Bascom Code

Code: Alles auswählen

CONFIG CLOCKDIV = constant
Auf wieviel Jahrzehnte kann so die Laufzeit eines RL vergrößert werden ;) :D .
Aber Spaß beiseite, so ist vllt noch Potenzial für kleiner Batterien drin :smile:
Dr.Schmock
Geocacher
Beiträge: 36
Registriert: Fr 3. Apr 2009, 00:02
Wohnort: HD

Re: Das CLKPR-Register und das Geheimnis der Stromaufnahme

Beitrag von Dr.Schmock »

Ich bin bei der Erklärung davon ausgegengen, dass der Sleep-Modus immer viel weniger Strom braucht als der Active-Modus, selbst wenn man die Frequenz (theoretisch) gegen 0 bringen würde.
Laut Datenblatt ist das auch so (tiny24/44 Datenblatt)
Der Brownout-detektor alleine braucht schon 20uA, der Oszillator auch noch mal was.
Die beiden werden ja im Power-Down-Modus abgestellt.


Von daher kann die Rechnung mit der Erklärung
thomas_st hat geschrieben:Ich versuche es anderes zu erklären. Wozu benötigt ein µC eigentlich Strom? Ich sehe da nur das Umladen der Gate-Kapazitäten beim Schalten der Transistoren. Wenn man den µC zwischen den aktiven Phasen schlafen lässt, ist die Anzahl der Schaltvorgänge unabhängig von der Taktfrequenz und damit ist eigentlich auch die Stromaufnahme davon unabhängig.
...nicht aufgehen.

@huzzel:
Etwasl Potential zum Energiesparen ist schon drin.
Man kann den Verbrauch im Warte-Modus jetzt auch in der Nacht unter 5uA drücken und somit mit einer Knopfzell (CR2032) eine Lebensdauer von 5 Jahren erreichen!! Ohne LED auslösen, allerdings

Viele Grüße
Tobi
Dr.Schmock
Geocacher
Beiträge: 36
Registriert: Fr 3. Apr 2009, 00:02
Wohnort: HD

Re: Das CLKPR-Register und das Geheimnis der Stromaufnahme

Beitrag von Dr.Schmock »

Hab noch etwas rumgerechnet:

Wenn die LED 20mA verbraucht
und das RL 500mal im Jahr ausgelöst wird
und pro Auslösen eine Gesamt-Leuchtdauer der LED von 5 sek entsteht..

..dann verbraucht das RL ca. 14 mAh Strom fürs Blinken pro Jahr

Hinzukommen 44 mAh für den Wartemodus pro Jahr (bei 5uA).
->Zusammen 58mAh pro Jahr
Die Knopfzelle (CR2032) hat 210 mAh,

es ergibt sich eine Lebensdauer von 3,6 Jahren.
Nicht schlecht, oder?
thomas_st
Geowizard
Beiträge: 1643
Registriert: Fr 18. Nov 2005, 16:30
Wohnort: ~ N 51°21' E 12°00'

Re: Das CLKPR-Register und das Geheimnis der Stromaufnahme

Beitrag von thomas_st »

huzzel hat geschrieben:Auf wieviel Jahrzehnte kann so die Laufzeit eines RL vergrößert werden ;) :D .
Noch nicht ausgerechnet ;) - allerdings hatte ich für das normale RL mit AA Zellen mit angenommenen 2000mAh ohne Auslösung der LEDs und ohne Selbstentladung mal was von 36 Jahren abgeschätzt :D.
Dr.Schmock hat geschrieben:Der Brownout-detektor alleine braucht schon 20uA, der Oszillator auch noch mal was.
Die beiden werden ja im Power-Down-Modus abgestellt.
Der BrownOut-Detektor ist egal (da abgeschaltet) aber den Oszillator selbst hatte ich nicht mit betrachtet. Kann man den Stromverbrauch des µC im IDLE-Mode den Oszillatoren zuschreiben (CPU und Flash werden zumindest nicht mehr mit einem Takt versorgt)? Der ist nämlich mit ungefähr 1mA bei Vcc=3V / T=25°C / f = 9,6MHz beträchtlich hoch. Jep, das könnte die Erklärung sein :) und im Tagmodus macht es sich nicht bemerkbar, da der Anteil der aktiven Phase von vielleicht 0,001% auf 0,0001% sinkt - also so oder so sehr klein ist.

Dr.Schmock hat geschrieben:Von daher kann die Rechnung mit der Erklärung
thomas_st hat geschrieben:Ich versuche es anderes zu erklären. Wozu benötigt ein µC eigentlich Strom? Ich sehe da nur das Umladen der Gate-Kapazitäten beim Schalten der Transistoren. Wenn man den µC zwischen den aktiven Phasen schlafen lässt, ist die Anzahl der Schaltvorgänge unabhängig von der Taktfrequenz und damit ist eigentlich auch die Stromaufnahme davon unabhängig.
...nicht aufgehen.
Na die geht auf, wenn der Anteil des Oszillators gering ist - eben im Tagmodus.

Viele Grüße,
Thomas(_st)
Antworten