CCS PICC CCP设置

时间:2014-10-18 21:24:38

标签: c microcontroller benchmarking

(我很乐意发布代码,如果有人可以指出如何在不使用无效的4空间缩进系统的情况下将其粘贴到此处)

大家好 经过大约9个小时的绞尽脑汁,我无法找到答案或找到我的计算错误的地方......但它们确实如此。 我有一个使用微芯片18F2550微控制器构建的电路。 我正在使用此电路来测量2个信号之间的延迟,并在捕获模式下使用2个CCP寄存器。 这一切都有效,结果发送到PC(通过USB串口)所有花花公子,但结果是错误的。 我必须对任何结果应用~16000的增益才能到达引脚延迟附近的某处。

我在行中设置了延迟 Timer1设置为内部
Timer3被禁用
启用相关中断

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

    #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);
        }
    }

timing标志确保CCP1引脚上的另一个脉冲不能复位时间。 然后应复位Timer1并正常开始计数。每次它滚动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 \r\n",measureCount, pulse_time, pulse_overflow);
           Count_Done = FALSE;
       }

所以,我应该在CCP1和CCP2之间的延迟~12ms之间输出一个类似“1,61553,35”的终端输出。 问题是这些是我为电路提供的200ms脉冲所得到的结果。 (已验证两次)

所以我哪里错了。 我有一个没有预分频器的48MHZ时钟,这意味着每20ns就有一个周期。 时钟每个周期除以4个指令,每个周期意味着5.2ns 16位定时器,意味着每翻转每65535 * 5.2ns = 341us翻转。 当你做计算时(0.000341 * pulse_overflow)+ pulse_time *(5.2 *(10 ^ -9)) 那么上面的数据给出了0012.27ms而不是200ms。

有人能指出我在这些计算中出错了吗?

1 个答案:

答案 0 :(得分:1)

你的错误在"每个周期划分为4个指令,每个周期意味着5.2ns"

计数器每4个循环滴答一次,而不是每个循环4次。所以,正确的计算是:

2.08333E-08 s / osc的周期

8.33333E-08 s /计时器滴答

0.005461333 s / rollover

你的关系是16倍。