|
大概是12路的信号检测程序.
在中断中读入端口状态:
//保存上次脉冲数据
dataChOld=dataCh;
//读入脉冲
pulseChannel[0]=(P0&0xF0);
pulseChannel[1]=P2;
pulseChannel[0]<<=4; //XXX写成一条就悲剧
dataCh=(pulseChannel[1]+pulseChannel[0]);
if (dataChOld!=dataCh) flagChChange=1;
然后主循环中分辨哪一路发生了变化,进行处理:
if(flagChChange) {
tempCh=dataCh^dataChOld; //按位异或
tempCh=tempCh^dataChOld; //只有之前是1现在是0(下降沿)才计算
flagChChange=0;
for (i2=0;i2
if((tempCh&tempShift)==tempShift){
dataChCounter[i2]++; //step2 这里统计的是脉冲数
dataChTimerOld[i2]=dataChTimer[i2]; //step1 这里是统计过了几个0.5ms
dataChTimer[i2]=0;
}
tempShift<<=1;
}
tempShift=0x01;
}
变量类型之类的都不是重点,重点来了:
如果写成这个循环的样子.检测误差在10%上下,但是如果不使用循环,傻傻的写成12个if,误差却可以缩小到3%.
我认为只是多了Shfit移位一步.但是很奇怪.结果确实差了很多
单片机用的是11F60 标准12M晶振.主循环每秒最差情况8k次循环,检测信号频率上线50Hz.
大家对这个问题有什么看法?如果是循环检测引脚状态大家一般怎么实现?
|
|