打印

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

[复制链接]
3100|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Ryanhsiung 于 2012-3-15 17:50 编辑

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

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

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

 
uint24 Mcp3553_ReadResult(void)  // 第一次 执行此函数会引起偏振
{
   uint24 result;
// static  uint24 result;            // 换成STATIC后 可以正常起振
                                            // 注释掉下面的代码 可以正常起振
uint8 i;
//F_TRIS_MCP3553_SDA(IN);
//delayms(5);
  Mcp3553_delayus(15);
  result<<=1;
for(i=0;i<24;i++)
{
  F_MCP3553_SCL(LOW);    //
  Mcp3553_delayus(7);
  
  F_MCP3553_SCL(HIGH);    //
  result<<=1;                                  //  我怀疑是这一句惹的祸
  if(1 == RD_MCP3553_SDA())
   result++;
  Mcp3553_delayus(6);
}
F_MCP3553_SCL(HIGH);    //
F_TRIS_MCP3553_SDA(OUT);
F_MCP3553_SDA(HIGH);

return result;
}

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

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

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

  if(1 == RD_MCP3553_SDA())
  8CD4    0E01     MOVLW 0x1
  8CD6    6E14     MOVWF 0x14, ACCESS
  8CD8    5084     MOVF 0xf84, W, ACCESS
  8CDA    0B01     ANDLW 0x1
  8CDC    5C14     SUBWF 0x14, W, ACCESS
  8CDE    E108     BNZ 0x8cf0
304:                 result++;
  8CE0    CFD9     MOVFF 0xfd9, 0xfe9
  8CE2    FFE9     NOP
  8CE4    CFDA     MOVFF 0xfda, 0xfea
  8CE6    FFEA     NOP
  8CE8    2AEE     INCF 0xfee, F, ACCESS
  8CEA    0E00     MOVLW 0
  8CEC    22EE     ADDWFC 0xfee, F, ACCESS
  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,此时也就出现了偶尔停振的现象,俺原来有一个小弟就犯过这个错误,俺检查了很久才发现。

使用特权

评论回复
5
Ryanhsiung|  楼主 | 2012-3-15 16:41 | 只看该作者
本帖最后由 Ryanhsiung 于 2012-3-15 18:21 编辑
检查堆栈是否溢出,查阅芯片的数据手册看类似sleep等可能终止MCU晶体振荡的指令码,再检查程序中是否有表格数据和这个指令码相同的数据,在一些极端情况下,堆栈溢出导致软件跑飞,PC指针正好落到这个数据上时,会相 ...
yewuyi 发表于 2012-3-15 15:56

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

对了,怎么检查堆栈使用情况呢??

使用特权

评论回复
6
XIEYUANBIN| | 2012-3-15 20:52 | 只看该作者
可以看得出你的项目很急,程序硬件应该也很乱。。。。。。。无法提供意见

使用特权

评论回复
7
Ryanhsiung|  楼主 | 2012-3-15 20:57 | 只看该作者
本帖最后由 Ryanhsiung 于 2012-3-16 08:32 编辑
可以看得出你的项目很急,程序硬件应该也很乱。。。。。。。无法提供意见
XIEYUANBIN 发表于 2012-3-15 20:52

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

  现有一个更棘手的问题,EEPROM被篡改掉了!!!

使用特权

评论回复
8
martin| | 2012-3-16 09:19 | 只看该作者
跟你说过BOR设到4.xV,9成以上的EEPROM被改写都是因为没有正确使用BOR。
再说一遍,MCLR引脚上的电解电容换成0.1uF瓷片电容,不解释了。

使用特权

评论回复
9
asspeed| | 2012-3-16 10:49 | 只看该作者
无话可说了,经验证明:越诡异的现象,产生的原因越低级.....

使用特权

评论回复
10
Ryanhsiung|  楼主 | 2012-3-16 11:55 | 只看该作者
跟你说过BOR设到4.xV,9成以上的EEPROM被改写都是因为没有正确使用BOR。
再说一遍,MCLR引脚上的电解电容换成0.1uF瓷片电容,不解释了。
martin 发表于 2012-3-16 09:19

已经换过了,BOR也设置成最高电压了!
现像依旧!

使用特权

评论回复
11
Ryanhsiung|  楼主 | 2012-3-16 11:56 | 只看该作者
无话可说了,经验证明:越诡异的现象,产生的原因越低级.....
asspeed 发表于 2012-3-16 10:49

指点一二!!!:)

使用特权

评论回复
12
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工作??

QQ截图未命名.jpg (51.62 KB )

QQ截图未命名.jpg

使用特权

评论回复
13
asspeed| | 2012-3-16 21:23 | 只看该作者
数据手册都写得清清楚楚,什么能用什么不能用,有人都提醒你了,你不是说也试过了吗?
用PIC18F4620,只有两档选择,即使是"01"挡,阀值为4.11V,也没有问题。不是说VDD一超过4.2V,PC就飞了.
大哥,这些都是经过严格测试过的,敢放在数据手册里的数据,基本上都是可靠的.
电源不稳定的话就选LF,多不了几个钱.

使用特权

评论回复
14
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

主题

4654

帖子

14

粉丝