打印

51单片机中如何处理3个中断:int1,串口,定时0

[复制链接]
4450|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
softerchang|  楼主 | 2013-6-5 15:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dirtwillfly| | 2013-6-5 15:52 | 只看该作者
本帖最后由 dirtwillfly 于 2013-6-5 15:53 编辑

51单片机自己会处理啊
没明白楼主啥意思

使用特权

评论回复
板凳
NE5532| | 2013-6-5 16:04 | 只看该作者
各写各的就可以了啊,楼主是不是想“同时”处理啊,这个除了3个内核之外,没有办法。

使用特权

评论回复
评论
zhangli019 2013-6-7 13:22 回复TA
5532,多核的单片机?介绍几种,让我了解下 
地板
cjseng| | 2013-6-5 22:28 | 只看该作者
本帖最后由 cjseng 于 2013-6-5 22:35 编辑

楼主的问题实在有点高深,在我做过的东西中,有时候也不能完美的解决这个问题,多少还是存在一些缺陷的,所能做的就是尽可能减少缺陷。
这里面麻烦的是中断的优先级,比如,通常我们会把INT1设为最高优先级,用于及时响应外部的中断请求,比如用于测量周期。但是,假如此时有上位机通过串口发送数据过来,INT1过于频繁或者在中断中处理的时间过长,就会导致串口的数据丢失,而此时还有一个定时器中断在等着,我的天哪,一切都乱了!
我采用的方法是:1.尽可能减少各中断处理的时间;2.在必要的时候,临时改变中断优先级,甚至关闭某些中断,这样做需要仔细研究在实际应用中,各中断发生的规律,比如触发一次INT1后,在n毫秒之内不会再触发,那就可以在INT1触发后,执行完必要的处理,立即切换优先级,以及时响应其它中断。有时还可以权衡下,在某个时间段内,可以关闭一些不重要的功能,以确保重要的中断能及时响应。
关键的一点:要测试每段代码的执行时间,对每段代码的执行时间心中有数,尽可能的给单片机留出空闲时间,单片机绝对不要满负荷工作,否则,待处理的中断就会越欠越多,导致有的中断不能正确响应。以发生频率最高的中断作为基准,N个中断的处理时间加起来不能超过频率最高的中断的周期,这样中断基本就不会被错过了。

以上是胡言乱语,随便看看就行,当不得真。

使用特权

评论回复
评论
xlsbz 2013-6-8 20:02 回复TA
确实有些是胡言乱语 
zhangli019 2013-6-7 13:24 回复TA
呵呵,谦虚了,思路很清晰啊,让我等见识了 
5
勿以泪惧| | 2013-6-5 23:46 | 只看该作者
cjseng 发表于 2013-6-5 22:28
楼主的问题实在有点高深,在我做过的东西中,有时候也不能完美的解决这个问题,多少还是存在一些缺陷的,所 ...

好厉害啊~

使用特权

评论回复
6
softerchang|  楼主 | 2013-6-6 08:53 | 只看该作者
抱歉,我没说的清楚. 我的定时中断是1ms,串口是主循环发送,中断接收.而我的int1中断处理的是iic子程序.而iic的数据经过串口发送.每次数据都不正确.

使用特权

评论回复
评论
cjseng 2013-6-9 02:16 回复TA
串口中断优先级最高可能会破坏IIC的读写时序。 
xlsbz 2013-6-8 20:04 回复TA
你串口用啥方式接收?用modbus方式就按我说的弄! 
xlsbz 2013-6-8 20:03 回复TA
串口接收优先级设为高。发送用查询。其余所有中断优先级设为低。 
7
NE5532| | 2013-6-6 09:14 | 只看该作者
多个中断可以同时运行,I2C上运行的是什么任务?主机?从机?读E2?楼主检查程序流程问题,以及是否在时间上存在冲突。

使用特权

评论回复
8
受不了了| | 2013-6-6 11:20 | 只看该作者
串口用中断,每一字节就消耗十来条指令(转换成汇编),如果9600,1毫秒才处理一次,中断级别最低就可以了,根本不会丢数据,主要的判断在主循环里做,比如校验啊,接收数据的处理,发送数据的准备等。IIC如果是读24C02之类速度也是不需要快慢的,只要节奏不乱就没事,主循环里处理好了,定时器如果精度要求不高,也对中断级别没有要求

使用特权

评论回复
9
impenger| | 2013-6-6 11:29 | 只看该作者
cjseng 发表于 2013-6-5 22:28
楼主的问题实在有点高深,在我做过的东西中,有时候也不能完美的解决这个问题,多少还是存在一些缺陷的,所 ...

厉害,我只是用来定时和计数和外部这三个中断都搞的乱七八糟。加个串口。。。oh,my god.

使用特权

评论回复
10
cjseng| | 2013-6-6 12:35 | 只看该作者
softerchang 发表于 2013-6-6 08:53
抱歉,我没说的清楚. 我的定时中断是1ms,串口是主循环发送,中断接收.而我的int1中断处理的是iic子程序.而iic ...

INT1处理IIC?是读还是写?一般来说,写的话耗时比读要长一些,某些情况下会达到10ms左右,处理不好的话就会造成串口接收丢数据。
定时器1毫秒周期会不会和串口接收中断产生竞争?9600波特率发送一个字节的时间也就1毫秒多一点。这两个中断的处理时间分别是多少要测试一下。

使用特权

评论回复
评论
xlsbz 2013-6-8 20:05 回复TA
定时器中断耗时用眼看一下就行。 
11
cjseng| | 2013-6-6 12:43 | 只看该作者
impenger 发表于 2013-6-6 11:29
厉害,我只是用来定时和计数和外部这三个中断都搞的乱七八糟。加个串口。。。oh,my god. ...

假设串口中断采用查询方式,那么程序必须保证每隔小于串口发送一个字节的时间就要查询一次,这样可以保证不丢数据。当然,实际使用中也许是用的中断方式,那就要保证每隔小于串口发送一个字节的时间内,单片机必须有空闲时间,来得及响应串口中断。
采用上述方法之后,我通常还会在接收到第一个字节之后,马上将串口的优先级提到最高,确保后面的数据能够正确接收,直至接收完一帧数据,才将串口优先级恢复正常。这种方法尤其适用于单片机做从机的情况,因为你不知道上位机什么时候会发数据过来。当然,制定一个合适的通讯协议也很重要。

使用特权

评论回复
12
zhangli019| | 2013-6-7 13:33 | 只看该作者
呵呵,见识了,大家各有绝招啊;收益很多啊

使用特权

评论回复
13
softerchang|  楼主 | 2013-6-7 15:16 | 只看该作者
我的iic是先写地址再读16bit的数据,读取的是触摸芯片的数据.

使用特权

评论回复
14
vkic007| | 2013-6-8 14:51 | 只看该作者
中断多了也麻烦的很,有时候都不知道问题出在什么地方

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

327

帖子

2

粉丝