⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 power.c

📁 mega128平台下
💻 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 + -