打印

时序问题

[复制链接]
2005|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
win2000_li|  楼主 | 2009-3-17 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
张老师,我用单片机的定时器输入捕获来抓信号时序。

但是抓出来的值的前部分是错误的,后34位是正确的。

这是为什么呢??

我抓的是上升沿。

后来我改成上升沿和下降沿都抓,来比较两个脉冲宽度大小。来判断是1还是0

结果是很难进入接收完66位数据。但是进入的都是正确的。

请张老师指点!!!!!

相关帖子

沙发
win2000_li|  楼主 | 2009-3-17 15:58 | 只看该作者

是不是我的时序分析错误了。

interrupt 6 void isrVtpm1ch1(void)
{    
    INT8U DataCnt = SetZero;
    
    static INT8U TmpCnt     = SetZero;
    static INT8U bitCnt     = SetZero;    
    static INT8U RkeStep    = SetZero;
    static INT8U TimeOutCNT = SetZero;
    static INT16U TempVale  = SetZero;

    static INT16U TempReValue   = SetZero;
    static INT16U TempRevBuf[2] = {SetZero, SetZero};
    
    TPM1C1SC_CH1F = ClrZero;

    DisableInterrupts;
    DisTpm1Ch1IE;             //Disable TPM1Chn11 Interrupt

    TempRevBuf[1] = TempRevBuf[0];
    TempRevBuf[0] = TPM1C1V;

    if (TempRevBuf[0] > TempRevBuf[1])
    {
        TempVale = TempRevBuf[0] - TempRevBuf[1];
    }
    else
    {
        TempVale = TempRevBuf[0] + T1PERIOD - TempRevBuf[1];
    }

    switch (RkeStep)
    {
        case MB_TP:
        {
            if ((TempVale >= MB_TP_MIN) && (TempVale <= MB_TP_MAX)) 
            {
                TmpCnt++;
                if (MB_TP_CNT == TmpCnt)
                {
                    TmpCnt  = ClrZero;
                    RkeStep = MB_TH;
                }
            }
            else
            {
                RkeStep = MB_TP;
                TmpCnt  = ClrZero;
            }
        }break;

        case MB_TH:
        {
            if ((TempVale >= MB_TP_MIN) && (TempVale <= MB_TP_MAX)) 
            {
                /*if (++TimeOutCNT >= MB_TIME_OUT)
                {
                    RkeStep    = MB_TP;
                    TimeOutCNT = ClrZero;
                }
                */
                ;
            }
            else if ((TempVale >= MB_TH_MIN) && (TempVale <= MB_TH_MAX))
            {
                RkeStep    = MB_DATA;
                TimeOutCNT = ClrZero;
                TPM_EDG_FALLING;
            }
            else
            {
                RkeStep    = MB_TP;
                TimeOutCNT = ClrZero;
                TPM_EDG_ALL;
            }
        }break;

        case MB_DATA:
        {    
            //下降沿
            if ((TPM1C1SC_ELS1B == TRUE) && (TPM1C1SC_ELS1A == FALSE))
            {
                TPM_EDG_RISING;
                if ((TempVale > MB_TE_MIN) && (TempVale < MB_2TE_MAX))
                {
                    TempReValue = TempVale;
                }
                else
                {
                    RkeStep = MB_TP;
                    bitCnt = 0;
                    TPM_EDG_ALL;
                    __asm NOP;
                }
            } //上升沿
            else if ((TPM1C1SC_ELS1B == FALSE) && (TPM1C1SC_ELS1A == TRUE))
            {
                TPM_EDG_FALLING;
                if ((TempVale > MB_TE_MIN) && (TempVale < MB_2TE_MAX))
                {    
                    DataCnt = (bitCnt >> 4);
                    if (TempReValue > TempVale)
                    {
                        RKE_FIFO_DATA[DataCnt] &= (~(1 << (bitCnt & 0x0f)));
                    }
                    else
                    {
                        RKE_FIFO_DATA[DataCnt] |= (1 << (bitCnt & 0x0f));
                    }

                    if (++bitCnt >= MB_TOTAL)
                    {
                        RkeStep       = MB_END;
                        bitCnt          = ClrZero;
                        RkeStepFinish = TRUE;
                        TPM_EDG_ALL;
                    }
                }
                else
                {
                    RkeStep = MB_TP;
                    TPM_EDG_ALL;
                    bitCnt = 0;
                }
                
                
                /*
                DataCnt = (bitCnt >> 4);
                if ((TempVale > MB_TE_MIN) && (TempVale < MB_TE_MAX))
                {
                    RKE_FIFO_DATA[DataCnt] &= (~(1 << (bitCnt & 0x0f)));
                }
                else
                {
                    RKE_FIFO_DATA[DataCnt] |= (1 << (bitCnt & 0x0f));
                }
                

                if (++bitCnt >= MB_TOTAL)
                {
                    RkeStep       = MB_END;
                    bitCnt          = ClrZero;
                    RkeStepFinish = TRUE;
                    TPM_EDG_ALL;
                }
                */
            }
        }break;

        case MB_END:
        {
            if (TRUE == DataSpaceStat)
            {
                DataSpaceStat = ClrZero;
                RkeStep = MB_TP;
                TPM_EDG_ALL;
                RKE_FIFO_DATA[0] = 0;
                RKE_FIFO_DATA[1] = 0;
                RKE_FIFO_DATA[2] = 0;
                RKE_FIFO_DATA[3] = 0;
                RKE_FIFO_DATA[4] = 0;
            }
        }break;

        default:
        {
            TPM_EDG_ALL;
        }break;
    }
    
    EnTpm1Ch1IE;               //enable TPM1Chn11 Interrupt
    EnableInterrupts;
}

