📄 power.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 + -