📄 power.lis
字号:
0062 88E1 ldi R24,24
0064 81BD out 0x21,R24
0066 .dbline 72
0066 ; WDTCR=(0<<WDE);
0066 2224 clr R2
0068 21BC out 0x21,R2
006A .dbline 83
006A ; //或使用wdt.h里面的wdt_disable()函数
006A ;
006A ; /*
006A ; 模数转换器(上电默认是关闭的)
006A ; 使能时, ADC在睡眠模式下继续工作。
006A ; 为了降低功耗,在进入睡眠模式之前需要禁止ADC。
006A ; 重新启动后的第一次转换为扩展的转换。
006A ;
006A ; 假设模数转换器使能了,关闭程式如下
006A ; */
006A ; ADCSRA=(0<<ADEN);
006A 26B8 out 0x6,R2
006C .dbline 92
006C ; /*
006C ; 模拟比较器(上电默认是打开的,需要手工关闭)
006C ; 在空闲模式时,如果没有使用模拟比较器,可以将其关闭。在ADC 噪声抑制模式下也是如此。
006C ; 在其他睡眠模式模拟比较器是自动关闭的。
006C ; 如果模拟比较器使用了内部电压基准源,则不论在什么睡眠模式下都需要关闭它。否则内部电压基准源将一直使能。
006C ;
006C ; 关闭程式如下
006C ; */
006C ; ACSR=(1<<ACD);
006C 80E8 ldi R24,128
006E 88B9 out 0x8,R24
0070 .dbline 134
0070 ; /*
0070 ; 掉电检测BOD (由熔丝位BODEN控制)
0070 ; 如果系统没有利用掉电检测器BOD,这个模块也可以关闭。
0070 ; 如果熔丝位BODEN 被编程,从而使能了BOD 功能,它将在各种休眠模式下继续工作。
0070 ; 在深层次的休眠模式下,这个电流将占总电流的很大比重。
0070 ;
0070 ; 设置熔丝位BODEN=1 关断BOD功能
0070 ; */
0070 ;
0070 ; /*
0070 ; 片内基准电压
0070 ; 使用BOD、模拟比较器和ADC 时可能需要内部电压基准源。
0070 ; 若这些模块都禁止了,则基准源也可以禁止。
0070 ; 重新使能后用户必须等待基准源稳定之后才可以使用它。
0070 ; 如果基准源在休眠过程中是使能的,其输出立即可以使用。
0070 ;
0070 ; 当BOD、模拟比较器和ADC都禁止了,则基准源也自动禁止了。
0070 ; */
0070 ;
0070 ; /*
0070 ; JTAG 接口与片上调试系统
0070 ; 如果通过熔丝位OCDEN使能了片上调试系统,当芯片进入掉电或省电模式时主时钟保持运行。
0070 ; 在休眠模式中这个电流占总电流的很大比重。
0070 ; 下面有三种替代方法:
0070 ; 1 不编程OCDEN
0070 ; 2 不编程JTAGEN
0070 ; 3 置位MCUCSR 的JTD
0070 ; 当JTAG 接口使能而JTAG TAP 控制器没有进行数据交换时,引脚TDO 将悬空。
0070 ; 如果与TDO 引脚连接的硬件电路没有上拉电阻,功耗将增加。
0070 ; 器件的引脚TDI 包含一个上拉电阻,因此在扫描链中无需为下一个芯片的TDO 引脚设置上拉电阻。
0070 ; 通过置位MCUCSR寄存器的JTD 或不对JTAG 熔丝位编程可以禁止JTAG 接口。
0070 ;
0070 ; JTD: 禁止JTAG 接口(MCU控制与状态寄存器MCUCSR Bit7)
0070 ; 此位为0 时,如果JTAGEN熔丝位被编程则JTAG 接口使能。
0070 ; 如果这位为1, JTAG接口禁止。
0070 ; 为了避免无意的禁止或使能JTAG接口,必须通过一个时间序列来改变JTD 位。
0070 ; 应用软件必须在四个时钟周期内将期望的数值两次写入JTD。
0070 ; 如果JTAG 接口没有与其他JTAG电路连接, JTD应该置位。这样做的原因是为了避免JTAG接口TDO引脚的静态电流。
0070 ;
0070 ; 在软件中关闭JTAG接口的方法
0070 ; */
0070 ; MCUCSR=(1<<JTD);
0070 84BF out 0x34,R24
0072 .dbline 135
0072 ; MCUCSR=(1<<JTD);
0072 84BF out 0x34,R24
0074 .dbline 150
0074 ;
0074 ; /*
0074 ; 掉电模式
0074 ; 当SM2..0 为010 时, SLEEP 指令将使MCU 进入掉电模式。
0074 ; 在此模式下,外部晶体停振,而外部中断、两线接口地址匹配及看门狗(如果使能的话)继续工作。
0074 ; 只有外部复位、看门狗复位、BOD 复位、两线接口地址匹配中断、外部电平中断INT0 或INT1,或外部中断INT2 可以使MCU 脱离掉电模式。
0074 ; 这个睡眠模式停止了所有的时钟,只有异步模块可以继续工作。
0074 ; 当使用外部电平中断方式将MCU 从掉电模式唤醒时,必须保持外部电平一定的时间。
0074 ; 从施加掉电唤醒条件到真正唤醒有一个延迟时间,此时间用于时钟重新启动并稳定下来。
0074 ; 唤醒周期与由熔丝位CKSEL 定义的复位周期是一样的。
0074 ;
0074 ; 如果在睡眠过程中发生了复位,则MCU 唤醒后从中断向量开始执行
0074 ; 使能的中断可以将进入睡眠模式的MCU 唤醒, 经过启动时间,外加4个时钟周期后,MCU就可以运行中断例程了。然后返回到SLEEP 的下一条指令。
0074 ; */
0074 ; MCUCSR=(0<<ISC00); //INT0 的下降沿激活中断(默认的,这句话可以不写)
0074 24BE out 0x34,R2
0076 .dbline 151
0076 ; GICR=(1<<INT0); //使能外部中断INT0
0076 80E4 ldi R24,64
0078 8BBF out 0x3b,R24
007A .dbline 152
007A ; SEI(); //使能全局中断
007A 7894 sei
007C 10C0 xjmp L19
007E L18:
007E .dbline 154
007E ; while(1)
007E ; {
007E .dbline 155
007E ; for (i=0;i<10;i++) //LED闪动10次后进入掉电模式的睡眠状态
007E 4427 clr R20
0080 09C0 xjmp L24
0082 L21:
0082 .dbline 156
0082 .dbline 157
0082 0CE2 ldi R16,300
0084 11E0 ldi R17,1
0086 D7DF xcall _delay_nms
0088 .dbline 158
0088 D898 cbi 0x1b,0
008A .dbline 159
008A 0CE2 ldi R16,300
008C 11E0 ldi R17,1
008E D3DF xcall _delay_nms
0090 .dbline 160
0090 D89A sbi 0x1b,0
0092 .dbline 161
0092 L22:
0092 .dbline 155
0092 4395 inc R20
0094 L24:
0094 .dbline 155
0094 4A30 cpi R20,10
0096 A8F3 brlo L21
0098 .dbline 164
0098 80E6 ldi R24,96
009A 85BF out 0x35,R24
009C .dbline 165
009C 8895 SLEEP
009E .dbline 167
009E L19:
009E .dbline 153
009E EFCF xjmp L18
00A0 X0:
00A0 .dbline -2
00A0 L17:
00A0 .dbline 0 ; func end
00A0 0895 ret
00A2 .dbsym r i 20 c
00A2 .dbend
.area vector(rom, abs)
.org 4
0004 0C945100 jmp _int0pro
.area text(rom, con, rel)
00A2 .dbfile D:\M16开发板实验教程\icc-avr\POWERM~1\power.c
00A2 .dbfunc e int0pro _int0pro fV
.even
00A2 _int0pro::
00A2 0E940000 xcall push_lset
00A6 .dbline -1
00A6 .dbline 173
00A6 ; {
00A6 ; delay_nms(300);
00A6 ; PORTA&=~(1<<LED); //点亮LED
00A6 ; delay_nms(300);
00A6 ; PORTA|=(1<<LED); //熄灭LED
00A6 ; }
00A6 ;
00A6 ;
00A6 ; MCUCR=(1<<SE)|(0<<SM2)|(1<<SM1)|(0<<SM0); //设定为掉电模式
00A6 ; asm("SLEEP"); //进入睡眠状态
00A6 ;
00A6 ; }
00A6 ; }
00A6 ;
00A6 ;
00A6 ; #pragma interrupt_handler int0pro: iv_INT0
00A6 ; void int0pro(void) //外部中断0服务程序 唤醒源
00A6 ; {
00A6 .dbline 174
00A6 ; PORTA&=~(1<<LED); //点亮LED
00A6 D898 cbi 0x1b,0
00A8 .dbline 175
00A8 ; delay_nms(5000);
00A8 08E8 ldi R16,5000
00AA 13E1 ldi R17,19
00AC C4DF xcall _delay_nms
00AE .dbline 176
00AE ; PORTA|=(1<<LED); //熄灭LED
00AE D89A sbi 0x1b,0
00B0 .dbline 177
00B0 ; delay_nms(1000);
00B0 08EE ldi R16,1000
00B2 13E0 ldi R17,3
00B4 C0DF xcall _delay_nms
00B6 .dbline -2
00B6 L25:
00B6 0E940000 xcall pop_lset
00BA .dbline 0 ; func end
00BA 1895 reti
00BC .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -