发新帖我要提问
12
返回列表
打印

有点小闷,出个题,有兴趣的可以看看(添加了实际意义)

[复制链接]
楼主: 渤海三叠浪
手机看帖
扫描二维码
随时随地手机跟帖
21
xmar| | 2012-9-18 17:47 | 只看该作者 回帖奖励 |倒序浏览
20# zhm8508 呵呵,错在哪里?

使用特权

评论回复
22
zhm8508| | 2012-9-18 18:03 | 只看该作者
21# xmar 闪烁间隔10ms,误差2ms,所以我说LZ坑爹。

使用特权

评论回复
23
lelee007| | 2012-9-18 19:53 | 只看该作者
这也谈得上调度?10ms拍的时间轮,准确无误轻松搞定

使用特权

评论回复
24
forrest11| | 2012-9-19 11:31 | 只看该作者
本帖最后由 forrest11 于 2012-9-20 20:30 编辑

1. 如果要求是闪烁必须处理,可以延后,类似消息排队处理时,还是比较方便的,方法如下:
用10ms的时间片,每过10ms,各灯计数变量的计时加1,并判断各计数变量值是否等于或超过对应阈值。如果超过,则设置灯的闪烁标志位,然后逐位检测各标志位。标志位如果为1,则闪烁对应灯一下,同时将该灯的标志位置零,计数变量置零。问题即可解决。

2.  和1相比,多了一个按键,由于要求按键后50ms内闪烁,也是比较好处理的。只要将时间片设为1ms即可(如果粗糙点,10ms的时间片应该也是可以的),未按键时的处理和1相同,如果某灯按键按下,则读此按键对应计数变量是否超过50。如果超过,则直接设置灯的闪烁标志位;如果没有超过,则设置此按键对应灯的计数阈值为50。这样又回到了和1相同的处理方式。唯一区别的是:该灯闪烁后,要恢复其阈值为默认阈值。问题也可解决。

使用特权

评论回复
25
lyjian| | 2012-9-19 12:42 | 只看该作者
吃饱了没事干去钓鱼岛坐坐

使用特权

评论回复
26
渤海三叠浪|  楼主 | 2012-9-19 18:48 | 只看该作者
24# forrest11
你没看懂我说的,我也没看懂你说的。

看样子表达能力很重要啊。也可能你比较专业哈

使用特权

评论回复
27
forrest11| | 2012-9-20 08:56 | 只看该作者
本帖最后由 forrest11 于 2012-9-20 22:33 编辑
24# forrest11
你没看懂我说的,我也没看懂你说的。

看样子表达能力很重要啊。也可能你比较专业哈
渤海三叠浪 发表于 2012-9-19 18:48

我觉得我看懂了你1的要求,对于2的要求我理解错了。现在上面进行了调整。
你没有看懂我写的,那就没有办法了。你多看几遍吧。
不管怎么样,设定基本时间单位,在单片机中一般时Timer中断方式处理。然后设立各时间计数器。对应计数器做相应处理即可。这不只是我说的,楼上好多楼都建议你用这样的方法。

使用特权

评论回复
28
forrest11| | 2012-9-20 09:26 | 只看该作者
本帖最后由 forrest11 于 2012-9-20 20:35 编辑

举例说明一下,我的思路是:
第一题:
main()
{...
if(Flag_10ms==1)
{
Timer_150ms+=1;
Timer_250ms+=1;.....
Flag_10ms=0;

if (Timer_150ms>=15) Flag_150ms=1;
if (Timer_250ms>=25) Flag_250ms=1;......

if (Flag_150ms) {Pin_150ms=~Pin_150ms; Flag_150ms=0;Timer_150ms=0}
else if (Flag_250ms) {Pin_250ms=~Pin_250ms; Flag_250ms=0;Timer_250ms=0}
else if......
}
......
}
中断函数:
Timer_10ms() vector interrupt 1
{
/*单片机计数到了10ms;*/
Flag_10ms=1;
}
第一题我是分3段,实际上可以不要Flag_150ms这样的变量的,这样编程变为2段。只不过从编程思路而言,我偏向3段式。

第二题实际和一类似,当然如果时间片如果从10ms变为1ms的话,编程思路要调整的。

使用特权

评论回复
29
zhm8508| | 2012-9-20 11:37 | 只看该作者
LZ的举例让人更糊涂了,感觉LZ有一定工作经验,但是应该接触编程不久或者对通讯理解不深,直接说出这问题的技术难点吧。

使用特权

评论回复
30
cqwangsf| | 2012-9-22 20:18 | 只看该作者
1# 渤海三叠浪


这道题的实际意义是这样的:就拿RS485通信来说,假设通信速度500K,一个主,10个从。
灯状态改变一次表示主发送一帧数据。


其实基本上所有的485总线都不是这样解决的。485总线都是基本上都是由主机来控制哪个发,哪个收的。从机是不允许主动发送数据的。所以这个真没有意义。

使用特权

评论回复
31
misra| | 2012-9-22 20:40 | 只看该作者
本帖最后由 misra 于 2012-9-22 20:45 编辑

30# cqwangsf
没看到说是500KBPS么?  他的意思是为了让你明白点,担心你别的你看不懂。
所以说是“假设是。。”  其实任何通信  都差不多的。掌握一个 其他掌握很快。

所以就用普通的485举例。况且楼主没说 从主动发送

事实上主从方式仍是最完美的方式。

使用特权

评论回复
32
cjseng| | 2012-9-23 21:16 | 只看该作者
我觉得不可能实现,原因是:每到最小公倍数时间,所有的灯一起闪,而两个灯的间隔时间要求大于10毫秒,而对于每个灯的误差又要求小于2毫秒,10毫秒和2毫秒这是一对矛盾,所以无解。

使用特权

评论回复
33
forrest11| | 2012-10-10 18:41 | 只看该作者
我们在这里瞎起劲,楼主却再也不管了。

使用特权

评论回复
34
渤海三叠浪|  楼主 | 2012-10-10 19:55 | 只看该作者
本帖最后由 渤海三叠浪 于 2012-10-10 19:56 编辑

哦  我这个题说的是CANOPEN的调度eventitime和inhibittime
第二个题是同步  比CANOPEN还厉害一点

使用特权

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

本版积分规则