关于定时器、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条回答
yijuanzhi
1楼-- · 2019-07-15 19:54
 精彩回答 2  元偷偷看……
Aidaohuakai
2楼-- · 2019-07-16 00:21
信号控制放在最高优先级,通信放在最低优先级。
确保定时中断里执行时间小于定时时间(小于100us)。
mouxiang
3楼-- · 2019-07-16 01:26
是这样的,100us定时器中我只有一句代码,用来累加系统时间。2ms定时器里面我放了控制信号的代码,而且我测量下来这段代码执行时间为500us以内。如果我在2ms定时器里只做标志然后在main中执行代码的话,会被通信代码拖延比较长的时间。因为我的通信代码耗时可能达到8ms。我的这个通信是这样的,对于MCU来说,其上位机发送指令,MCU接到指令后发下位机查询一些值,然后再将查询到的值返回给上位机,这个过程在main中是一个循环,只有完成这个循环才能去执行其他的main中的代码。通信中断UART0和UART1中也是只有少量代码,主要工作是放在main中的。
我用TIMERA1做100us定时器,这应该是优先级最高的。我用TIMERA0做2ms定时器,其优先级低于TIMERA0,但高于UART优先级。不存在其他中断了。
Aidaohuakai
4楼-- · 2019-07-16 03:39
各个中断里执行时间应该小于各个中断里执行时间最短的那个,这里500us显然已经远远超过100us了。原因就在这里,不过这也要看单片机的嵌套深度,但是只要确保不论是哪个定时器里执行时间都小于100us,就没有嵌套深度这问题了
mouxiang
5楼-- · 2019-07-16 04:32
感谢LS两位朋友的回答。我忘了说一点,之前为了避免出现2ms定时器打断100us定时器的问题,我已经在2ms定时器中开总中断了,也就是说我即使进入了2ms定时器中断,也能响应100us定时器的中断。为了验证这一点,我分别在100us定时器和2ms定时器中操作MCU的2个输出口进行翻转,用示波器观察其波形,如果我在进入2ms定时器时不打开总中断,则100us定时器中操作的那个输出口在示波器上能看到偶尔不翻转的现象;如果打开了总中断,那么100us定时器中操作的输出口波形就是一个十分标准的方波。而我在进入100us定时器时是不会打开总中断的。也就是说,对于100us定时器来说,没有其他中断能够阻止MCU对其响应,它就是最高优先的。对于2ms定时来说,它可能会被100us定时器打断,但这个过程很短,代码也能够在2ms内执行完。
friend0720
6楼-- · 2019-07-16 07:49
 精彩回答 2  元偷偷看……

一周热门 更多>