微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR单片机入门教程之三---中断

AVR单片机入门教程之三---中断

时间:11-23 来源:互联网 点击:
首先说一下中断的优点:中断函数只在中断触发源触发的时候才会执行,其他时间不执行. 如果不使用中断而且如果要根据某个端口的变化而作相应的函数操作,就必须不断地查询端口的信号,而中断不用,只要端口一有变化,就会系统就会自动进入中断函数, 我觉得这就是中断的目的,也是优点.

然后说一下中断的使用,要使用AVR的外部中断,要先进行中断初始设置(触发电平上升沿和下降沿的设定),然后开全局中断,这样在触发中断管脚的时候就会进入中断处理函数.无论导致引脚电平变化的原因是来自单片机内部还是外部,只要引脚上的电平发生了变化都可以触发该引脚上的电平变化中断.

AVR单片机,其硬件系统不支持自动实现中断嵌套的处理。如果在系统设计中,必须使用中断嵌套处理,则需要由用户编写相应的程序,通过软件设置来实现中断嵌套的功能。

如果在初始化中开了总中断 那么AVR在进去中断处理函数后会自动把总中断给关了中断出来后就会重新开中断 所以如果不用在中断里面嵌套另一个中断 就不用在中断服务程序里面开总中断使能。。。

AVR单片机的中断优先级只在同时触发中断时优先级高的中断先进行处理,而对于51单片机中低级别的中断不能打断高级别的中断,在AVR单片机中低级别的中断却可以打断高级别的中断,这是很不一样的,下面用一个例子来说明一下:

//T0溢出中断服务程序
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0xB4;
SEI();
dlygd(0,0);
dlygd(0,0);
}

//T2溢出中断服务程序
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
TCNT2 = 0xA0;
SEI();
saomiao();
}

对于以上两个时间溢出中断函数我在中断程序里面都用了SEI();由于开了总中断,那么在中断执行过程中,只要有其他中断触发,系统同样会进入另外的中断处理函数.

用JTAG调试了一下 发现只要TCNT0一溢出 就触发TIMER0的中断 在中断的过程中只要TCNT2一溢出 就触发了TIMER2的中断 这样子级别高的中断打断低的中断是没什么问题啊 但是在TCNT0再次溢出时 还是会触发TIMER0的中断 这就很奇怪了 难道中断级别低的中断可以中断级别高的中断吗??? 这就对了 在AVR单片机中,低级别的中断是可以打断高级别的中断的,只要总中断开着.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top