首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于HCS08单片机的问题???

关于HCS08单片机的问题???

单片机:MC9S08SG8

我用其TPM1益出中断做心跳时钟(10ms),TPM1CH1做信号输入捕获(信号来源是

接收无线信号后的数字信号)。

现象是:当捕获信号频率为8K~16K之间时,我的心跳时间就会变化,不稳

定,>10ms,=10ms,<10ms参杂在一齐。比如有30ms,10ms,2ms等等。。

当捕获信号小于8K,大于16K就没有多少影响了。

请各位高手帮兄弟指点一下。。。。。。。。。。

谢谢!~
interrupt 6 void isrVtpm1ch1(void)
{       
        INT8U  DataCnt  = SetZero;
        INT16U TempVale = SetZero;
       
        static INT8U TmpCnt          = SetZero;        // 20100505
        static INT8U TimeOutCNT = SetZero;

        static INT16U TempReValue         = SetZero;    // 20100505
        static INT16U TempRevBuf[2] = {0, 0};       

        TempVale       = TPM1C1SC;
        TPM1C1SC_CH1F  = ClrZero;
       
        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;
                                        //TPM_EDG_ALL;
                                        TPM1C1SC_ELS1B = 1;
                                        TPM1C1SC_ELS1A = 1;
                                }
                        }
                        else if ((TempVale >= MB_TH_MIN) && (TempVale <= MB_TH_MAX))
                        {
                                RkeStep    = MB_DATA;
                                TimeOutCNT = ClrZero;
                                //TPM_EDG_FALLING;
                                TPM1C1SC_ELS1B = 1;
                                TPM1C1SC_ELS1A = 0;
                        }
                        else
                        {
                                RkeStep    = MB_TP;
                                TimeOutCNT = ClrZero;
                                //TPM_EDG_ALL;
                                TPM1C1SC_ELS1B = 1;
                                TPM1C1SC_ELS1A = 1;
                        }
                }break;

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

                case MB_END:
                {
                        if (TRUE == DataSpaceStat)
                        {
                                DataSpaceStat = ClrZero;
                                RkeStep = MB_TP;
                                //TPM_EDG_ALL;
                                TPM1C1SC_ELS1B = 1;
                                TPM1C1SC_ELS1A = 1;
                        }
                }break;       

                default:
                {
                        bitCnt  = ClrZero;
                        RkeStep = MB_TP;
                        TmpCnt  = SetZero;
                       
                        TimeOutCNT  = ClrZero;
                          TempReValue = ClrZero;
                       
                          TempRevBuf[0] = ClrZero;
                        TempRevBuf[1] = ClrZero;
                        DataSpaceStat = ClrZero;
                        RkeStepFinish = ClrZero;
                       
                        //TPM_EDG_ALL;
                        TPM1C1SC_ELS1B = 1;
                        TPM1C1SC_ELS1A = 1;
                }break;
        }
}
以上是我的捕获程序,刚才在调试时,把switch以下的所以程序屏蔽掉后。

再进行信号干扰,就不会出现心跳时钟不稳定的清况了。。。。。。。

这是什么问题呢????
我的总线时钟为4MS, 定时器用总线时钟,分频4.
请兄弟指点。。。。。。。。。。。。。。。。。。。。
中断服务程序应该尽量简短,可以设一两个标志位,然后让大部分程序在主循环中运行。否则可能会有一些中断标志被漏掉。
海纳百川  有容乃大
返回列表