最近遇到一个难题,就是想使用外部晶振为13.56MHZ的系统,给端口输出一段1.4us左右的脉冲信息,想请高手指点一二,谢谢了。
以下是我做的一些测试,但均失败……
晶振:13.56MZH
指令周期:4/13.56M=0.295us
测试程序:
void SendOne() //_____---_
{
for(t=0;t<1;t++);
NOP();
NOP();
NOP();
NOP();
NOP();
DISABLE_TXD;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
ENABLE_TXD;
NOP();
}
void SendZero1() //---_______
{
DISABLE_TXD; // disable TX
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
ENABLE_TXD; // enable TX
for(t=0;t<1;t++);
NOP();
NOP();
NOP();
NOP();
}
main()
{
__delay_ms(100);
SendOne();
SendZero1();
}
测试的问题是:1.4us仅有5个指令周期,
ENABLE_TXD;
(MOVLB 0x2
BCF PORTA, 0x1
二进制指令周期)
DISABLE_TXD;
(MOVLB 0x2
BCF PORTA, 0x0
二进制指令周期)
基本上5个指令周期就被上面两条端口置位或者清0的指令用完,还有GOTO,RETURN等双周期的指令,所以测试永远无法实现1.4us的端口肪冲。
希望有经验的友友们能帮帮我,是不是有编译优化这样的设置,或者
if((SendData&0x01)>0) //Send "1"
{
for(t=0;t<15;t++);// delay 5 us
DISABLE_TXD; // disable TX
for(t=0;t<8;t++);// delay 3 us
t++;
t++;
ENABLE_TXD; // enable TX
t++;
t++;
t++;
t++;
t++;// delay 1.44 us
FlagSet=1;
}
else
{
if(FlagSet) // previous bit is "1"
{
for(t=0;t<25;t++);
t++;
t++;
t++;
t++;
t++;
t++;
t++;
}
else
{
DISABLE_TXD; // disable TX
__delay_us(2);
ENABLE_TXD; // enable TX
for(t=0;t<17;t++); // 6.44 us
}
FlagSet=0;
}
SendData>>=1;
这样的嵌套程序怎么才能以少的指令周期跑出来呀?
不知道问题说请楚了没有,如果没有的话,可以提问,在等……
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
需要准确的数周期的脉冲信号输出, 只能用汇编语言或在 c 语言中加入汇编语句达成, 别无它法。
-----------------------------------------------------------------------
5555555,数周期数得头都大了……用汇编~~~~ - -!! 没什么把握,好吧,只能说自己菜了……
一周热门 更多>