历史上的今天
今天是:2025年02月07日(星期五)
2020年02月07日 | 简述AVR单片机中断
2020-02-07 来源:eefocus
关于AVR中断:
系统在正常运行主程序时,如果突然有一个重要的任务要马上处理,那么系统就要保存现在的工作,然后再去处理这个任务,执行这个重要任务完毕以后再返回原来的主程序继续运行,这就是中断。
主程序一旦进入中断服务程序,那么AVR芯片将自动的关闭全局中断,在这个期间不再执行其它的中断请求,直到中断程序结束以后芯片才自动的重新开放全局中断。(注意,在这个期间某些中断请求可能会被丢弃,某些请求会留下中断请求标致,一旦当前的中断执行完毕,这个有中断标致的请求就有可能马上得到响应,如INT0的下降沿触发就会留下中断请求标致,而低电平触发就不会流下中断请求标致)。如果你想在执行中断服务程序时响应另外一个更重要的中断,那么就要在中断服务程序中加入一条打开全局中断的语句。
使用ICC快速建立中断服务程序 程序文件
使用ICCAVR Application Builder进行如下图所示的设置。 可以设置是否使用中断,上升延,下降延,低电平,任意的逻辑电平变化。

将生成的程序进行修改,DDRA = 0x01;PORTD = 0x0C; ,添加MAIN函数,如下
//ICC-AVR application builder : 2006-12-8 17:04:44
// Target : M16
// Crystal: 7.3728Mhz
#include
#include
unsigned int i=0;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x01;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x0C; //使INT0,INT1对应口上拉电阻有效
DDRD = 0x00; //必须设置INT0,INT1对应口为输入
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
i++; //在中断里进行操作
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
//external interupt on INT1
PORTA = 0x01; //在中断里进行操作
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x08; //INT1 的下降沿产生异步中断请求,INT0上升延
GICR = 0xC0; //INT0和INT1使能
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
init_devices();
while(1) //死循环等待中断
;
}
相关解释
#pragma interrupt_handler int0_isr:2
中断的约定表示方法:int0_isr有一个与之对应的应用程序void int0_isr(void),2为中断向量,值越小,优先级越高,INT0的优先级仅次于复位。
MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用MCU 功能
通用中断控制寄存器- GICR 使能或禁用外部中断请求
使用过程中:为了降低干扰,中断引脚请加上一个4.7K的上拉电阻,还可以根据实际需要,加上电容滤波,防抖动。
上一篇:简述AVR单片机定时器
史海拾趣
|
现在手机中的射频信号通道越来越拥挤。蜂窝电话已经从双频向三频甚至四频快速发展。这些复杂手机还需要处理来自外围无线设备的各种信号,如蓝牙、Wi-Fi和GPS。而随着WiMAX和LTE(4G)的加入,这种复杂度将越来越高。在移动电话中,天线开关控制着天线 ...… 查看全部问答> |
|
我用这个方法,但是好像获取的大小有问题,不知道这个方法是不是正确的方法,还没有更好的办法? DDCAPS ddcaps; ddcaps.dwSize = sizeof DDCAPS; lpdd ...… 查看全部问答> |
|
大型ARM+linux+android嵌入式技术专题公益讲座 华清远见武汉华嵌中心将于2010年4月24日下午1:00-5:00在武汉大学联手ARM中国公司,开展“基于ARM平台的嵌入式系统设计专题讲座”。 详情请点击: http://www.embedhq.org/html/mianfei/2010/0408/382.html… 查看全部问答> |
|
LPCWSTR strDrvName=L\"\"; strDrvName=TEXT(\"NDS0:\"); HANDLE hHandle; hHandle ...… 查看全部问答> |
|
请问有人做过误码仪吗?最近在做一个误码仪,有个问题卡在那边,问题是要我产生误码,之后就是让我检测误码,码型为NRZ,RZ,AMI,HDB3码,关于NRZ,RZ码我就不知道了,这种码还能判断误码?… 查看全部问答> |
|
128M扩到512M,我用的是uboot+NK.nb0,uboot已经改好ram初始化部分,没有开mmu,在uboot下测试512内存读写正常,wince改了config.bib中ram大小,oemtable也改了内存映射,但是现在内核跑到oeminit跑完就死了,不好调试。试着用oemgetextensiondram( ...… 查看全部问答> |
|
渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 详情请参见 www.neworigin.net 同时欢迎大家与我们的609期学员交流!这期学员已与2月11日毕业 ...… 查看全部问答> |
|
【连载】【ALIENTEK MiniSTM32 开发板】STM32不完全手册-内部温度传感器实验(14) 开发板购买地址:http://shop62103354.taobao.com [ 本帖最后由 正点原子 于 2010-9-7 09:45 编辑 ]… 查看全部问答> |
|
今天在看书时发现一点疑惑,问题大致是这样的: 一个电路网络,要对其中一个2输入与门的输出(定义为tmp吧,其实此处并不存在端口或变量)进行一些赋值操作,。在Verilog编程中按说是应该把其定义为wire型变量,可是今天看的一个例子却定义成了reg ...… 查看全部问答> |




