从PORTB电平变化中断说起
只要电平变化就产生中断,在上升沿和下降沿均产生中断,不能像外部中断那样选择的,只能在软件内部再区分 产生中断也与脉冲宽度有关,因为外部异步中断反映有3到5个指令周期的响应延迟,如果脉冲足够的窄,上升沿捕捉到后还没有响应下降沿也过去了,则下 降沿就捕捉不到;如果脉冲足够的宽,上升沿捕捉到后中断做出反应,并且有时间捕捉到下降沿。最小脉冲宽度是从中断边沿到度PORTB并清除标志的最长时间 中断处理中,要先读取端口值,以便于随之可顺利清除中断标志 当有中断条件产生时,不管相应的中断允许位或 INTCON 寄存器中的全局中断允许位GIE状态如何, 中断标志位都将置1。 原来以为: 使能了中断,中断才有效,才会中断标志置1 现在可能的选择: 中断事件–>中断标志—>知道有中断,再判断要不要发生中断
中断返回
不用asm(“RETI”)返回,用反而出了问题 == 使用ICCAVR、CVAVR、BASCOM-AVR等高级语言编写中断服务程序时,通常不必考虑中断现场保护和恢复的处理,因为编译器在编译中断服务程序的源代码时,会在生成的目标代码中自动加入相应的中断现场保护和恢复的指令。 AVR单片机采用固定的硬件优先级方式,不支持通过软件对中断优先级重新设定 任一中断发生时全局中断使能位I 被清零,从而禁止了所有其他的中断。用户软件可以在中断程序里置位I 来实现中断嵌套。此时所有的中断都可以中断当前的中断服务程序 .MCU响应一个中断后,在进入中断服务前已由硬件自动清零全局中断允许位。因此此时即使有更高优先级的中断请求发生,MCU也会不响应,要等执行到RETI指令,从本次中断返回,并执行了一条指令后,才能继续响应中断。所以,在缺省情况下,AVR的中断不能嵌套。AVR中断的优先级只是在有多个中断同时发生时才起作用,此时MCU将首先响应高优先级的中断。 AVR中断嵌套处理是通过软件方式实现的。如在B中断服务中,如需要MCU能及时的响应A中断(不是等本次中断返回后再响应),B中断的服务程序应这样设计:(1)B中断的现场保护;(2)屏蔽除A以外其它的中断允许标志;(3)用指令SEI开放允许全局中断;(4)B中断服务;(5)用指令CLI禁止全局中断(6)恢复在本中断程序被屏蔽的中断允许标志;(7)B中断现场恢复;(8)B中断返回。 由于AVR的指令执行速度比较高,因此在一般情况下,不建议使用中断嵌套的处理方法。当然,这还需要用户在编写中断处理服务程序中,应遵循中断服务程序尽量要短的原则。 使用CLI 指令来禁止中断时,中断禁止立即生效。没有中断可以在执行CLI 指令后发生,即使它是在执行CLI 指令的同时发生的。下面的例子说明了如何在写EEPROM 时使用这个指令来防止中断发生以避免对EEPROM 内容的可能破坏。 汇编代码例程: in r16, SREG ; 保存SREG cli ; 禁止中断 sbi EECR, EEMWE ; 启动 EEPROM 写操作 sbi EECR, EEWE out SREG, r16 ; 恢复SREG (I 位) C 代码例程 char cSREG; cSREG = SREG; /* 保存SREG */ /* 禁止中断*/ _CLI(); EECR = (1<<EEMWE); /* 启动 EEPROM 写操作*/ EECR = (1<<EEWE); SREG = cSREG; /* 恢复SREG (I 位) */