PIC16f1933指令延时,误差大是什么原因?

2020-02-08 09:31发布

最近遇到一个难题,就是想使用外部晶振为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;

这样的嵌套程序怎么才能以少的指令周期跑出来呀?
不知道问题说请楚了没有,如果没有的话,可以提问,在等……
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
worksnfkpynn99
2020-02-08 19:24
回复【1楼】eblc1388
需要准确的数周期的脉冲信号输出, 只能用汇编语言或在 c 语言中加入汇编语句达成, 别无它法。
-----------------------------------------------------------------------

5555555,数周期数得头都大了……用汇编~~~~ - -!! 没什么把握,好吧,只能说自己菜了……

一周热门 更多>