本帖最后由 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
|