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

📄 power.lis

📁 mega128平台下
💻 LIS
字号:
                        .module power.c
                        .area data(ram, con, rel)
 0000           _disabled::
 0000                   .blkb 1
                        .area idata
 0000 01                .byte 1
                        .area data(ram, con, rel)
                        .area text(rom, con, rel)
                ;           diff -> <dead>
                        .even
 0000           _getPowerLevel::
 0000           ; #include <iom128v.h>
 0000           ; #include <macros.h>
 0000           ; 
 0000           ; 
 0000           ; extern   void PowerEnable();
 0000           ; extern   void PowerDisable();
 0000           ; 
 0000           ;    unsigned char disabled = 1;
 0000           ; 
 0000           ;     enum {
 0000           ; 	IDLE = 0,
 0000           ; 	ADC_NR = (1 << SM0),
 0000           ; 	POWER_DOWN = (1 << SM1),
 0000           ; 	POWER_SAVE = (1 << SM0) + (1 << SM1),
 0000           ; 	STANDBY = (1 << SM2) + (1 << SM1),
 0000           ; 	EXT_STANDBY =  (1 << SM0) + (1 << SM1) + (1 << SM2)
 0000           ;     };
 0000           ; 
 0000           ; 
 0000           ;     unsigned char getPowerLevel() 
 0000           ; 	{
 0000           ; 	    unsigned char diff;
 0000           ; 		if ((TIMSK) & ( ~(1<<TOIE0) ) ) { // Are external timers
 0000 87B7              in R24,0x37
 0002 8E7F              andi R24,254
 0004 11F0              breq L3
 0006           ;                                                      // running?  
 0006           ;               return IDLE;
 0006 0027              clr R16
 0008 0AC0              xjmp L2
 000A           L3:
 000A           ; 			//return POWER_SAVE;
 000A           ; 		}// else if (bit_is_set(SPCR, SPIE)) { // SPI (Radio stack on mica)
 000A           ; 	   // return IDLE;
 000A           ; 	    //	} else if (bit_is_set(ACSR, ACIE)) { //Analog comparator
 000A           ; 	    //	    return IDLE;
 000A           ; 	 else if ((ADCSRA & (1<<ADEN))) { // ADC is enabled
 000A 379B              sbis 0x6,7
 000C 02C0              rjmp L5
 000E           ;           return ADC_NR;
 000E 08E0              ldi R16,8
 0010 06C0              xjmp L2
 0012           L5:
 0012           ; 	} else if ((TIMSK) & (1<<TOIE0) ) {
 0012 27B6              in R2,0x37
 0014 20FE              sbrs R2,0
 0016 02C0              rjmp L7
 0018           ;           //diff = inp(OCR0) - inp(TCNT0);
 0018           ;           //if (diff < 16) 
 0018           ;               //return EXT_STANDBY;
 0018           ;           return POWER_SAVE;
 0018 08E1              ldi R16,24
 001A 01C0              xjmp L2
 001C           L7:
 001C           ; 	} else {
 001C           ; 	    return POWER_DOWN;
 001C 00E1              ldi R16,16
 001E           L2:
 001E                   .dbline 0 ; func end
 001E 0895              ret
 0020           ;            foo -> R22
 0020           ;            mcu -> R20
                        .even
 0020           _doAdjustment::
 0020 0E940000          xcall push_gset2
 0024           ;       }
 0024           ;  }
 0024           ;     
 0024           ;     void doAdjustment() {
 0024           ;       unsigned char foo, mcu;
 0024           ;       foo = getPowerLevel();
 0024 EDDF              xcall _getPowerLevel
 0026 602F              mov R22,R16
 0028           ;       mcu = MCUCR;
 0028 45B7              in R20,0x35
 002A           ;       mcu &= 0xe3;
 002A 437E              andi R20,227
 002C 0C31              cpi R16,28
 002E 11F0              breq L12
 0030 0831              cpi R16,24
 0032 31F4              brne L10
 0034           L12:
 0034           ; 	if ((foo == EXT_STANDBY) || (foo == POWER_SAVE)) {
 0034           ; 	    mcu |= IDLE;
 0034 01C0              xjmp L14
 0036           L13:
 0036 0000              nop
 0038           L14:
 0038           ; 	    while (((ASSR) & 0x7) != 0) {
 0038 80B7              in R24,0x30
 003A 8770              andi R24,7
 003C E1F7              brne L13
 003E           ;               asm("nop");
 003E           ;           }
 003E           ;           mcu &= 0xe3;
 003E 437E              andi R20,227
 0040           ;       }
 0040           L10:
 0040           ; 	mcu |= foo;
 0040 462B              or R20,R22
 0042           ;       MCUCR =mcu;
 0042 45BF              out 0x35,R20
 0044           ;       MCUCR |= (1<<SE);
 0044 85B7              in R24,0x35
 0046 8062              ori R24,32
 0048 85BF              out 0x35,R24
 004A           L9:
 004A 0E940000          xcall pop_gset2
 004E                   .dbline 0 ; func end
 004E 0895              ret
 0050           ;            mcu -> R20
                        .even
 0050           _adjustPower::
 0050 0E940000          xcall push_gset1
 0054           ;       
 0054           ;     }    
 0054           ;    unsigned char adjustPower() {
 0054           ;         unsigned char mcu;
 0054           ;         if (!disabled){
 0054 20900000          lds R2,_disabled
 0058 2220              tst R2
 005A 29F4              brne L17
 005C           ;               /*mcu = MCUCR;
 005C 00E0              ldi R16,<PL_doAdjustment
 005E 10E0              ldi R17,>PL_doAdjustment
 0060 0E940000          xcall _post
 0064 06C0              xjmp L18
 0066           L17:
 0066           ; 	  		mcu &= 0xe3;
 0066           ; 	  		mcu |= POWER_SAVE;
 0066           ; 			MCUCR =mcu;
 0066           ; 			MCUCR |= (1<<SE);
 0066           ;         //*/  post(doAdjustment);
 0066           ;         }else {
 0066           ; 	  		mcu = MCUCR;
 0066 45B7              in R20,0x35
 0068           ;                       mcu &= 0xe3;
 0068 437E              andi R20,227
 006A           ;                       mcu |= IDLE;
 006A           ;                       MCUCR =mcu;
 006A 45BF              out 0x35,R20
 006C           ;                       MCUCR |= (1<<SE);
 006C 85B7              in R24,0x35
 006E 8062              ori R24,32
 0070 85BF              out 0x35,R24
 0072           ;         }
 0072           L18:
 0072           ; 	return 0;
 0072 0027              clr R16
 0074           L16:
 0074 0E940000          xcall pop_gset1
 0078                   .dbline 0 ; func end
 0078 0895              ret
                        .even
 007A           _PowerEnable::
 007A           ;     }
 007A           ; 
 007A           ;    void PowerEnable() {
 007A           ;       disabled = 0;
 007A 2224              clr R2
 007C 20920000          sts _disabled,R2
 0080           L19:
 0080                   .dbline 0 ; func end
 0080 0895              ret
                        .even
 0082           _PowerDisable::
 0082           ; 
 0082           ;     }
 0082           ; 
 0082           ;    void PowerDisable() {
 0082           ;       disabled = 1;
 0082 81E0              ldi R24,1
 0084 80930000          sts _disabled,R24
 0088           L20:
 0088                   .dbline 0 ; func end
 0088 0895              ret
                        .area func_lit
 0000 1000      PL_doAdjustment:        .word `_doAdjustment

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -