我做的项目是用在生产线上的检测设备的,简单地说就是当发现一个产品不合格后发出信号控制继电器操作排除机构将不合格产品剔除掉。有些生产线的速度会很高,这就要求我的控制信号要精确,否则排除机构就没办法可靠地将产品剔除,因为如果控制信号延迟或超前10ms发出,反映到产线上就可能会有几公分的距离差异。按照以前的经验,我用一个定时器做定时中断,中断周期100us,然后用这个100us在main中做一个2ms的计时器,我将排除机构的控制信号输出操作放在main中的这个2ms周期里执行。但实际上,我的MCU还会和两个外设做
通信,就是说MCU既做上位机又做下位机,通信耗时约8ms,也是在main中执行,这就让我的2ms周期没有意义了。因此,我的做法是另外再用一个定时器直接做2ms中断(优先级低于100us定时器),在定时器中执行排除机构的控制代码。
这个做法之前没有出什么问题。后来由于项目需要另外画了一块板子,通信方式有一些变化,原来是RS485的四线制通信,现在改成RS485的两线制通信,这样在SCI中断中增加了方向控制的代码。结果这一版
电路出来后,原来的代码放上去跑一段时间就可能会发生MCU复位。我将2ms定时器中的一些代码放到了main中,结果复位现象就不会发生了。因此,我怀疑是否是我的这种程序结构有一些问题。
请各位有类似经验的朋友不吝赐教!
确保定时中断里执行时间小于定时时间(小于100us)。
我用TIMERA1做100us定时器,这应该是优先级最高的。我用TIMERA0做2ms定时器,其优先级低于TIMERA0,但高于UART优先级。不存在其他中断了。
一周热门 更多>