-
- 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