// Place your code here if(count-- <= 0) count = 9; }
新建项目实现实验内容2
硬件连接不变(如图6-2)。
关于MCU睡眠模式:
睡眠模式可以使应用程序关闭 MCU 中没有使用的模块,从而降低功耗。 AVR 具有不同的睡眠模式,允许用户根据自己的应用要求实施剪裁。进入睡眠模式的条件是置位寄存器 MCUCR 的 SE,然后执行 SLEEP 指令。具体哪一种模式(空闲模式、ADC噪声抑制模式、掉电模式、省电模式、Standby模式和扩展Standby模式 ) 由 MCUCR 的 SM2、SM1 和 SM0 决定(具体参考数据手册——电源管理及睡眠模式)。使能的中断可以将进入睡眠模式的 MCU 唤醒。经过启动时间,外加 4 个时钟周期后,MCU 就可以运行中断例程了。然后返回到 SLEEP 的下一条指令。唤醒时不会改变寄存器文件和 SRAM 的内容。如果在睡眠过程中发生了复位,则 MCU 唤醒后从中断向量开始执行。
CVAVR为我们提供了头文件sleep.h,供我配置不同的睡眠模式: void sleep_enable(void) 该函数使能MCU进入睡眠模式。 void sleep_disable(void) 该函数禁止MCU进入睡眠模式。 void idle(void) 该函数使MCU进入空闲模式。 void powerdown(void) 该函数使MCU进入掉电模式。 void powersave(void) 该函数使MCU进入节电模式。 void standby(void) 该函数使MCU进入Standby模式。
void extended_standby(void) 该函数使MCU进入扩展Standby模式。
例如本例中我们配置MCU进入掉电模式:
#include
我们利用INT0低电平中断来唤醒MCU。 配置如下:
// External Interrupt(s) initialization // INT0: On
// INT0 Mode: Low level // INT1: Off // INT2: Off GICR|=0x40;
37
MCUCR=0x00; MCUCSR=0x00; GIFR=0x40;
中断服务函数:
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void) {
// Place your code here
PORTA = 0xFF; //数码管全亮
delay_ms(5000); //延时5s后转入进入休眠下一条指令 }
主函数部分:
signed char i;
for(i = 0;i <= 9;++i) {
PORTA = led_7[i]; delay_ms(250); }
sleep_enable(); powerdown(); for(i = 9;i >= 0;--i) {
PORTA = led_7[i]; delay_ms(250); }
编译无误后,下载到单片机中。观察实验现象:数码管先从0——9,进入掉电模式,按下按键KEY1后,转而运行中断服务函数,数码管全亮5s,后转达进入掉电模式的下一条指令,即数码管从9——0。
五、实验现象
实验内容1:与实验5.1的现象相同,数码管示数按K1加一,按K2减一
实验内容2:
38
六、思考题
(1)结合微机原理所学知识解释一下中断源、中断信号和中断向量。 中断源就是引起中断的源,是可以配置的,比如当收到某个信号时想要产生一个中断,那么收到的信号就是一个中断源。ATmega16共有21个中断源,包含1个非屏蔽中断(RESER,不能通过软件关闭)、3个外部中断(INT0、INT1、INT2)和17个内部中断。由中断源向MCU所发出的申请中断信号称为中断请求信号。
中断向量是指中断服务程序的入口地址。在某些计算机中,中断向量的位置存放一条跳转到中断服务程序入口地址的跳转指令。不同的中断在Flash空间地址中存放的位置为中断向量
(2)总结AVR单片机外部中断的使用方法。
(1)配置各相关寄存器对中断所要使用的属性进行设置,如上升沿或下降沿触发等。
(2)打开全局中断使能。可以使用asm(”sei”)或给器SREG中的I标志位“SREG.7”写1
(3)打开局部中断,即对应的外部中断使能
(4)编写中断响应函数。在CVAVR中,中断服务程序必须定义成一个特殊的函数,称为中断服务函数。中断服务函数按以下格式定义:
interrupt [中断向量号] void 函数名 (void) { ?? //函数体 }
其中,关键字interrupt声明了该函数为中断服务函数,用以区别于一般软件调用的函数。其中EXT_INT0是在头文件mega16.h中定义的宏,等同于数字2。
由于CVAVR在编译过程中,会自动帮助用户产生正确的中断向量处的以及初始化堆栈指针的代码,同时在中断服务程序中自动生成中断现场保护和恢复以
39
及使用RETI指令返回,因此,按照CVAVR的规范编写中断服务函数还是比较方便的。
只要正确定义了中断函数,编译器便能够生成可以保证相应的中断发生时,该函数被自动调用,以及完成了中断现场保护和恢复工作的AVR汇编代码,用户只需按照一般的函数编写方法设计函数体即可。
(3)总结ATmega16睡眠模式的不同点及唤醒方式。
睡眠模式可以使应用程序关闭 MCU 中没有使用的模块,从而降低功耗。 AVR 具有不同的睡眠模式,允许用户根据自己的应用要求实施剪裁。进入睡眠模式的条件是置位寄存器 MCUCR 的 SE,然后执行 SLEEP 指令。具体哪一种模式(空闲模式、ADC噪声抑制模式、掉电模式、省电模式、Standby模式和扩展Standby模式 ) 由 MCUCR 的 SM2、SM1 和 SM0 决定(具体参考数据手册——电源管理及睡眠模式)。使能的中断可以将进入睡眠模式的 MCU 唤醒。经过启动时间,外加 4 个时钟周期后,MCU 就可以运行中断例程了。然后返回到 SLEEP 的下一条指令。唤醒时不会改变寄存器文件和 SRAM 的内容。如果在睡眠过程中发生了复位,则 MCU 唤醒后从中断向量开始执行。
CVAVR为我们提供了头文件sleep.h,供我配置不同的睡眠模式: void sleep_enable(void) 该函数使能MCU进入睡眠模式。 void sleep_disable(void) 该函数禁止MCU进入睡眠模式。 void idle(void) 该函数使MCU进入空闲模式。 void powerdown(void) 该函数使MCU进入掉电模式。 void powersave(void) 该函数使MCU进入节电模式。 void standby(void) 该函数使MCU进入Standby模式。
void extended_standby(void) 该函数使MCU进入扩展Standby模式。 (4)把实验内容2的程序中signed char i;改为unsigned char i;其它内容不变,重新编译整个项目,下载并观察实验现象,并分析原因。(程序跑飞)
下载之后按键无效化,由于程序跑飞而导致的单片机死机。
七、遇到的问题及解决方法
做实验六时没有遇到什么问题
40
八、心得体会
本次实验中我学习了外部中断的使用。外部中断是有外部事件触发的中断,在单片机开发中应用很广泛。在实验中我通过实现使用外部中断实现的按键功能,对外部中断有了基本的认识。学会了在单片机里配置相应的寄存器,使单片机工作在不同的状态。同时在实验中我实现了另一部分为外部中断唤醒CPU实验,使用外部中断0唤醒掉电模式下的CPU。在代码段中加入sleep.h头文件,以实现中断及唤醒功能。将实验代码下载入单片机观察实验现象为,数码管先从0——9,进入掉电模式,按下按键KEY1后,转而运行中断服务函数,数码管全亮5s,后转达进入掉电模式的下一条指令,即数码管从9——0。
通过本实验,我学习了怎样使用AVR的外部中断,以及AVR的睡眠功能。这两个功能在单片机的开发工程中有很多的应用,是非常使用的操作。
41