指令时钟与定时器时钟同步,为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循环周期去检测脉冲信号?求高见!~~~~
以下附实验图片,可供参考。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
回复【楼主位】worksnfkpynn99 如影客
系统外部时钟是:13.56mhz
指令周期:4/13.56mhz=0.295us
定时时钟也是:0.295us
....
能在9个us内完成这样一个for循环周期去检测脉冲信号?求高见!~~~~
-----------------------------------------------------------------------
9/0.295us = 31条指令
for(receicount=1;receicount<receilenth;receicount++)
"receicount=1"赋值运算 如果"receicount" 是16位 汇编怎么说也要6-7条吧?
一句就去了十几条了.下面再写起来就难了..
receicount%8 这样的一句就去了估计20条.
感觉命题需求不......
-----------------------------------------------------------------------
是的,你说的对,照按现行方案根本满足不了现行的需求。
昨天重新认真分析了一下,想按这样的时钟速度跑这个程序嵌套,是根本没法完成的。而且还有一个除法的运算:t=ReceiCount/8;
但是,我就是看过有朋友这样做出来过,不知道是不是用C语言,或者C再嵌套汇编,再或者纯汇编。
我想要的需求很单一,在一数据流中,每9.4个us左右读取一位,然后保存下来。大概最多的时候有40个位,所以要保证每读一个位的时间周期要精确,就只能想到用定时器,但是现行时钟和定时器分辨率是远远无法满足的,再者也不可能再增大时钟了……友友们帮我讨论下解决方案啦……
期待……
一周热门 更多>