标题:
关于HCS08单片机的问题???
[打印本页]
作者:
win2000_li
时间:
2010-5-6 11:27
标题:
关于HCS08单片机的问题???
单片机:MC9S08SG8
我用其TPM1益出中断做心跳时钟(10ms),TPM1CH1做信号输入捕获(信号来源是
接收无线信号后的数字信号)。
现象是:当捕获信号频率为8K~16K之间时,我的心跳时间就会变化,不稳
定,>10ms,=10ms,<10ms参杂在一齐。比如有30ms,10ms,2ms等等。。
当捕获信号小于8K,大于16K就没有多少影响了。
请各位高手帮兄弟指点一下。。。。。。。。。。
谢谢!~
作者:
win2000_li
时间:
2010-5-6 13:37
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;
}
}
作者:
win2000_li
时间:
2010-5-6 13:39
以上是我的捕获程序,刚才在调试时,把switch以下的所以程序屏蔽掉后。
再进行信号干扰,就不会出现心跳时钟不稳定的清况了。。。。。。。
这是什么问题呢????
作者:
win2000_li
时间:
2010-5-6 14:27
我的总线时钟为4MS, 定时器用总线时钟,分频4.
作者:
win2000_li
时间:
2010-5-6 16:35
请兄弟指点。。。。。。。。。。。。。。。。。。。。
作者:
strongchen
时间:
2010-5-10 11:37
中断服务程序应该尽量简短,可以设一两个标志位,然后让大部分程序在主循环中运行。否则可能会有一些中断标志被漏掉。
作者:
syj518
时间:
2010-5-10 16:04
格力电器
格力小家电
艾美特
美的电水壶
美的电风扇
美的电风扇价格
艾美特电风扇怎么样
格力电风扇
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0