📄 power.lis
字号:
.module power.c
.area text(rom, con, rel)
0000 .dbfile D:\M16开发板实验教程\icc-avr\POWERM~1/delay.h
0000 .dbfunc e delay_1us _delay_1us fV
.even
0000 _delay_1us::
0000 .dbline -1
0000 .dbline 10
0000 ; /*
0000 ; Title: icc-avr power management
0000 ; Author: dushibiao
0000 ; Date: 2007 10 22
0000 ; Purpose: study how to magage power
0000 ; Frequency: Ext 8M
0000 ; Software: icc-avr to compile
0000 ; Hardware: AVR mega16 BOARD
0000 ; Connect: dushibiao@126.com
0000 ; */
0000 .dbline 11
0000 ; /*
0000 0000 nop
0002 .dbline -2
0002 L1:
0002 .dbline 0 ; func end
0002 0895 ret
0004 .dbend
0004 .dbfunc e delay_nus _delay_nus fV
0004 ; i -> R20,R21
0004 ; n -> R22,R23
.even
0004 _delay_nus::
0004 0E940000 xcall push_gset2
0008 B801 movw R22,R16
000A .dbline -1
000A .dbline 15
000A ; 本程序简单的示范了如何令AVR ATMEGA16进入睡眠状态及唤醒
000A ; 电源管理及睡眠模式的介绍
000A ; 进入最低耗电的掉电模式
000A ; 关闭各种模块
000A .dbline 16
000A ; 外部中断唤醒
000A 4427 clr R20
000C 5527 clr R21
000E .dbline 17
000E ;
000E 03C0 xjmp L6
0010 L3:
0010 .dbline 18
0010 F7DF xcall _delay_1us
0012 L4:
0012 .dbline 17
0012 4F5F subi R20,255 ; offset = 1
0014 5F4F sbci R21,255
0016 L6:
0016 .dbline 17
0016 4617 cp R20,R22
0018 5707 cpc R21,R23
001A D0F3 brlo L3
001C .dbline -2
001C L2:
001C 0E940000 xcall pop_gset2
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym r i 20 i
0022 .dbsym r n 22 i
0022 .dbend
0022 .dbfunc e delay_1ms _delay_1ms fV
0022 ; i -> R16,R17
.even
0022 _delay_1ms::
0022 .dbline -1
0022 .dbline 22
0022 ; M16掉电模式的耗电情况(看门狗关闭),时钟为内部RC 1MHz
0022 ; 0.9uA@Vcc=5.0V [手册的图表约为1.1uA]
0022 ; 0.3uA@Vcc=3.3V [手册的图表约为0.4uA]
0022 ; //测量的数字万用表是FLUKE 15B,分辨率0.1uA
0022 ;
0022 .dbline 24
0022 0027 clr R16
0024 1127 clr R17
0026 02C0 xjmp L11
0028 L8:
0028 .dbline 24
0028 L9:
0028 .dbline 24
0028 0F5F subi R16,255 ; offset = 1
002A 1F4F sbci R17,255
002C L11:
002C .dbline 24
002C ; 这个程序需要MCU进入休眠状态,为实现最低功耗,JTAG接口会被关闭,只能通过LED的变化来观察程序的运行。
002C ; 这个实验里面,用STK500(AVRISP) ISP下载线来烧录更方便。
002C 0437 cpi R16,116
002E E4E0 ldi R30,4
0030 1E07 cpc R17,R30
0032 D0F3 brlo L8
0034 .dbline -2
0034 L7:
0034 .dbline 0 ; func end
0034 0895 ret
0036 .dbsym r i 16 i
0036 .dbend
0036 .dbfunc e delay_nms _delay_nms fV
0036 ; i -> R20,R21
0036 ; n -> R22,R23
.even
0036 _delay_nms::
0036 0E940000 xcall push_gset2
003A B801 movw R22,R16
003C .dbline -1
003C .dbline 28
003C ;
003C ; 熔丝位设置
003C ; 1 关断BOD功能 BODEN=1
003C ; 2 如果用ISP方式烧录,就可以完全关闭JTAG口了 OCEEN=1,JTAGEN=1
003C .dbline 29
003C ;
003C 4427 clr R20
003E 5527 clr R21
0040 .dbline 30
0040 ; */
0040 03C0 xjmp L16
0042 L13:
0042 .dbline 31
0042 EFDF xcall _delay_1ms
0044 L14:
0044 .dbline 30
0044 4F5F subi R20,255 ; offset = 1
0046 5F4F sbci R21,255
0048 L16:
0048 .dbline 30
0048 4617 cp R20,R22
004A 5707 cpc R21,R23
004C D0F3 brlo L13
004E .dbline -2
004E L12:
004E 0E940000 xcall pop_gset2
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbsym r i 20 i
0054 .dbsym r n 22 i
0054 .dbend
0054 .dbfile D:\M16开发板实验教程\icc-avr\POWERM~1\power.c
0054 .dbfunc e main _main fI
0054 ; i -> R20
.even
0054 _main::
0054 .dbline -1
0054 .dbline 41
0054 ;
0054 ; #include<iom16v.h>
0054 ; #include <macros.h>
0054 ; #include "delay.h"
0054 ;
0054 ; //管脚定义
0054 ; #define LED 0 //PA0 驱动LED,低电平有效
0054 ; #define KEY_INT0 2 //PB2 按键, 低电平有效
0054 ;
0054 ; int main(void)
0054 ; {
0054 .dbline 44
0054 ; unsigned char i;
0054 ; //上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
0054 ; PORTB=0xFF; //不用的管脚使能内部上拉电阻。
0054 8FEF ldi R24,255
0056 88BB out 0x18,R24
0058 .dbline 45
0058 ; PORTC=0xFF;
0058 85BB out 0x15,R24
005A .dbline 46
005A ; PORTD=0xFF;
005A 82BB out 0x12,R24
005C .dbline 48
005C ;
005C ; PORTA=0xFF;
005C 8BBB out 0x1b,R24
005E .dbline 49
005E ; DDRA =(1<<LED); //PB0设为输出高电平,灯灭
005E 81E0 ldi R24,1
0060 8ABB out 0x1a,R24
0062 .dbline 71
0062 ; /*
0062 ; 端口引脚
0062 ; 进入休眠模式时,所有的端口引脚都应该配置为只消耗最小的功耗。
0062 ; 最重要的是避免驱动电阻性负载。
0062 ; 在休眠模式下I/O 时钟clkI/O 和ADC 时钟clkADC 都被停止了,输入缓冲器也禁止了,从而保证输入电路不会消耗电流。
0062 ; 在某些情况下输入逻辑是使能的,用来检测唤醒条件。用于此功能的具体引脚请参见“ 数字输入使能和休眠模式” 。
0062 ; 如果输入缓冲器是使能的,此时输入不能悬空,信号电平也不应该接近VCC/2,否则输入缓冲器会消耗额外的电流。
0062 ;
0062 ; IO作输出(DDR=1)时,维持状态不变
0062 ; */
0062 ;
0062 ; /*
0062 ; 看门狗定时器(上电默认是关闭的)
0062 ; 如果系统无需利用看门狗,这个模块也可以关闭。
0062 ; 若使能,则在任何休眠模式下都持续工作,从而消耗电流。
0062 ; 在深层次的睡眠模式下,这个电流将占总电流的很大比重。
0062 ;
0062 ; 假设看门狗定时器使能了,关闭程式如下
0062 ; 1. 在同一个指令内对WDTOE 和WDE 写"1“,即使WDE 已经为"1“
0062 ; 2. 在紧接的4 个时钟周期之内对WDE 写"0”
0062 ; */
0062 ; WDTCR=(1<<WDTOE)|(1<<WDE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -