📄 power.c
字号:
#include <iom128v.h>
#include <macros.h>
extern void PowerEnable();
extern void PowerDisable();
unsigned char disabled = 1;
enum {
IDLE = 0,
ADC_NR = (1 << SM0),
POWER_DOWN = (1 << SM1),
POWER_SAVE = (1 << SM0) + (1 << SM1),
STANDBY = (1 << SM2) + (1 << SM1),
EXT_STANDBY = (1 << SM0) + (1 << SM1) + (1 << SM2)
};
unsigned char getPowerLevel()
{
unsigned char diff;
if ((TIMSK) & ( ~(1<<TOIE0) ) ) { // Are external timers
// running?
return IDLE;
//return POWER_SAVE;
}// else if (bit_is_set(SPCR, SPIE)) { // SPI (Radio stack on mica)
// return IDLE;
// } else if (bit_is_set(ACSR, ACIE)) { //Analog comparator
// return IDLE;
else if ((ADCSRA & (1<<ADEN))) { // ADC is enabled
return ADC_NR;
} else if ((TIMSK) & (1<<TOIE0) ) {
//diff = inp(OCR0) - inp(TCNT0);
//if (diff < 16)
//return EXT_STANDBY;
return POWER_SAVE;
} else {
return POWER_DOWN;
}
}
void doAdjustment() {
unsigned char foo, mcu;
foo = getPowerLevel();
mcu = MCUCR;
mcu &= 0xe3;
if ((foo == EXT_STANDBY) || (foo == POWER_SAVE)) {
mcu |= IDLE;
while (((ASSR) & 0x7) != 0) {
asm("nop");
}
mcu &= 0xe3;
}
mcu |= foo;
MCUCR =mcu;
MCUCR |= (1<<SE);
}
unsigned char adjustPower() {
unsigned char mcu;
if (!disabled){
/*mcu = MCUCR;
mcu &= 0xe3;
mcu |= POWER_SAVE;
MCUCR =mcu;
MCUCR |= (1<<SE);
//*/ post(doAdjustment);
}else {
mcu = MCUCR;
mcu &= 0xe3;
mcu |= IDLE;
MCUCR =mcu;
MCUCR |= (1<<SE);
}
return 0;
}
void PowerEnable() {
disabled = 0;
}
void PowerDisable() {
disabled = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -