一、程序目的
按一下启动,程序进入第一步。延时五秒之后进入第二步进行自加1,然后回到第一步继续延时5秒循环,依次类推。
二、出现的问题
第一次程序进入第一步时,定时器正常定时,计数正常加1,但从第二轮开始,定时器就没有复位清零了,ADD在不断自加,1/2两步程序一直导通,定时器未正常工作。
三、分析原因
第一次定时前,定时器IN引脚状态为"FALSE",当程序进入第1步时,IN引脚状态变为"TRUE",定时器正常工作,程序跳第2步,ADD正常自加1,然后步序又赋为1,程序在下一个扫描周期跳转至第1步。
此时IN引脚的状态又为"TRUE",那么对于定时器来讲,前一个周期和这个周期,IN引脚状态没有发生变化,均为"TRUE",所以定时器不会复位清零,也就是直接导通了。
通过抓取波形也能看到,定时器的IN引脚从0变为1之后就再无变化了,因此这便是导致定时器失效,程序跑飞的根源所在。
四、解决方法
核心:想办法能够让程序多扫描一个周期,这样对于定时器IN引脚来讲就有了沿信号的变化,就可以实现效果了。
方法一
在ADD的这一步加延时,保证程序能够至少多刷一个周期!(一个周期不一定是1ms,目前会比1ms小)
这样子TON的IN引脚就会有一个扫描周期的"FALSE"状态,下一个扫描周期又会导通变为"TRUE" ,定时器的触发引脚有变化,那么就可以正常定时了。
方法二
利用步序缓存的方法,保证每次步序的变化都在程序最开始执行,这样就能让程序每次都要循环一遍才能更新步序。
方法三
利用倒序写程序,注意需要在最开始多加一部赋值程序,保证循环执行,这样也可以让程序每次都循环完毕才更新步序。
方法四
利用步序和步序缓存作比较,在程序最下方将步序赋值给步序缓存。
通过以上四种办法,均可以解决扫描周期带来的步序混乱问题!