晶振不正常起振程序讨论贴!

[复制链接]
4141|15
 楼主| Ryanhsiung 发表于 2012-3-14 20:49 | 显示全部楼层 |阅读模式
本帖最后由 Ryanhsiung 于 2012-3-15 17:50 编辑

问题现像描述:https://bbs.21ic.com/icview-313130-1-1.html

现只找到问题点(在特定的硬件,特定的时间里操作特定的函数引发停振),还不知道问题发生的原理,大家讨论一下!

注:MCP3553没有接,以下操作本质上等同于IO口操作。


  1. uint24 Mcp3553_ReadResult(void)  // 第一次 执行此函数会引起偏振
  2. {
  3.    uint24 result;
  4. // static  uint24 result;            // 换成STATIC后 可以正常起振
  5.                                             // 注释掉下面的代码 可以正常起振
  6. uint8 i;
  7. //F_TRIS_MCP3553_SDA(IN);
  8. //delayms(5);
  9.   Mcp3553_delayus(15);
  10.   result<<=1;
  11. for(i=0;i<24;i++)
  12. {
  13.   F_MCP3553_SCL(LOW);    //
  14.   Mcp3553_delayus(7);
  15.   
  16.   F_MCP3553_SCL(HIGH);    //
  17.   result<<=1;                                  //  我怀疑是这一句惹的祸
  18.   if(1 == RD_MCP3553_SDA())
  19.    result++;
  20.   Mcp3553_delayus(6);
  21. }
  22. F_MCP3553_SCL(HIGH);    //
  23. F_TRIS_MCP3553_SDA(OUT);
  24. F_MCP3553_SDA(HIGH);

  25. return result;
  26. }

很奇怪,
1、若没有完全掉电后,再上电 可以晶振正常运行
2、上述是一个自动采集程序中的具体执行部分,在程序当中还有一个手动采集的程序,若初始上电状态中(且关闭自动采集程序),使用手动模式读也不会引起停振
3、若初始上电状态中(且关闭自动采集程序),过30S后再打开此自动采集,也会引起停振。(等了30S了,还停 这是为什么呢??)
4、今天现像不出现的原因,是硬件不是先前那套,去生产部找加那套硬件,现像可以重复出现,若换一套硬件则现像不出现(这是为会呢,不仅根程序有关,还根硬件有关)。
5、换成STATIC也不会引起停振,为什么呢
6、换个单片机也可以正常(为什么呢

个人认为:24位的RESULT在特定时候(还有特定的硬件)触发进入了特定边界状态,后导致停振。

20120315
测试是result++是这一句出的问题,注释掉后运行正常。
以正是汇编代码:(大家帮忙看看)

  1.   if(1 == RD_MCP3553_SDA())
  2.   8CD4    0E01     MOVLW 0x1
  3.   8CD6    6E14     MOVWF 0x14, ACCESS
  4.   8CD8    5084     MOVF 0xf84, W, ACCESS
  5.   8CDA    0B01     ANDLW 0x1
  6.   8CDC    5C14     SUBWF 0x14, W, ACCESS
  7.   8CDE    E108     BNZ 0x8cf0
  8. 304:                 result++;
  9.   8CE0    CFD9     MOVFF 0xfd9, 0xfe9
  10.   8CE2    FFE9     NOP
  11.   8CE4    CFDA     MOVFF 0xfda, 0xfea
  12.   8CE6    FFEA     NOP
  13.   8CE8    2AEE     INCF 0xfee, F, ACCESS
  14.   8CEA    0E00     MOVLW 0
  15.   8CEC    22EE     ADDWFC 0xfee, F, ACCESS
  16.   8CEE    22EE     ADDWFC 0xfee, F, ACCESS

ocon 发表于 2012-3-14 22:17 | 显示全部楼层
也怀疑是意外执行了SLEEP,你设置一下打开某个引脚睡眠唤醒,停振后触发一下看能否恢复。
也可以看一下这段函数对应的汇编代码,是否意外改写了可能引起睡眠和振荡方式改变的特殊寄存器,比如切换到了别的振荡源。
 楼主| Ryanhsiung 发表于 2012-3-15 11:24 | 显示全部楼层
也怀疑是意外执行了SLEEP,你设置一下打开某个引脚睡眠唤醒,停振后触发一下看能否恢复。
也可以看一下这段函数对应的汇编代码,是否意外改写了可能引起睡眠和振荡方式改变的特殊寄存器,比如切换到了别的振荡源。 ...
ocon 发表于 2012-3-14 22:17

刚测试,使用串口无法唤醒!!!
yewuyi 发表于 2012-3-15 15:56 | 显示全部楼层
检查堆栈是否溢出,查阅芯片的数据手册看类似sleep等可能终止MCU晶体振荡的指令码,再检查程序中是否有表格数据和这个指令码相同的数据,在一些极端情况下,堆栈溢出导致软件跑飞,PC指针正好落到这个数据上时,会相当于执行了sleep等指令,如果此时又恰好开启了看门狗的话,则看门狗会等待一段时间唤醒MCU,此时也就出现了偶尔停振的现象,俺原来有一个小弟就犯过这个错误,俺检查了很久才发现。
 楼主| Ryanhsiung 发表于 2012-3-15 16:41 | 显示全部楼层
本帖最后由 Ryanhsiung 于 2012-3-15 18:21 编辑
检查堆栈是否溢出,查阅芯片的数据手册看类似sleep等可能终止MCU晶体振荡的指令码,再检查程序中是否有表格数据和这个指令码相同的数据,在一些极端情况下,堆栈溢出导致软件跑飞,PC指针正好落到这个数据上时,会相 ...
yewuyi 发表于 2012-3-15 15:56

好像不是SLEEP,我用串口SLEEP唤醒不了,WDT我一直都是打开的,一但停振后就不会恢复!
  还有我已经开启了 堆栈溢出复位配置位了!溢出可能性也不高啊!

对了,怎么检查堆栈使用情况呢??
XIEYUANBIN 发表于 2012-3-15 20:52 | 显示全部楼层
可以看得出你的项目很急,程序硬件应该也很乱。。。。。。。无法提供意见
 楼主| Ryanhsiung 发表于 2012-3-15 20:57 | 显示全部楼层
本帖最后由 Ryanhsiung 于 2012-3-16 08:32 编辑
可以看得出你的项目很急,程序硬件应该也很乱。。。。。。。无法提供意见
XIEYUANBIN 发表于 2012-3-15 20:52

现在当然急了,这个上产品已经生产了好久了!!现在量还是很大的

  现有一个更棘手的问题,EEPROM被篡改掉了!!!
martin 发表于 2012-3-16 09:19 | 显示全部楼层
跟你说过BOR设到4.xV,9成以上的EEPROM被改写都是因为没有正确使用BOR。
再说一遍,MCLR引脚上的电解电容换成0.1uF瓷片电容,不解释了。
asspeed 发表于 2012-3-16 10:49 | 显示全部楼层
无话可说了,经验证明:越诡异的现象,产生的原因越低级.....
 楼主| Ryanhsiung 发表于 2012-3-16 11:55 | 显示全部楼层
跟你说过BOR设到4.xV,9成以上的EEPROM被改写都是因为没有正确使用BOR。
再说一遍,MCLR引脚上的电解电容换成0.1uF瓷片电容,不解释了。
martin 发表于 2012-3-16 09:19

已经换过了,BOR也设置成最高电压了!
现像依旧!
 楼主| Ryanhsiung 发表于 2012-3-16 11:56 | 显示全部楼层
无话可说了,经验证明:越诡异的现象,产生的原因越低级.....
asspeed 发表于 2012-3-16 10:49

指点一二!!!:)
 楼主| Ryanhsiung 发表于 2012-3-16 18:33 | 显示全部楼层
