指令时钟与定时器时钟同步,为FOSC/4
我在用定时器为定时的候,设置了一个等待程序,想通过定时器计时发生中断的时候执行下面指令:
TMR4=9;
……
while(TMR4>16);
……
但在实际调试用发现,根本不会等,就自自往下执行了,调开寄存器一看,在执行"while(TMR4>16);"的时候,TMR4已经为20了,造成程序混乱。
看了一下ProgramMemory的汇编指令,发现:
一条这样的指令,竟然使用了6个指令周期:
Conversion&=CMOUT;
系统外部时钟是:13.56MHZ
指令周期:4/13.56MHZ=0.295us
定时时钟也是:0.295us
for(ReceiCount=1;ReceiCount<ReceiLenth;ReceiCount++)
上面这样一个for循环就更可怕了,占到13个指令周期,时间大概是:13*0.295=3.83us了。
现在想解决问题是:能不能有什么办法减少这些周期数,或者编译平台能否进行优化。
Conversion=0; //计数器
PR4 =32; //128 clock
TMR4=9;
for(ReceiCount=1;ReceiCount<ReceiLenth;ReceiCount++)
{
temp>>=1;
temp&=0x7F;
Conversion=0x20;
while(TMR4>16);
Conversion&=CMOUT; //检测高电平
Conversion&=CMOUT;
Conversion&=CMOUT;
Conversion&=CMOUT;
temp|=Conversion; //保存数据
if((ReceiCount%8)==0)
{
t=ReceiCount/8;
Receiver[t-1]=temp;
}
}
能在9个us内完成这样一个for循环周期去检测脉冲信号?求高见!~~~~
以下附实验图片,可供参考。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
回复【9楼】worksnfkpynn99 如影客
-----------------------------------------------------------------------
天呢.. 你走弯路了.. 怎么能用位检测的方法是去做串口通信呢??
这个应该一个mcu的通信功能实现..
-----------------------------------------------------------------------
嗯嗯嗯……
是错了,想知道用什么方法去读这些脉冲信号呀,
频率:106K
解码方式:曼码即:01=0,10=1
我使用定时器+比较器的方法,
比较器输出:#define EMad1 C1OUT
定时器:TMR0(13.56/4指令时钟的32预分频),128*T0=9.4us
以下是我的程序,友友们帮我分析一下啦,不胜感激。
unsigned char readBIT(unsigned char LongNum)
{
unsigned char temp;
unsigned char t,i;
t=0;
while(EMda0){} //无比较输出 等待……
TMR0=0;
for(i=0;i<LongNum;i++)
{
while(EMda0){} //无比较输出 等待……
t=TMR0;
if(t<50) temp|=0x80; //在前半周期出现高电平:解为1 保存在temp
if(t>80) temp&=0x7F; //在后半周期出现低电平:解为0 保存在temp
temp>>=1; //保存一位
while(TMR0<120){} //等待一个周期完成
TMR0=0;
}
return 1;
}
帮我提一下可行意见,好吗?在线……
一周热门 更多>