使用特权

评论回复
板凳
王培1| | 2009-3-19 12:26 | 只看该作者

还是画个流程图吧

win2000_li ,你要是自己画个流程图一看就知道了

使用特权

评论回复
地板
王培1| | 2009-3-19 12:36 | 只看该作者

这是我以前写的代码,看有没有帮助

/*
** ===================================================================
**     Interrupt handler : CAPtpmch0_isr
**
**     Description :
**         User interrupt service routine. 
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/
__interrupt 5 void CAPtpmch0_isr(void) {
      unsigned int temp;
         TPMC0SC_CH0F = 0;     //清标志
         temp = TPMC0V - lastCap;    //新值-老值
         capFIFO[capPutPtr++] = temp;   //保存差值,方便后面取平均
         lastCap =  TPMC0V;       //保存新值,变为下次的老值
         if(capPutPtr == 0x08)
         SystemFlag.Bits.CaptureEnd = 1;
         capPutPtr &= 0x07;
}
//数据处理
void CaptureCheckData(void) {
unsigned long DataSum = 0;
unsigned char i;
if(SystemFlag.Bits.CaptureEnd) {

SystemFlag.Bits.CaptureEnd = 0;
for(i=0; i<8; i++) {
DataSum += capFIFO;
}
DataSum >>=3;   //连续采样8次,取平均
capAverageData = (unsigned int)DataSum;
_NOP()
}
}
//初始化
void init_CAP(void) {
                                      
  /* TPMC0SC: CH1F=0,CH0IE=1,MS0B=0,MS0A=0,ELS0B=0,ELS0A=1 */
  TPMC0SC = 0x44;                                      

  /* TPMSC: TOF=0,TOIE=0,CPWMS=0,CLKSB=0,CLKSA=1,PS2=0,PS1=0,PS0=0 */
  TPMSC = 0x08;    

}

使用特权

评论回复
5
win2000_li|  楼主 | 2009-3-19 12:58 | 只看该作者

ok

谢谢兄弟的帮助。

我知道了。

原来是我分析时序图时疏忽了。

谢谢您!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

718

帖子

1

粉丝