打印

极品现象,求解

[复制链接]
1710|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脚

未命名.bmp (750.05 KB )

未命名.bmp

使用特权

评论回复
5
xuan309170083| | 2013-11-22 10:27 | 只看该作者
这个应该是程序跑飞了吧。

可能是楼主在拔传感器线时产生的干扰导致(430的抗干扰性不会这么差吧,但除了这个解释我实在想不到其他的了),导致该处采样程序的PC跳转值被更改(永久性的),指向了未知区域(程序跑飞),现象就是看门狗复位,等下次执行到采样程序这里时,由于跳转值被永久更改了,所以看门狗又会强制复位单片机。如此循环。重新下载一次程序后又可以正常工作
不知道楼主的程序的写法是什么,建议把函数的相关操作都声明成const,这样更保险些
也不知道我理解的对不对,欢迎讨论

使用特权

评论回复
6
荣豹|  楼主 | 2013-11-22 10:39 | 只看该作者
我也怀疑程序跑飞,但加了外部看门狗呀,再次到同一地方重启,有点说不过去呀
建议把函数的相关操作都声明成const,这样更保险些
,是在函数名称前加const吗?将函数属性改为只读?

使用特权

评论回复
7
荣豹|  楼主 | 2013-11-22 10:39 | 只看该作者
会不会是闩锁效用引起AD脚锁死呀

使用特权

评论回复
8
xuan309170083| | 2013-11-22 11:18 | 只看该作者
荣豹 发表于 2013-11-22 10:39
我也怀疑程序跑飞,但加了外部看门狗呀,再次到同一地方重启,有点说不过去呀
,是在函数名称前加const吗? ...

我的意思是把函数的入口地址声明成const,如果你用了指针的话

使用特权

评论回复
9
xuan309170083| | 2013-11-22 11:21 | 只看该作者
荣豹 发表于 2013-11-22 10:39
会不会是闩锁效用引起AD脚锁死呀

这我就不知道了,没研究的那么深入

使用特权

评论回复
10
荣豹|  楼主 | 2013-11-22 11:26 | 只看该作者
多谢指点,没有用指针函数,只是函数内部变量用过指针,而且这种现象不常见,所以程序上修改的话,很难知道是否正确,如果有人遇到过类似的情况,就有针对性了

使用特权

评论回复
11
荣豹|  楼主 | 2013-11-22 11:28 | 只看该作者
多谢 xuan309170083,这种现象确实挺头疼,我打算把AD输入口电路处理一下,看以后还会不会出现这种现象了,目前看只能这样了

使用特权

评论回复
12
xuan309170083| | 2013-11-22 11:56 | 只看该作者
荣豹 发表于 2013-11-22 11:28
多谢 xuan309170083,这种现象确实挺头疼,我打算把AD输入口电路处理一下,看以后还会不会出现这种现象了, ...

不用客气,互相学习互相帮助吧

使用特权

评论回复
13
xuexidsp| | 2013-11-22 15:48 | 只看该作者
深夜还在学习的lz。。。。

使用特权

评论回复
14
pmp| | 2013-11-23 21:17 | 只看该作者
楼主的采样程序呢?

使用特权

评论回复
15
pmp| | 2013-11-23 21:17 | 只看该作者
是不是有while循环之类的。

使用特权

评论回复
16
pmp| | 2013-11-23 21:17 | 只看该作者
或者在采样执行才程序太多了,来不及喂狗了呢。

使用特权

评论回复
17
荣豹|  楼主 | 2013-11-25 11:01 | 只看该作者
是不是有while循环之类的。


程序中没有死循环

使用特权

评论回复
18
荣豹|  楼主 | 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;
}

使用特权

评论回复
19
荣豹|  楼主 | 2013-11-25 11:02 | 只看该作者
这是AD采样程序,麻烦帮看一下

使用特权

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

本版积分规则

12

主题

38

帖子

0

粉丝