使用 PIC18f4520 上的 CCP 查找两个事件之间的时间间隔

物联网 微控制器 图片
2021-06-19 08:59:51

我试图计算使用两个事件之间的时间间隔CCPPIC18F4520事件由ccp1ccp2端口上的两个传感器触发我已将 8 的预标量分配给T1CON并且我使用的是 16 MHz 的晶体。(一个时钟周期的持续时间为 2e-6 秒)由于我在溢出之前可以测量的最长时间仅为 0.13 秒(65536 x 2e-6),并且我正在测量的事件持续大约 0.32 秒,因此我决定数一数次TMR1IF溢出,然后将其乘以 65536 并将其添加到捕获的CCPR1H:CCPR1L值中。

但是,我无法计数超出TMR1IF寄存器的一次溢出

希望有人知道为什么!

下面是相关的函数

void ccp_Init(void)
{
    TRISCbits.RC2 = 1;
    TRISCbits.RC1 = 1;
    CCP1CON = 0x05;
    CCP2CON = 0x05;
    T3CON = 0x00;
    PIE1bits.CCP1IE=1;
    PIE2bits.CCP2IE=1;
    T1CON = 0x30;
    TMR1H = 0;
    TMR1L = 0;
    PIR1bits.CCP1IF = 0;
    PIR2bits.CCP2IF = 0;
    PIR1bits.TMR1IF = 0;
}

int ccp_get(void)
{
    int count = 0;
    TMR1L = 0;
    TMR1H = 0;
    while(PIR2bits.CCP2IF == 0);
    T1CONbits.TMR1ON = 1;
    while (PIR1bits.CCP1IF == 0);
    {
        if (PIR1bits.TMR1IF == 1)
        {
            PIR1bits.TMR1IF = 0;
            TMR1L = 0;
            TMR1H = 0;
            count = count+1;
            T1CONbits.TMR1ON = 1;
        }
    }
    T1CONbits.TMR1ON = 0;
    return count;
}

从上面的代码int ccp_get()返回 TMR1IF 溢出的次数并且不会超过 1。

1个回答

这个循环看起来很可疑,尝试删除第一行的分号:

while (PIR1bits.CCP1IF == 0);
{
    if (PIR1bits.TMR1IF == 1)
    {
        PIR1bits.TMR1IF = 0;
        TMR1L = 0;
        TMR1H = 0;
        count = count+1;
        T1CONbits.TMR1ON = 1;
    }
}

总的来说,我建议不要清除定时器计数器。您可能会错过一些中断。翻转后发生溢出,因此该值将已被重置。请参阅第 130 页的数据表,它说:

TMR1 寄存器对 (TMR1H:TMR1L) 从 0000h 递增到 FFFFh 并返回到 0000h。Timer1 中断(如果允许)在溢出时产生,该中断锁存在中断标志位 TMR1IF(PIR1<0>)中。可以通过设置或清零 Timer1 中断允许位 TMR1IE (PIE1<0>)来允许或禁止该中断。