-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 33

Thema: der ASURO als Wecker

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213

    der ASURO als Wecker

    Anzeige

    Hallo,

    hier (Anhang) nun das Gegenstück zum Einschlafprogramm:
    der ASURO als Wecker.
    Leider eignet er sich nur für ein kurzes Mittagsschläfchen, da die Akkus nicht sehr lange durchhalten.
    Oder gibt es irgendwelche programmiertechnischen Tricks zur Energieeinsparung?

    Gruss
    M.
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo M1.R.
    da hast du dir ja wieder was lustiges, und sinnvolles ausgedacht.

    Zu Stromsparen kannst die Kiste mit:
    void set_sleep_mode (uint8 t mode)
    void sleep_mode (void)

    in einen Sleep-Mode setzen.

    Die mode-Möglichkeiten sind folgende:

    #define SLEEP_MODE_ADC BV(SM0)
    ADC Noise Reduction Mode.
    #define SLEEP_MODE_EXT_STANDBY ( BV(SM0) | BV(SM1) | -
    Extended Standby Mode.
    #define SLEEP_MODE_IDLE 0
    Idle mode.
    #define SLEEP_MODE_PWR_DOWN BV(SM1)
    Power Down Mode.
    #define SLEEP_MODE_PWR_SAVE ( BV(SM0) | BV(SM1))
    Power Save Mode.
    #define SLEEP_MODE_STANDBY ( BV(SM1) | BV(SM2))
    Standby Mode.

    Am sinnvollsten erscheint mir der Mode "Power Save Mode", da hier alles außer Timer 2 abgeschaltet wird. Mit hoher Wahrscheinlichkeit muss noch das Bit AS2 im ASSR-Register gesetzt werden. Sonst ist auch Timer 2 ausgeschaltete!

    Dann sollte folgendes Prinzip funktionieren:

    // ISR muss nichts tun. Soll nur vorhanden sein.
    ISR (TIMER-2)
    {
    ;
    }

    // Initialisiere Timer 2 möglichst auf 1 ms
    // Hier die Bits setzen, die den Timer 2 veranlassen, nach einer ms einen
    // Interrupt auszulösen.
    Tu dies;
    Setze das;
    schalte den Interrupt scharf;

    // Initialisiere einen eigenen ms-Zähler
    ms_zeit = 0;

    // Sleepmode setzen
    set_sleep_mode (SLEEP_MODE_PWR_SAVE);

    while (ms_zeit < zeit)
    {
    ms_zeit++;
    sleep_mode ();
    }


    Das Ganze ist in den Dokumenten "AVRInstructionSet.pdf" und "ATmega8.pdf" auf der Asuro-CD zu finden.

    Im ATmega8.pdf sind auf Seite 33 die Sleep-Modes
    Im AVRInstructionSet.pdf in Kapitel "5.5 Power Management and Sleep Modes" geht es um die Sleep-Befehle.

    So, und jetzt werfe ich das Einschlafprogramm an.

    Gruß Sterntahler
    P.S.: Das Ganze ist rein theoretisch, da ich das selber noch nie gemacht habe.
    Lieber Asuro programieren als arbeiten gehen.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213
    Hallo Sternthaler,

    Zitat Zitat von Sternthaler
    // Initialisiere Timer 2 möglichst auf 1 ms
    // Hier die Bits setzen, die den Timer 2 veranlassen, nach einer ms einen
    // Interrupt auszulösen.
    Tu dies;
    Setze das;
    schalte den Interrupt scharf;
    o je, o je, da hab ich mir mal wieder was angetan - erst diese seltsamen Bitschiebereien, und dann auch noch die mir völlig suspekten Interrupts.
    Und ich habe gedacht, so was brauche ich nie.

    Fragen dazu folgen bestimmt demnächst ...

    Ist aber schon mal gut zu wissen, dass es Stromsparmöglichkeiten gibt, vielen Dank!

    Gruss
    M.

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213
    so, jetzt habe ich rumprobiert.

    Mit IDLE scheints mit einem normalen Msleep zu gehen:

    Code:
    #include "asuro.h"
    #include <avr/interrupt.h>
    #include <avr/sleep.h>
    //------------------------------------------------------------------
    int main(void)
    {
    	Init();
    
    	StatusLED(OFF);
    	BackLED(ON,ON);
    	MotorDir(FWD,FWD);
    	MotorSpeed(200,0);
    	Msleep(5000);
    
    	set_sleep_mode ( SLEEP_MODE_IDLE );
    
    	for (int16_t i = 1; i <= 10; ++i)
    		{
    			BackLED(OFF,OFF);
    			StatusLED(YELLOW);
    			sleep_enable();
    			sleep_mode();
    			sleep_disable();
    			Msleep(500);
    		}
    
    	MotorSpeed(0,0);
    	StatusLED(RED);
      	while (1);
      	return 0;
    }
    das gleiche mit PWR_SAVE wie zu erwarten leider nicht: die BackLEDs gehen brav aus, die StatusLED wird gelb, der Motor dreht sich schneller und so bleibts.
    Code:
    ...
    set_sleep_mode ( SLEEP_MODE_PWR_SAVE );
    ASSR = (1<<AS2);
    ...
    Mit Interrupts gehts wahrscheinlich - hilft mir bitte jemand dabei? (Ich kapiers nicht!)

    da gibt es noch eine Anleitung: ...WinAVR-20070525/doc/avr-libc/avr-libc-user-manual/group__avr__sleep.html
    und da:http://www.mikrocontroller.net/articles/Sleep_Mode

    Gruss
    M.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo M1.R,
    in dem von dir angegeben Wiki steht ja direkt zu Anfang warum das nicht geht:
    ... Das heißt aber auch, daß vor dem Eintritt in den Sleep-Mode die jeweiligen Interrupts freigegeben werden müssen und auch die entsprechenden Interruptroutinen bereitgestellt werden müssen. Sonst gibt es im wahrsten Sinne des Wortes ein böses Erwachen oder einen endlosen Dornröschenschlaf, ...
    Der "Power-Save-Mode" schaltet nämlich auch alle laufenden Timer ab.

    Im "ATmega8.pdf" auf Seite 33 ist unter dem Kapitel "Power Management
    and Sleep Modes" eine Tabelle, die angibt was im AVR noch mit Taktsignalen in welchem Mode versorgt wird. Nur wo Takt ist, spielt die Musik. Sollte in deinem Haushalt doch bekannt sein

    Da du ja in deinem Beispiel beim "Power-Save-Mode" keine Interrupt-Funktion hast, kann auch kein Wecksignal erzeugt werden.
    Und somit bleibt der AVR im oben angegeben Dornröschenschlaf.

    Du solltest dir Tabelle (Tabelle 14) mal ansehen. Dann wird klar, warum ich den Timer-2-Interrupt vorgeschlagen hatte, und du auf das AS2-Bit achten musst.
    Jetzt finde ich aber auch folgendes zum "Pover-Save-Mode":
    Hier werden fast alle Oszillatoren gestoppt. Die einzige Ausnahme ist der Timer 2, welcher asynchron mit einem 32,768 kHz Uhrenquarz betrieben werden kann. Ist er entsprechend konfiguriert, dann bleibt er beim Einschalten des Power Save Mode aktiv. Dieser Modus ist einer der wichtigsten! Da alle Oszillatoren gestoppt sind, funktionieren nur noch die asynchronen Module.
    Hier scheint somit ein externer Takt für den Timer 2 notwendig zu sein. Also ist es nicht sicher, ob das dann überhaupt mit dem Quarz am Asuro funktionieren wird. Obwohl das ja ein externer Taktgeber ist. Keine Ahnung.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213
    Hallo Sternthaler,
    erstmal eine Erfolgsmeldung:
    mit "IDLE" haben die Akkus die ganze Nacht durchgehalten und mein ASURO hat mich heute morgen geweckt!
    Vielen Dank!!!
    Zitat Zitat von Sternthaler
    in dem von dir angegeben Wiki steht ja direkt zu Anfang warum das nicht geht ...
    Hab ich ja auch eigentlich nicht gedacht, habs nur ausprobiert in der Hoffnung, dass im Msleep ein Interrupt "drin" ist.
    Zitat Zitat von Sternthaler
    Du solltest dir Tabelle (Tabelle 14) mal ansehen. Dann wird klar, warum ich den Timer-2-Interrupt vorgeschlagen hatte, und du auf das AS2-Bit achten musst.
    Hab ich, ist auch klar. Ich hätte es ja auch so versucht, wie du vorgeschlagen hast, wenn ich die Interrupt-Programmierung verstehen würde.
    Gruss
    M.

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344
    hi M.1.R,
    und wie hast du es nun gemacht? große abweichungen zum code oben?
    gruß inka

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213
    Zitat Zitat von inka
    hi M.1.R,
    und wie hast du es nun gemacht? große abweichungen zum code oben?
    meinst du die Änderungen im Wecker-Programm?

    Das muss rein:
    #include <avr/sleep.h>
    die Warteschleife (kurz vorm Ende des Programms) sieht jetzt so aus:
    Code:
    set_sleep_mode ( SLEEP_MODE_IDLE );
    while ( Gettime() < zeit )
    	{	
    		sleep_enable();
    		sleep_mode();
    		sleep_disable();
    		Gettime();
    	}
    Das ist jetzt aber nur der Idle Mode, mit dem Power Save Mode könnte man noch viel mehr Strom sparen.
    Gruss
    M.

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Leider eignet er sich nur für ein kurzes Mittagsschläfchen, da die Akkus nicht sehr lange durchhalten.
    Oder gibt es irgendwelche programmiertechnischen Tricks zur Energieeinsparung?
    Ich bin irgendwie auf Akkuverschwendung programmiert, wache morgens manchmal schon vor dem Weckerklinglen auf, mach ihn dann im Halbschlauf aus und verpenne.

    Mit ein bischen Selbstdisziplin kannst du dich ja vielleicht so prigrammieren, dass du auch vorher wach wirst und den Asuro erst kurz vor dem Wecken einschaltest.
    Das spart nicht nur Strom - dann kannst du auch die Vorfreude auf den Asuro-Weckdienst besser geniessen.
    Ausserdem braucht dein Asuro dann auch keine Angst haben beim Wecken Schläge zu kriegen, was meinem Wecker wenn er mich morgens wirklich kalt im Schlaf erwischt öfter mal passiert

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo recycle,
    die Idee ist nicht schlecht. Bei mir geht es eher so, dass ich KEINEN Wecker stelle. Meine Frau versucht mich bis zu 10 mal zu wecken. Danach kommt sie mit einem nassen, kalten Waschlappen und quält mich.
    Hat bis jetzt immer funktioniert.

    Gruß Sternthaler

    @M1.R
    Super, hätte nie gedacht, dass der Stromverbrauch dann so weit runter geht.

    [EDIT]Rechtschreibfehler reduziert.
    Lieber Asuro programieren als arbeiten gehen.

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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