kingtop 发表于 2015-2-11 23:18 这些问题其实我也不懂什么原因。我也是上个月第一次用stc15,现在都忘得差不多了。 |
反复测试(IAP15F61S2仿真)发现:PowerDownTime、WktFreq的值都不正常,真实奇怪。 |
您好!您说得对!估计用WKT的人不多,所以大家暂时不了解您的帖子的价值! 前几天一个程序需要借助于WKT超低功耗设计,居然卡在WKT上。只要或运算置位WKTEN,延时时间永远是最大量程。后来改为赋值就好了,但赋值方法先组装数据,使能WKTEN与赋初值搅在一起,不方便看清开发者的意图,所以我前几天简单改了一下: //采用逻辑运算使能WKTEN"位",无论初值如何,永远是最大量程了,一定找不着北啦! WKTCL=615; //WKT量程0.3秒 WKTCH=(615>>8)|0x80; //用赋值法置初值同时置位WKTEN,不可逻辑运算置位WKTCH.7 PCON |=0x02; //停机无耗WKT延时 _nop_(); //唤醒不进已屏蔽的中断 _nop_(); ............. 但我还为一个似乎很初级的问题抓狂,看来不初级?程序要在WKT唤醒之前由外中断唤醒,5秒量程的WKT仅是最后的补救唤醒措施。外中断唤醒后要计算掉电了多久,但是无论如何程序的表现都不正常,最后不得已仿真(IAP15F61S2仿真),发现几个变量值都不对,哪又出问题了?请您指点一下: PowerDownTime=(WKTCH&~0x80)<<8+WKTCL; //实际读的是[WKTCH_CNT,WKTCL_CNT]而非[WKTCH,WKTCL],但_CNT从7FFF开始计数,是否应屏蔽最高位的1才正确? PowerDownTime++; //既然已屏蔽_CNT最高位的1,需修正才为真实计数值 WktFreq=DBYTE[0xF8]<<8+DBYTE[0xF9]; //WKT专用振荡器16分频后用于WKT计数,在[F8,F9]中 WktFreq>>=4; //16分频 //根据掉电时长叠加新状态后恢复设备或端口,奇怪的是WktFreq总是0! if(PowerDownTime<0.2*WktFreq) //若掉电时长0~0.2秒视为干扰 { ... ... //仅恢复掉电前端口状态 } else if(PowerDownTime<1*WktFreq) //若掉电时长0.2~1秒, { RED_BAK=!RED_BAK; RED =RED_BAK; //加入新状态恢复端口 } else if(PowerDownTime<1.5*WktFreq) //若掉电时长1~1.5秒,视为长或短掉电的间隔 { ... ... //仅恢复掉电前端口状态 } else { //若掉电时长1.5~5秒(5秒是WKT唤醒的边界) GREEN_BAK=!GREEN_BAK; GREEN=GREEN_BAK; //加入新状态恢复端口 } ... ... ... ... ... ... ... |
|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )
GMT+8, 2024-11-30 00:39 , Processed in 0.219902 second(s), 21 queries .