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 }
1.5.3