怎么解决的,我测50HZ的信号,有跳变,我是在CAP中断里读CAPFIFO进行计算的,那样跳变的厉害,我又该成在CAP中断里读T3CNT的数进行计算,条变好点,还是解决不了问题,我是T3为时基,检测上升沿,中断程序为:
unsigned char k=0,flag1=0,frec1=0,frec=0,f_flag=0x66,ff=0,d=0;
float f=0,temp=0;
// 定义的中断次数值
// 系统初始化子程序
void initial()
{
asm(\" setc INTM\"
; // 禁止所有中断
asm(\" setc SXM\"
; // 抑制符号位扩展
asm(\" clrc OVM\"
; // 累加器中结果正常溢出
asm(\" clrc CNF\"); // B0被配置为数据存储空间
SCSR1=0x81FE; // CLKIN=10M,CLKOUT=4CLKIN=40M
WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
// 即WD保护位复位后的缺省值为1,故可以用
// 软件禁止看门狗
IMR=0x0000; // 禁止所有中断
IFR=0x0FFFF; // 清除全部中断标志,\"写1清0\"
}
// 捕获单元4初始化子程序
void CAP4INT()
{
MCRC=MCRC|0X0080;
PEDATDIR=0X0000;
T3PR=0X0FFFF; // 通用定时器3的周期寄存器为0XFFFF
T3CON=0x1400; // 通用定时器3为连续增计数模式 X/16;
T3CNT=0X00; // 计数器清0
WSGR=0x0000; // 禁止所有等待状态
CAPCONB=0X0A240; // 设置捕获单元4为检测上升沿,且选择TIMER3为时钟
asm(\" clrc INTM\"); // 开总中断
IMR=0X08; // 允许中断优先级4的中断
EVBIMRC=EVBIMRC|0X0001; // 允许CAPTURE1中断
EVBIFRC=EVBIFRC|0X0FFFF;
}
// 主程序
main()
{
initial(); // 系统初始化
CAP4INT(); // 捕获单元4初始化
T3CON=T3CON|0X0040; // 启动定时器3
while(1)
{
;;// if(k==10) break; // k保存中断次数值,是全局变量
}
// asm(\" setc INTM\"); // 捕捉10次后,禁止再中断
}
// 若是由于干扰引起其它中断,则执行此子程序
void interrupt nothing()
{
asm(\" clrc INTM\"); // 返回前开中断
return;
}
// 捕捉中断服务程序
void interrupt capint()
{
int flag,i=0;
flag=EVBIFRC&0X01; // 判断是否是CAP4中断
if(flag!=0x01)
{
asm(\" clrc INTM\"); // 返回前开中断
return; // 如果不是CAP4中断,则直接返回
}
else
{
i=PEDATDIR&0x0080;
d=0;
d=i;//(i&0x80);
if(d==0)
{
EVBIFRC=EVBIFRC|0x01;
asm(\" clrc INTM\");
return;
}
EVBIFRC=EVBIFRC|0x01; // 写\"1\"清除CAP4中断标志
if(f_flag==0x66)
{
frec=T3CNT;
f_flag=0;
}
else
{
frec1=T3CNT;
if(frec1>frec)
{
temp=(frec1-frec);
}
else
{
temp=frec1+(0xffff-frec);
}
f=2500000/(float)temp; //f= 40M/16/temp
f_flag=0x66;
}
asm(\" clrc INTM\"); // 返回前开中断
return;
}
}
请指点那里设置的不对!!!