跟你说过BOR设到4.xV,9成以上的EEPROM被改写都是因为没有正确使用BOR。
再说一遍,MCLR引脚上的电解电容换成0.1uF瓷片电容,不解释了。
martin 发表于 2012-3-16 09:19

请教:
   1、如规格书中所描述:11为LF系列所支持,我F系列设置了11后BOR实际值为多少??
   2、若操作01,则极限最低值为4.11V,单片机最低工作电压为4.2V,单片机能否支持4.11V工作??

本帖子中包含更多资源

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

×
asspeed 发表于 2012-3-16 21:23 | 显示全部楼层
数据手册都写得清清楚楚,什么能用什么不能用,有人都提醒你了,你不是说也试过了吗?
用PIC18F4620,只有两档选择,即使是"01"挡,阀值为4.11V,也没有问题。不是说VDD一超过4.2V,PC就飞了.
大哥,这些都是经过严格测试过的,敢放在数据手册里的数据,基本上都是可靠的.
电源不稳定的话就选LF,多不了几个钱.
 楼主| Ryanhsiung 发表于 2012-3-17 08:43 | 显示全部楼层
数据手册都写得清清楚楚,什么能用什么不能用,有人都提醒你了,你不是说也试过了吗?
用PIC18F4620,只有两档选择,即使是"01"挡,阀值为4.11V,也没有问题。不是说VDD一超过4.2V,PC就飞了.
大哥,这些都是经过严格测试过的 ...
asspeed 发表于 2012-3-16 21:23

谢谢
再问一下:芯片我先前选了11那一档,最后实际BOR的状况是选了4.11V,还是相当于关闭状态???
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:道阻且长,行则将至!

64

主题

4653

帖子

14

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