一、 实验目的:
1、了解外部中断的库函数;
2、熟悉外部中断的特性;
3、掌握外部中断的使用。
二、实验仪器:ATmage16实验板 一块
PC机 一台
三、实验原理:
外部中断通过引脚INT0 与INT1 或PCINT23..0 触发。只要使能了中断,即使引脚INT0与INT1 或PCINT23..0 配置为输出,只要电平发生了合适的变化,中断也会触发。这个特点可以用来产生软件中断。 只要使能, PCINT23..16 引脚上的电平变化将触发外部中断PCI2, PCINT14..8 引脚上的电平变化将触发外部中断PCI1, PCINT7..0 将触发外部中断PCI0。PCMSK2、PCMSK1 与PCMSK0 寄存器则用来检测是哪个引脚上的电平发生了变化。PCINT23..0 外部中断的检测是异步的。也就是说,和其他中断方式一样,这些中断也可以用来将器件从休眠模式唤醒。INT0 与INT1 中断可以由下降沿、上升沿,或者是低电平触发。具体由外部中断控制寄存器A – EICRA 的设置来确定。当INT0 或INT1 中断使能且设定为电平触发时,只要引脚电平被拉低,中断就会产生。若要求INT0 或INT1 在信号下降沿或上升沿触发中断,则I/O时钟必须工作(请参见P 23 ” 时钟系统及其分布” 了解更多信息)。INT0与INT1 的低电平中断检测是异步的。也就是说它可以用来将器件从休眠模式唤醒。在休眠过程( 除了空闲
模式) 中I/O 时钟是停止的。通过电平中断将MCU 从掉电模式唤醒时,要保证低电平保持一定的时间以使MCU 完成唤醒过程并触发中断。如果触发电平在启动时间结束前就消失, MCU 将被唤醒,但中断不会被触发。启动时间由熔丝位SUT 与CKSEL 决定。详见 P 23 ” 系统时钟及其选项” 。
外部中断控制寄存器MCUCR 外部中断控制寄存器 A 包括决定中断触发方式的控制位。
五 实验步骤及内容:
输入程序:本程序一开始是IO口中的A口以流水灯工作,一旦有外部中断请求,就是B口以流水灯工作,循环一次后回到被中断处继续运行。
程序如下:
#include <iom16v.h>
#include <macros.h>
//*******************延时 us
void delay_us(int t)
{
do
t--;
while(t>1);
}
//*******************延时 ms
void delay_ms(unsigned int t)
{
while(t!=0)
{
delay_us(1142);
t--;}
}
#pragma interrupt_handler INT_0:2 //外部中断0执行函数
void INT_0 (void)
{
PORTC=0XFF;
PORTB=~0X01;
delay_ms(1000);
PORTB=~0X02;
delay_ms(1000);
PORTB=~0X04;
delay_ms(1000);
PORTB=~0X08;
delay_ms(1000);
PORTB=~0X10;
delay_ms(1000);
PORTB=~0X20;
delay_ms(1000);
PORTB=~0X40;
delay_ms(1000);
PORTB=~0X80;
delay_ms(1000);
PORTB=0XFF;
}
void main(void)
{
DDRA = 0xff; /*输出 */
DDRB = 0xff; /*输出 */
DDRC = 0xff; /*输出*/
DDRD = 0xff; /*输出*/
PORTA=0XFF;
PORTB=0XFF;
PORTC=0XFF;
PORTD=0XFF;
MCUCR=0X02; //定义外部中断INT0为下降沿产生中断请求
GICR=0X40; //中断屏蔽寄存器开INT0
SEI(); //******开全局中断
for (;;)
{
PORTA=~0X01;
delay_ms(1000);
PORTA=~0X02;
delay_ms(1000);
PORTA=~0X04;
delay_ms(1000);
PORTA=~0X08;
delay_ms(1000);
PORTA=~0X10;
delay_ms(1000);
PORTA=~0X20;
delay_ms(1000);
PORTA=~0X40;
delay_ms(1000);
PORTA=~0X80;
delay_ms(1000);
}
}