C语言 CCS PICC CCP settings



(如果有人能指出如何在不使用不起作用的4空格缩进系统的情况下将代码粘贴到这里,我会很乐意发布代码)

大家好经过大约9个小时的绞尽脑汁,我找不到答案,也找不到我的计算出错的地方。。。但事实确实如此。我有一个使用18F2550微芯片构建的电路。我使用这个电路来测量2个信号之间的延迟,并在捕获模式下使用2个CCP寄存器。这一切都有效,结果被发送到电脑(通过USB串行)所有的数据,但结果是错误的。我必须对任何结果应用大约16000的增益,才能接近引脚的延迟。

我在线路上设置了延迟
Timer1设置为内部
Timer3已禁用
启用相关中断

并且主程序连续运行。当我在CCP1引脚上得到上升沿检测时,中断被配置为将计时器1以及溢出计数器重置为零

    #INT_CCP1
    void ccp1_isr() // Captures the rising edge of CCP1 pin.
    { 
        if(timing==FALSE){ // only do this on the edge, any bouncing will reset timers etc.
            set_timer1(0);
            T1_Overflow = 0;
            Pulse_Time = 0;
            timing = 1;     // Set flag to indicate timing.
            output_high(BLUE_LED);
        }
    }

CCD_ 1标志确保时间不能被CCP1引脚上的另一个脉冲复位。计时器1应重置并开始正常计数。每当它滚动65535(16位设备)时,就会触发另一个中断,之后溢出量就会增加。

    #INT_TIMER1
    void isr()
    {
        T1_Overflow++;
    }

最后,当CCP2上的输入引脚变高时,触发CCP_2中断。这会捕获CCP寄存器的值(即触发中断时Timer0的值)和溢出寄存器。

    #INT_CCP2
    void ccp2_isr()                 
    {   
        if(timing == TRUE){ // only output this when preceded by CCP1
            if(Count_Done == FALSE) // do this once only
            {
                Count_Done = TRUE;  // and also flag to the main routine to output data to the terminal.
                Pulse_time = CCP_2;
                Pulse_Overflow = T1_Overflow;
                measureCount++;     // increment the number of measures.
            }
            output_low(BLUE_LED);
            timing = FALSE;
        }
    }

CCP1现在可以再次开始响应输入。这样做的想法是,每次我在CCP1获得一个输入脉冲,然后是CCP2,就会向终端发送一个字符串,其中包含计数器、溢出次数和计时器中剩余的时间。

    while(TRUE)                        // do forever while connected
    {       
       usb_task();                          // keep usb alive    
       if(Count_Done == TRUE)
       {
           printf(usb_cdc_putc, "%lu , %lu ,  %lu rn",measureCount, pulse_time, pulse_overflow);
           Count_Done = FALSE;
       }

所以,我应该得到一个类似"161553,35"的输出到终端,在CCP1和CCP2之间有大约12毫秒的延迟。问题是,这些是我为电路提供200ms脉冲的结果。(验证两次)

那么我哪里错了。我有一个48MHZ时钟没有预分频器,这意味着每20ns一个周期。除以时钟的每个周期4条指令,这意味着每个周期5.2ns16位定时器,意味着每65535*5.2ns=每次翻转341us。进行计算时(0.000341*脉冲溢出)+脉冲时间*(5.2*(10^-9))则上述数据给出0012.27ms,而不是所提供的200ms。

有人能指出我的计算哪里出了问题吗???

您的错误是"除以时钟的每个周期4条指令,这意味着每个周期5.2ns"

计数器每4个周期滴答一次,而不是每个周期4次。因此,正确的计算是:

2.08333E-08 s/osc 周期

8.33333E-08计时器的秒/分

0.005461333秒/翻转

你落后了16倍。

相关内容

  • 没有找到相关文章

最新更新