PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Aufwachen aus dem Sleep-Mode



Pk3
25.09.2010, 14:35
Hallo,

ich versuche schon seit einiger Zeit meine Mega128 - CPU (PRO-Bot128) aus dem Schlafmodus zu holen.
Klappt jetzt auch soweit, aber ich habe folgendes Problem:


void Wait(byte sec) {
Timer_T0Time(245, PS0_1024); // Timer_T0Time(byte, byte) (PS0_1024 = 69,44us)
nValue = sec*10; // 60 * 10 = 600ms

for(k = 0; k < 100; k++) {
for(j = 0; j < nValue; j = j + 17) { // +17, weil 245 * 69,44us ca. 17ms ergibt
Sleep(105); // ADC Noise Reductions - Modus
}
}
}

Wie man sieht wacht diese Funktion alle 17ms aus dem Schlafmodus auf, weil
der Timer0 kein hoeheres Intervall erlaubt (max. 255 (*69,44 = 17,7ms)).
Ich moechte aber das die CPU länger im Sleep-Modus verbleibt.

Ich habe 4 Timer:
Timer0 (8 Bit)
Timer1 (16 Bit)
Timer2 (16 Bit)
Timer3 (16 Bit)

Die CPU wacht aber nur durch den Timer0 auf. Gibt es eine Moeglichkeit, wie man
das umstellen kann, dass die CPU durch einen anderen Timer geweckt wird?
Und ich glaube kaum das durch so vieles Aufwachen effizient Strom gespart wird, oder?
Ich verwende die C-Control Pro IDE.

Freue mich auf jede Antwort :)!

Besserwessi
25.09.2010, 19:20
Auch wenn der µC alls 17 ms Aufwacht, spart das schon ziehmich viel. Zwischen den Sleep Zeiten wird man größenordnungsmäßig 250 Zyklen brauchen. Danach hat man dann 250*1024 Zyklen einen Sleep Mode - das sind immerhin rund 99,9% der Zeit.


Da ist es schon wichtiger welchen der Sparmodi man wählt, der ADC noise-reduktion Mode ist da eher ungewöhnlich. Einer der Sparsamsten ist es den eigentliche Takt abzustellen und den Watchdog-timer zum Aufwachen zu nutzen. Da hat man aber keinen genauen Takt, und man hat nicht viel mögliche Signale zum Aufwachen.

Je nach Sleep Mode sollten auch die anderen Timer zum Aufwachen gehen.

Jaecko
25.09.2010, 19:27
Wenn der wirklich nur den Timer0 zum Aufwachen verwenden kann, gibts - ausser die maximale Laufzeit rauszuholen, eigentlich keine Möglichkeit, die Schlafzeit zu verlängern. Der Aufwachgrund ist ja der von diesem Timer erzeugte Interrupt. Und der lässt sich halt nur durch Prescaler (max. 1024) und Reload-Wert (max. 0 bzw. 255, je nach Zählrichtung) bestimmen.

Aber du kannst ja so "grob" berechnen, ob das wirklich so viel Saft braucht. Wenn du weisst, wie lang der alle 17ms mal wach ist, kannst du daraus ja das Verhältnis von Schlaf/Wachzeit ausrechnen.
Grob geschätzt dürfte da schon ne deutliche Senkung im Stromverbrauch erkennbar sein.

Nachtrag (andere Antwort grad gesehen):
Andere Timer dürften im "Sleep"-Modus funktionieren.
(Nen AT90CAN128 lass ich z.B. im Timer1 immer wieder mal nachschauen)
Beim Watchdog gibts doch dann das Problem, dass der nen Reset durchführt. Könnte u.U. nicht gewollt sein.

Besserwessi
25.09.2010, 19:41
Der Mega128 ist wohl noch so alt, das man den Watchdog nicht gut auch als Timer misbrauchen kann. Bei neueren µCs wie Mega1280 geht das. Die sind auch so schon Sparsamer

Neben den Sleep modes ist die Wahl der Versrogungsspannung eine andere Methode um Strom zu sparen. Es müssen ja nicht immer 5 V sein.

Pk3
25.09.2010, 20:49
Danke für die Antworten :)!

@Besserwessi
Ja, den ADC Noise Reduction - Modus hab ich nur testweise genommen.

Habs gerade mal mit dem Power - Down ausprobiert (funktioniert).
Nachteil ist beim Power - Down Modus die lange Einschwingzeit dess Oszillators und die Gefahr, dass die CPU abstürtzt (laut Mikrocontroller.net). Also verwende ich bei dieser Funktion den Standby Modus.


Solange Strom gespart wird bin ich ja beruhigt.
Die CPU macht eigentlich nichts weiter als alle 10 Minuten die aktuelle Zeit, Temperatur und Spannung in das EEPROM zu schreiben.

Werde das über Nacht mal laufen lassen und schauen wie lange der im Stromsparmodus durchhält (ohne Stromsparmodus max. 14h).

Thx nochmal und gn8 ^^.

Pk3
26.09.2010, 10:21
Habs mal durchlaufen lassen und festgestellt, das 0,3V/10h verbraucht werden. D.h. die CPU hält ca. 20 Stunden (5.0V - 4.4V). Immerhin länger als 14 Stunden^^. Hab noch ein bisschen mit den verschiedene Sleep - Modis rumprobiert und festgestellt, dass ich immer in den selben Modi gehe weil der Stromverbrauch immer derselbe ist.

In der Dokumentation steht, dass ich 3 Bits setzen muss (SM0-SM2) (http://www.c-control-pro.de/documentation/sleep.htm). Die Doku sagt, dass das SE Bit im MCUCR gesetzt wird und eine Assembler Sleep Instruktion ausgeführt wird. Also muss ich kein SE Bit setzen, nur die 3 Bits.

Wenn ich jetzt aber in den Idle - Modus will, heißt das Byte 0 (000). Wenn ich dann also Sleep(0); ausführe, wird kein Sleep - Modus ausgeführt, das Programm läuft einfach weiter.

Das muss also heißen das ich den gesamten MCUCR - Register als Byte an die Sleep - Funktion übergeben muss?


SRE SRW10 SE SM1 SM0 SM2 IVSEL IVCE
0 0 0 1 0 0 0 0

Also meine Frage: Was genau muss ich an die Sleep - Funktion übergeben?