-         

Ergebnis 1 bis 6 von 6

Thema: Aufwachen aus dem Sleep-Mode

  1. #1

    Aufwachen aus dem Sleep-Mode

    Anzeige

    Hallo,

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

    Code:
    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 !

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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.
    #ifndef MfG
    #define MfG

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  5. #5
    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 ^^.

  6. #6
    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?

    Code:
    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?

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •