极品现象,求解

[复制链接]
2227|18
 楼主| 荣豹 发表于 2013-11-22 00:07 | 显示全部楼层 |阅读模式
先大体介绍一下我的电路板
1.单片机是MSP430F448。
2.外接独立的看门狗芯片,看门狗的复位引脚通过跳针连接到单片机的RST引脚,跳针短接,外部看门狗起作用,跳针断开,看门狗失效。
3.电路板主要用来采集传感元件的电压信号,毫伏级,传感元件与电路板靠3根线连接,3.3v、GND、信号。电路板上有采样指示灯,在定时器中
   使能内部采样模块,并打开采样指示灯,在采样中断里,当采样完成后,关闭指示灯,即正常时,指示灯闪烁。采样模式是序列通道多次转换。
现象:
    做了N块电路板拷机3个多月,工作正常,没有发生重启现象。有一次测试时,在带电状态下(看门狗跳针断开,看门狗失效状态),将1个传感元件的3根线分别拔除后,采样指示灯常亮,单片机不采样了。
    此时,我将跳针短接,外部看门狗起作用,单片机重启,正常执行程序,数码管显示、IIC的读取都正常,但程序执行到该采样时,指示灯常亮,AD不采样,
    之后,程序重启,。。。。。。。。。。。。。再执行到采样时,指示灯又常亮。程序重启。。。。。。。。。。。

   断电、上电后,一切又正常了。
  
   后来,我想再现一下这种现象,但怎么插拔传感元件与电路板的连线,这种现象也不出现了。
   可能是偶然现象,但如果在工业现场用的时候,不能保证不会出现。
   查了好些资料,也没有好的办法,甚至什么原因导致的都不清楚,所以想请论坛里的高手给指点迷津!
   谢谢!
 楼主| 荣豹 发表于 2013-11-22 09:39 | 显示全部楼层
没人回,自己先顶一把
dirtwillfly 发表于 2013-11-22 09:48 | 显示全部楼层
楼主把电路图传上来看看吧
 楼主| 荣豹 发表于 2013-11-22 09:57 | 显示全部楼层
电路比较简单,放大器做在了传感元件内,电路板上加了电容电阻对地,然后直接接到AD脚

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
xuan309170083 发表于 2013-11-22 10:27 | 显示全部楼层
这个应该是程序跑飞了吧。

可能是楼主在拔传感器线时产生的干扰导致(430的抗干扰性不会这么差吧,但除了这个解释我实在想不到其他的了),导致该处采样程序的PC跳转值被更改(永久性的),指向了未知区域(程序跑飞),现象就是看门狗复位,等下次执行到采样程序这里时,由于跳转值被永久更改了,所以看门狗又会强制复位单片机。如此循环。重新下载一次程序后又可以正常工作
不知道楼主的程序的写法是什么,建议把函数的相关操作都声明成const,这样更保险些
也不知道我理解的对不对,欢迎讨论
 楼主| 荣豹 发表于 2013-11-22 10:39 | 显示全部楼层
我也怀疑程序跑飞,但加了外部看门狗呀,再次到同一地方重启,有点说不过去呀
建议把函数的相关操作都声明成const,这样更保险些
,是在函数名称前加const吗?将函数属性改为只读?
 楼主| 荣豹 发表于 2013-11-22 10:39 | 显示全部楼层
会不会是闩锁效用引起AD脚锁死呀
xuan309170083 发表于 2013-11-22 11:18 | 显示全部楼层
荣豹 发表于 2013-11-22 10:39
我也怀疑程序跑飞,但加了外部看门狗呀,再次到同一地方重启,有点说不过去呀
,是在函数名称前加const吗? ...

我的意思是把函数的入口地址声明成const,如果你用了指针的话
xuan309170083 发表于 2013-11-22 11:21 | 显示全部楼层
荣豹 发表于 2013-11-22 10:39
会不会是闩锁效用引起AD脚锁死呀

这我就不知道了,没研究的那么深入
 楼主| 荣豹 发表于 2013-11-22 11:26 | 显示全部楼层
多谢指点,没有用指针函数,只是函数内部变量用过指针,而且这种现象不常见,所以程序上修改的话,很难知道是否正确,如果有人遇到过类似的情况,就有针对性了
 楼主| 荣豹 发表于 2013-11-22 11:28 | 显示全部楼层
多谢 xuan309170083,这种现象确实挺头疼,我打算把AD输入口电路处理一下,看以后还会不会出现这种现象了,目前看只能这样了
xuan309170083 发表于 2013-11-22 11:56 | 显示全部楼层
荣豹 发表于 2013-11-22 11:28
多谢 xuan309170083,这种现象确实挺头疼,我打算把AD输入口电路处理一下,看以后还会不会出现这种现象了, ...

不用客气,互相学习互相帮助吧
xuexidsp 发表于 2013-11-22 15:48 | 显示全部楼层
深夜还在学习的lz。。。。
pmp 发表于 2013-11-23 21:17 | 显示全部楼层
楼主的采样程序呢?
pmp 发表于 2013-11-23 21:17 | 显示全部楼层
是不是有while循环之类的。
pmp 发表于 2013-11-23 21:17 | 显示全部楼层
或者在采样执行才程序太多了,来不及喂狗了呢。
 楼主| 荣豹 发表于 2013-11-25 11:01 | 显示全部楼层
是不是有while循环之类的。


程序中没有死循环
 楼主| 荣豹 发表于 2013-11-25 11:01 | 显示全部楼层
本帖最后由 荣豹 于 2013-12-5 08:51 编辑

/*****************************************************************************
AD转换器中断函数
******************************************************************************/

#pragma vector=ADC_VECTOR
__interrupt void Adc()
{  
  static unsigned char q0=0,q1=0;
  ADC12IFG = 0;
  if(ADWait==0)//没有转换结束
  {
    AdMem0[q0] =  ADC12MEM0;
    AdMem1[q1] =  ADC12MEM1;
    q0++;
    q1++;

    AdCi--;
    if(AdCi==0)//16次转化结束
    {
      ADC12Open(0);          //关闭ADC12模块
      ADWait = 1;        //转换结束的标志位置位
      q0 = 0;
      q1 = 0;
      ADFilter(AdMem0);
      AdMem[0] = AdMem_Result;
      ADFilter(AdMem1);
      AdMem[1] = AdMem_Result;     
      AdCi=AD_CI;      
      ADC12IFG = 0;
      AD_Start_Flag = 0;
      P4OUT &= ~BIT7;//采样指示灯熄灭
      
    }
  }
  ADC12IFG = 0;
}
 楼主| 荣豹 发表于 2013-11-25 11:02 | 显示全部楼层
这是AD采样程序,麻烦帮看一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

38

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部