📄 power.s
字号:
.module power.c
.area data(ram, con, rel)
_disabled::
.blkb 1
.area idata
.byte 1
.area data(ram, con, rel)
.area text(rom, con, rel)
; diff -> <dead>
.even
_getPowerLevel::
; #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
in R24,0x37
andi R24,254
breq L3
; // running?
; return IDLE;
clr R16
xjmp L2
L3:
; //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
sbis 0x6,7
rjmp L5
; return ADC_NR;
ldi R16,8
xjmp L2
L5:
; } else if ((TIMSK) & (1<<TOIE0) ) {
in R2,0x37
sbrs R2,0
rjmp L7
; //diff = inp(OCR0) - inp(TCNT0);
; //if (diff < 16)
; //return EXT_STANDBY;
; return POWER_SAVE;
ldi R16,24
xjmp L2
L7:
; } else {
; return POWER_DOWN;
ldi R16,16
L2:
.dbline 0 ; func end
ret
; foo -> R22
; mcu -> R20
.even
_doAdjustment::
xcall push_gset2
; }
; }
;
; void doAdjustment() {
; unsigned char foo, mcu;
; foo = getPowerLevel();
xcall _getPowerLevel
mov R22,R16
; mcu = MCUCR;
in R20,0x35
; mcu &= 0xe3;
andi R20,227
cpi R16,28
breq L12
cpi R16,24
brne L10
L12:
; if ((foo == EXT_STANDBY) || (foo == POWER_SAVE)) {
; mcu |= IDLE;
xjmp L14
L13:
nop
L14:
; while (((ASSR) & 0x7) != 0) {
in R24,0x30
andi R24,7
brne L13
; asm("nop");
; }
; mcu &= 0xe3;
andi R20,227
; }
L10:
; mcu |= foo;
or R20,R22
; MCUCR =mcu;
out 0x35,R20
; MCUCR |= (1<<SE);
in R24,0x35
ori R24,32
out 0x35,R24
L9:
xcall pop_gset2
.dbline 0 ; func end
ret
; mcu -> R20
.even
_adjustPower::
xcall push_gset1
;
; }
; unsigned char adjustPower() {
; unsigned char mcu;
; if (!disabled){
lds R2,_disabled
tst R2
brne L17
; /*mcu = MCUCR;
ldi R16,<PL_doAdjustment
ldi R17,>PL_doAdjustment
xcall _post
xjmp L18
L17:
; mcu &= 0xe3;
; mcu |= POWER_SAVE;
; MCUCR =mcu;
; MCUCR |= (1<<SE);
; //*/ post(doAdjustment);
; }else {
; mcu = MCUCR;
in R20,0x35
; mcu &= 0xe3;
andi R20,227
; mcu |= IDLE;
; MCUCR =mcu;
out 0x35,R20
; MCUCR |= (1<<SE);
in R24,0x35
ori R24,32
out 0x35,R24
; }
L18:
; return 0;
clr R16
L16:
xcall pop_gset1
.dbline 0 ; func end
ret
.even
_PowerEnable::
; }
;
; void PowerEnable() {
; disabled = 0;
clr R2
sts _disabled,R2
L19:
.dbline 0 ; func end
ret
.even
_PowerDisable::
;
; }
;
; void PowerDisable() {
; disabled = 1;
ldi R24,1
sts _disabled,R24
L20:
.dbline 0 ; func end
ret
.area func_lit
PL_doAdjustment: .word `_doAdjustment
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -