第7章中断系统导论.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 中断相关的概念-AVR外部中断 工作模式 低电平触发模式 电平变化触发模式 下降沿触发模式 上升沿触发模式 中断相关的概念-AVR外部中断 低电平触发是不带中断标志类型的,即只要中断输入引脚PD2或PD3保持低电平,那么将一直会产生中断申请 MCU对INT0和INT1的引脚上的上升沿或下降沿变化的识别(触发),需要I/O时钟信号的存在(由I/O时钟同步检测),属于同步边沿触发的中断类型。 MCU对INT2的引脚上的上升沿或下降沿变化的识别(触发),以及低电平的识别(触发)是通过异步方式检测的,不需要I/O时钟信号的存在。因此,这类触发类型的中断经常作为外部唤醒源,用于将处在Idle休眠模式,以及处在各种其它休眠模式的MCU唤醒。这是由于除了在空闲(Idel)模式时,I/O时钟信号还保持继续工作,在其它各种休眠模式下,I/O时钟信号均是处在暂停状态的。 * 如果使用低电平触发方式的中断作为唤醒源,将MCU从掉电模式(Power-down)中唤醒时,电平拉低后仍需要维持一段时间才能将MCU唤醒,这是为了提高了MCU的抗噪性能。拉低的触发电平将由看门狗的时钟信号采样两次(在通常的5V电源和25℃时,看门狗的时钟周期为1μs)。如果电平拉低保持2次采样周期的时间,或者一直保持到MCU启动延时(start-up time)过程之后,MCU将被唤醒并进入中断服务。如果该电平的保持时间能够满足看门狗时钟的两次采样,但在启动延时(start-up time)过程完成之前就消失了,那么MCU仍将被唤醒,但不会触发中断进入中断服务程序。所以,为了保证既能将MCU唤醒,又能触发中断,中断触发电平必须维持足够长的时间。 * 如果设置了允许响应外部中断的请求,那么即便是引脚PD2、PD3、PB2设置为输出方式工作,引脚上的电平变化也会产生外部中断触发请求。这一特性为用户提供了使用软件产生中断的途径。 * * AVR外部中断-方式选择 MCU 控制寄存器— INT0、INT1 ISCx1 ISCx0 说明 0 0 INTx 为低电平时产生中断请求 0 1 INTx引脚上任意的逻辑电平变化都将引发中断 1 0 INTx 的下降沿产生异步中断请求 1 1 INTx 的上升沿产生异步中断请求 MCU对INT0、INT1引脚上电平值的采样在边沿检测前。如果选择脉冲边沿触发或电平变化中断的方式,那么在INT0、INT1引脚上的一个脉宽大于一个时钟周期的脉冲变化将触发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发中断,那么低电平必须保持到当前指令执行完成才触发中断。如果是低电平触发方式的话,中断请求将一直保持到引脚上的低电平消失为止。 * * AVR外部中断-方式选择 MCU 控制与状态寄存器—INT2 ISC2 说明 0 INT2下降沿产生中断请求 1 INT2上升沿产生中断请求 * AVR外部中断-方式选择 INT0、INT1若工作在边沿触发模式,要求IO时钟工作 INT0、INT1若工作在低电平触发模式,只要外部低电平存在,就一直处于触发状态 INT2是异步边沿触发,不要求IO时钟,但脉冲最小宽度不能小于50nS * AVR外部中断-中断使能 外部中断控制——通用中断控制寄存器 GICR的INTx置位为允许INTx中断 GICR的INTx清零为禁止INTx中断 * AVR外部中断-中断请求标志位 外部中断产生时,硬件自动置位对应的中断请求标志位 中断响应时,硬件自动清除中断请求标志位 中断请求标志位可以通过软件写“1”实现清零 通用中断标志寄存器- GIFR * #include mega16.h flash char led_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; char counter; // INT0中断服务程序 interrupt [EXT_INT0] void ext_int0_isr(void) { if (++counter=16) counter = 0; } // INT1中断服务程序 interrupt [EXT_INT1] void ext_int1_isr(void) { if (counter) --counter; else counter = 15; } * void main(void) { PORTA=0xFF; DDRA=0xFF; GICR|=0xC0; // 允许INT0、INT1中断 MCUCR=0x0A; // INT0、INT1下降沿触发 GIFR=0xC0; // 清除

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档