打印

**暂时还没有,但是有两个原则可以请大家讨论

[复制链接]
2945|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ky_21ic|  楼主 | 2009-1-7 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果控制系统中加入了开门狗,程序跑飞后复位。现在的问题是,如果现在的I/O口或者寄存器有数值那么复位后(或者一瞬间)改变了I/O口或寄存器的状态怎么办???
有些时候我并不想改变其状态啊!!!(比如一电机正在运行,我不可能让他停下来)
这种情况怎么处理呢???????

相关帖子

沙发
ljm810010| | 2009-1-7 10:35 | 只看该作者

同问,我也想知道~~

使用特权

评论回复
板凳
lsqdesign| | 2009-1-7 12:05 | 只看该作者

试试这个办法,工控上用的

 关键数据建立3个以上的数据备份和反码备份,放在不同地方。复位后,用数据备份和反码备份快速用多选法恢复关键状态。

使用特权

评论回复
地板
hab2000| | 2009-1-7 12:10 | 只看该作者

办法是有的!

1、首先硬件设计上用“复位”信号屏蔽电机控制信号,即当产生复位时控制电机的I/O引脚被暂时“屏蔽”,保证电机控制状态不变。
2、软件里增加“冷启动/热启动”判断,如果是“热启动”不清相关RAM内容,一般复位后RAM的数据是不会改变的,再将电机控制字读出写到控制引脚即可。
3、如果采用PWM控制,建议用真正的硬件PWM,其状态可以不受复位影响(记得早年使用PHILIP的80552那款芯片的PWM就不受复位影响)。

使用特权

评论回复
5
ayb_ice| | 2009-1-7 20:45 | 只看该作者

有些MCU不同的复位是不同的

使用特权

评论回复
6
ky_21ic|  楼主 | 2009-1-8 21:19 | 只看该作者

回4楼

你说的第二点我试了,不好使,在网上又找了找原因。他们也说这样好像不行,原因在与,MCU复位之后并不是从main后开始执行的,而是先执行了一段“起始代码”,就因为这些起始代码是某些寄存器复位了。所以即使按照你说的那样也不行。。他也说到改进的方法就是要把某些编译器的内容改掉,好像由一个是:startup.A51文件的。。使他们不复位。。具体怎么操作还没有弄懂!!

使用特权

评论回复
7
ayb_ice| | 2009-1-8 21:37 | 只看该作者

起动代码不清0 RAM即可

使用特权

评论回复
8
红心j| | 2009-1-8 22:44 | 只看该作者

不可能100%,出错是难免的

使用特权

评论回复
9
ky_21ic|  楼主 | 2009-1-9 08:03 | 只看该作者

回七楼

如何能保证启动代码不清0呢???
启动代码是什么???

使用特权

评论回复
10
gezhi| | 2009-1-9 09:30 | 只看该作者

错啦!

程序跑飞了看门狗复位,就已经说明你的设计有问题了,你不去追究问题的原因把问题解决掉,反而去想怎么把这个“病态”维持下去。

使用特权

评论回复
11
hab2000| | 2009-1-9 14:56 | 只看该作者

回6楼

1、C51可以禁止启动代码的运行,或者修改,搜以前的贴,说得很多了!
2、或者用XRAM,即外部RAM(小模式下)。

使用特权

评论回复
12
ky_21ic|  楼主 | 2009-1-9 16:26 | 只看该作者

回10楼

我非常不赞成你的说法,看门狗复位一方面程序自身的问题,主要原因是外界的干扰,你能保证外界的没有干扰吗?????
自身程序可以控制,外界的你怎么控制啊!!!

使用特权

评论回复
13
wh6ic| | 2009-1-9 16:45 | 只看该作者

10楼是对的,自身程序可以控制,外界干扰也可以控制

  外界因素对你来讲暂时不好控制可以参考4楼第一点。不少大机器的控制器就不允许加看门狗。

使用特权

评论回复
14
hotpower| | 2009-1-9 21:25 | 只看该作者

改写STARTUP.A51的第30行IDATALEN EQU 80H为IDATALEN EQU 0即可

这样就可使C51复位后不会改写RAM内容。

一般应用方法:

volatile unsigned int SystemRamTest;

void SystemInit(void)
{
 IE = 0;//关中断
 PortInit();
if (SystemRamTest != 0x55aa)//可认为上电
 {

//上电初始化程序
 }

else

{

//复位初始化

}

//.......................
}

void main()
{
 _start_();
 SystemInit();
 SystemRamTest = 0x55aa;
 while(1)
 {
  EA = 1;//开中断
  TestMain();//测试主程序
       PCON |= IDL_;//进入空闲状态
     _nop_();
     _nop_();
 }
}


相关链接:http://www.google.cn/search?hl=zh-CN&newwindow=1&q=hotpower%E7%BA%A2%E6%9D%8F%E5%87%BA%E5%A2%99%E8%AE%B0&revid=1472798346&sa=X&oi=revisions_inline&resnum=0&ct=broad-revision&cd=2

使用特权

评论回复
15
NE5532| | 2009-1-10 12:33 | 只看该作者

你的电机可以在1mS时间内停下来?

还是我那句老话:狗是产品可靠性的最低底线,不是万不得已,不要开狗;被狗咬了也是万不得已的情况,只要保证不出安全事故就可以了。

给我徒弟说的:“你要金钟罩还是还魂丹?”

把软、硬件搞扎实,不死,才是王道!

使用特权

评论回复
16
dai_weis| | 2009-1-10 14:11 | 只看该作者

支持15楼

狗是最后的防线,首要问题是要保证自己和干扰下正常工作,不能保证就想办法,先解决自身问题,都解决了,可以考虑四楼的,例如通过设置触发器等方式来维持当前运行状态。

使用特权

评论回复
17
ky_21ic|  楼主 | 2009-1-10 17:56 | 只看该作者

回15楼

说的有道理!!
支持一下!!
但目前小弟的情况是;金钟罩不成熟,目前只能依靠还魂丹了!!!
虽然这不是好办法,但实力水平不行,也是没办法啊!!!
但愿请教大侠你有相关软硬件可靠性的**没有啊??

使用特权

评论回复
18
ayb_ice| | 2009-1-10 20:03 | 只看该作者

狗是救命的东西

用多了会不灵的.

使用特权

评论回复
19
NE5532| | 2009-1-11 15:44 | 只看该作者

**暂时还没有,但是有两个原则可以请大家讨论

A:能完成功能,就尽量用简单的方法实现
B:搞懂图上的每个元件

使用特权

评论回复
20
ky_21ic|  楼主 | 2009-1-11 21:30 | 只看该作者

回19楼

学习了!!!

使用特权

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

本版积分规则

65

主题

211

帖子

1

粉丝