关于定时器、SCI中断的程序结构的问题

2019-07-15 16:19发布

我做的项目是用在生产线上的检测设备的,简单地说就是当发现一个产品不合格后发出信号控制继电器操作排除机构将不合格产品剔除掉。有些生产线的速度会很高,这就要求我的控制信号要精确,否则排除机构就没办法可靠地将产品剔除,因为如果控制信号延迟或超前10ms发出,反映到产线上就可能会有几公分的距离差异。按照以前的经验,我用一个定时器做定时中断,中断周期100us,然后用这个100us在main中做一个2ms的计时器,我将排除机构的控制信号输出操作放在main中的这个2ms周期里执行。但实际上,我的MCU还会和两个外设做通信,就是说MCU既做上位机又做下位机,通信耗时约8ms,也是在main中执行,这就让我的2ms周期没有意义了。因此,我的做法是另外再用一个定时器直接做2ms中断(优先级低于100us定时器),在定时器中执行排除机构的控制代码。
这个做法之前没有出什么问题。后来由于项目需要另外画了一块板子,通信方式有一些变化,原来是RS485的四线制通信,现在改成RS485的两线制通信,这样在SCI中断中增加了方向控制的代码。结果这一版电路出来后,原来的代码放上去跑一段时间就可能会发生MCU复位。我将2ms定时器中的一些代码放到了main中,结果复位现象就不会发生了。因此,我怀疑是否是我的这种程序结构有一些问题。
请各位有类似经验的朋友不吝赐教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
mouxiang
2019-07-16 01:26
是这样的,100us定时器中我只有一句代码,用来累加系统时间。2ms定时器里面我放了控制信号的代码,而且我测量下来这段代码执行时间为500us以内。如果我在2ms定时器里只做标志然后在main中执行代码的话,会被通信代码拖延比较长的时间。因为我的通信代码耗时可能达到8ms。我的这个通信是这样的,对于MCU来说,其上位机发送指令,MCU接到指令后发下位机查询一些值,然后再将查询到的值返回给上位机,这个过程在main中是一个循环,只有完成这个循环才能去执行其他的main中的代码。通信中断UART0和UART1中也是只有少量代码,主要工作是放在main中的。
我用TIMERA1做100us定时器,这应该是优先级最高的。我用TIMERA0做2ms定时器,其优先级低于TIMERA0,但高于UART优先级。不存在其他中断了。

一周热门 更多>