chenxiaochong 发表于 2019-10-21 09:59:15

inout引脚影响中断执行结果 丢中断

本帖最后由 chenxiaochong 于 2019-10-21 10:13 编辑

在中断程序里操作某个子程序的inout引脚的寄存器时,经常发生操作失败的情况(经常被误认为丢中断);实际上根本原因是inout引脚的原理导致的:
inout引脚的原理:
步骤1.扫描进入子程序时,将inout引脚的寄存器赋值到 L 区,
步骤2.执行子程序
步骤3.从子程序退出时,将 L 区的值 赋值给 inout引脚的寄存器

如果中断在步骤2处触发,在中断中改变了 inout引脚的寄存器,
举例:
子程序FC0 有一个inout引脚 L区地址 L0.0 ,主程序调用FC0时,分配地址M0.0给此inout引脚
启动20ms定时中断,并在中断中置位M0.0


   

程序如图,按照正常理解,VW0和 VW2应该一起增计数,两个寄存器数值应该相同
实际执行结果:




结果显示: VW2 > vw0 并且差距越来越大

分析:
步骤1.扫描进入子程序时,将inout引脚的寄存器赋值到 L 区,   M0.0=0 ---> L0.0 =0
步骤2.执行子程序   在步骤2的时候中断触发,中断中 M0.0=1 ;但 L0.0 仍然=0(只有在步骤1时才会从外部传参数进L区)      因L0.0 =0 VW0不加1,
步骤3.从子程序退出时,将 L 区的值 赋值给 inout引脚的寄存器   因 L0.0=0; 故 M0.0 = L0.0 =0 ;(此次中断置位的M0.0被丢弃 执行失败)

解决办法: 不要在中断中直接操作任何FC块的inout引脚,在中断中操作一个中间变量,在主程序中,用中间变量给inout引脚赋值;
此例中,程序改动如下:


执行结果如下:



中断计数和FC0计数完全一致,已经解决上述问题;




页: [1]
查看完整版本: inout引脚影响中断执行结果 丢中断