pwrmgmt.c

Go to the documentation of this file.
00001 /* This file has been prepared for Doxygen automatic documentation generation.*/
00025 //#include "iom406_320.h"
00026 #include <iom406.h>     // IAR headerfile for Mega406 (EW 410)
00027 #include <inavr.h>
00028 
00029 #define MODULE_PWRMGMT
00030 #include "pwrmgmt.h"
00031 
00032 #include "ee.h"
00033 #include "analog.h"
00034 #include "timer.h"
00035 
00036 
00037 void SetPowerSaveMode(void);
00038 void SetIdleMode(void);
00039 void SetActiveMode(void);
00040 
00041 
00042 
00043 //All Mode changes should use this routine in order to ensure that only
00044 // valid state transitions are made.  See AVR453 for details.
00045 void ChangePowerMode(unsigned char newmode, unsigned char shutdown_reason)
00046 {
00047   switch (PowerMode)    //what mode are we presently in?
00048   {
00049     case POWERMODE_POWERSAVE:
00050       if(newmode == POWERMODE_ACTIVE)
00051         SetActiveMode();
00052       else
00053       if(newmode == POWERMODE_POWEROFF)
00054         DoShutdown(shutdown_reason);
00055       break;
00056 
00057 
00058     case POWERMODE_IDLE:
00059       if(newmode == POWERMODE_ACTIVE)
00060         SetActiveMode();
00061       else
00062       if(newmode == POWERMODE_POWERSAVE)
00063         SetPowerSaveMode();
00064       else
00065       if(newmode == POWERMODE_POWEROFF)
00066         DoShutdown(shutdown_reason);
00067       break;
00068 
00069 
00070     case POWERMODE_ACTIVE:
00071       if(newmode == POWERMODE_IDLE)
00072         SetIdleMode();
00073       else
00074       if(newmode == POWERMODE_POWERSAVE)
00075         SetPowerSaveMode();
00076       else
00077       if(newmode == POWERMODE_POWEROFF)
00078         DoShutdown(shutdown_reason);
00079       break;
00080 
00081 
00082     case POWERMODE_POWEROFF:
00083     default:
00084       if(newmode == POWERMODE_POWEROFF)
00085         DoShutdown(SHUTDOWN_REASON_UNKNOWNSTATE);
00086       else
00087         SetPowerSaveMode();
00088       break;
00089   }
00090 }
00091 
00092 
00093 
00094 void DoShutdown(unsigned char reason)
00095 {
00096   __disable_interrupt();
00097 
00098   //store the REASON code in EEPROM
00099   while(EECR & (1<<EEPE));
00100   while(SPMCSR & (1<<SPMEN));
00101   EEAR = EESTORAGE_SHUTDOWNREASON;
00102   EEDR = reason;
00103   EECR = (0<<EEPM1) | (0<<EEPM0) | (0<<EERIE) | (1<<EEMPE) | (0<<EEPE) | (0<<EERE);     //arm
00104   EECR = (0<<EEPM1) | (0<<EEPM0) | (0<<EERIE) | (1<<EEMPE) | (1<<EEPE) | (0<<EERE);     //go
00105   while(EECR & (1<<EEPE));                                                              //wait until done
00106 
00107   SMCR = SLEEP_POWEROFF | (1<<SE);      //prep for power-off
00108   __sleep();
00109 }
00110 
00111 
00112 void SetPowerSaveMode(void)
00113 {
00114   CCmode(CC_DISABLED);
00115   FCSR = 0;
00116   SMCR = SLEEP_POWERSAVE;
00117   PowerMode = POWERMODE_POWERSAVE;
00118   setWakeup(WU4sec, SLEEP_NONE);
00119 }
00120 
00121 
00122 void SetIdleMode(void)
00123 {
00124   CCmode(CC_REGULAR);
00125   FCSR = ((1<<DFE) | (1<<CFE) | (1<<PFD));
00126   SMCR = SLEEP_IDLE;
00127   PowerMode = POWERMODE_IDLE;
00128 }
00129 
00130 
00131 
00132 
00133 void SetActiveMode(void)
00134 {
00135   CCmode(CC_ACCUMULATE);
00136   FCSR = ((1<<DFE) | (1<<CFE) | (1<<PFD));
00137   SMCR = SLEEP_IDLE;
00138   PowerMode = POWERMODE_ACTIVE;
00139   setWakeup(WUoff,0);
00140 }

Generated on Mon Nov 12 15:59:58 2007 for AVR453 Smart Battery Reference Design by  doxygen 1.5.3