捕获测频技术
"DSP28_DefaultIsr.c", line 555: warning: variable "f" was set but never used下面是我的捕获单元的中断函数,分析程序之后觉得应该没问题的啊,但是总是出现说“f”被定义了却被使用,这是什么原因呢?以前也有遇到这类的问题,还请帮忙解决一下,非常感谢!
interrupt void CAPINT1_ISR(void) // 捕获单元1中断
{
unsigned int temp;
unsigned int capnum1;
unsigned int capnum2;
float f;
capnum1=EvaRegs.CAP1FIFO;
capnum2=EvaRegs.CAP1FIFO;
if(capnum2>capnum1)
temp=capnum2-capnum1;
else
temp=capnum2+(0xFFFF-capnum1);
f=2343750.0/(float)temp; //f=150MHZ/64temp=2343750.0/(float)temp
PieCtrl.PIEACK.all=PIEACK_GROUP3; //响应同组其他中断
EvaRegs.EVAIFRC.bit.CAP1INT=1; //清除中断标志位
EINT;//开全局中断
// 返回;
} 你把定义的float f这句注释掉看看是什么情况
确实很奇怪 这个警告确定是捕获中断里面的吗
捕获中断能进入吗其实进不进入编译器应该不知道啊 zhangmangui 发表于 2013-8-8 16:19 static/image/common/back.gif
你把定义的float f这句注释掉看看是什么情况
确实很奇怪 这个警告确定是捕获中断里面的吗
捕获中断能进 ...
我链接了开发板和仿真器,调试发现中断进去了,是不是因为定时器计数是十六进制计数的,而
f=2343750.0/(float)temp; 是将temp按浮点型相除的,所以才有此警告啊,我捕获的频率是1KHZ,调试仿真时按照capnum1和capnum2的示值算出的周期刚好是1khz,而‘f’的显示值是87.98323
EvaRegs.CAP1FIFO 29123 Uint16 unsigned Edited
EvaRegs.CAP1FBOT 31467 Uint16 unsigned Edited
f 87.98323 float float NotEdited
T1CNT 0x07E7 int hex Edited
T2CNT 0x80D5 int hex Edited
所以我猜测是这个问题,你怎么看呢? wang112411 发表于 2013-8-8 16:49 static/image/common/back.gif
我链接了开发板和仿真器,调试发现中断进去了,是不是因为定时器计数是十六进制计数的,而
f=2343750.0/ ...
我又测试了一下,发现是中断没进去,但是不知道那出问题了,为什么中断进不去呢,EV模块的寄存器设置如下:
void InitEv(void)
{
EvaRegs.T1CON.bit.TMODE=1; //连续增减模式
EvaRegs.T1CON.bit.TPS=1; //2分频
EvaRegs.T1CON.bit.TENABLE=0; //暂时禁止T1计数
EvaRegs.T1CON.bit.TCLKS10=0; //使用内部时钟
EvaRegs.T1CON.bit.TECMPR=1; //使用定时器的比较功能
EvaRegs.T1PR=0x493E; //1khz的PWM,周期为1ms
EvaRegs.T1CNT=0; //设置初值为0
EvaRegs.COMCONA.bit.CENABLE=1; //使能比较单元的比较操作
EvaRegs.COMCONA.bit.FCOMPOE=1; //全比较输出,PWM1-6引脚由相应的比较逻辑驱动
EvaRegs.COMCONA.bit.CLD=2; //发生比较立即产生重新装载
EvaRegs.ACTR.all=0x0002; //PWM1低电平有效
EvaRegs.CMPR1=0x2BF2; //PWM1占空比为40%
EvaRegs.T2CON.bit.TMODE=2; //连续增计数模式
EvaRegs.T2CON.bit.TPS=5; //进行64分频
EvaRegs.T2CON.bit.TENABLE=0; //暂时禁止T2的计数操作
EvaRegs.T2CON.bit.TCLKS10=0; //使用内部时钟
EvaRegs.T2PR=0xFFFF; //给T2定时器设终值
EvaRegs.T2CNT=0; //设置计数初值为0
EvaRegs.CAPCON.all=0; //捕获控制寄存器
EvaRegs.CAPCON.bit.CAPQEPN=1; //使能捕获功能
EvaRegs.CAPCON.bit.CAP1EDGE=1; //检测上升沿
EvaRegs.CAPCON.bit.CAP12TSEL=0; //设置捕获单元1的定时器
EvaRegs.CAPFIFO.bit.CAP1FIFO=0; //CAP1FIFO为空
EvaRegs.EVAIMRC.bit.CAP1INT=1; //使能捕获单元1的捕获中断
EvaRegs.EVAIFRC.bit.CAP1INT=1; //清除捕获单元1的捕获中断标志位
}
主函数部分:
#include"DSP28_Device.h"
#include"DSP28_GlobalPrototypes.h"
unsigned int capnum1,capnum2,temp;
float f;
void main(void)
{
InitSysCtrl();
DINT;
IER=0x0000;
IFR=0x0000;
InitPieCtrl();
InitPieVectTable();
InitGpio();
InitEv();
FLAG = 0;
capnum1 = 0;
capnum2=0;
PieCtrl.PIEIER3.bit.INTx3=1;//使能PIE中断,T1定时器中断CAPPINT1位于INT3.5
IER|=M_INT3;//开CPU中断INT3,中断使能寄存器的的第二位
EINT;
ERTM;
EvaRegs.T1CON.bit.TENABLE=1; //使能定时器T1的计数操作
EvaRegs.T2CON.bit.TENABLE=1; //使能定时器T2的计数操作
while(1);
}
wang112411 发表于 2013-8-8 18:25 static/image/common/back.gif
我又测试了一下,发现是中断没进去,但是不知道那出问题了,为什么中断进不去呢,EV模块的寄存器设置如下 ...
看看我曾经配置过的
/*配置通用定时器3用于精确时间测量,服务于M/T测速 */
EvbRegs.T3CNT = 0; //定时器3初始值,用于测量高频脉冲个数,M/T测速
EvbRegs.T3PR = 0xFFFF;
EvbRegs.T3CON.all = 0x1000; //连续增模式,输入时钟预定标为0(HSPCLK=75M,周期为13.33ns)
EvaRegs.CAPCONA.all=0; //复位捕获单元寄存器,QEP电路清0
EvaRegs.CAPCONA.bit.CAP1EDGE=1;//捕获单元检测上升沿
EvaRegs.CAPCONA.bit.CAP12TSEL=0;//捕获单元选择定时器为定时器2
EvaRegs.CAPFIFO.bit.CAP1FIFO=0; //清空CAP1FIFO
// EvaRegs.CAPCONA.bit.CAPRES = 0; //清除所有捕获单元寄存器,QEP电路清0
EvaRegs.EVAIFRC.bit.CAP1INT=1;//清中断标志位
EvaRegs.EVAIMRC.bit.CAP1INT=1;//CAP1中断使能
EvaRegs.CAPCONA.bit.CAPQEPN = 0; //禁止捕获单元1和2
// EvaRegs.T2CON.bit.TENABLE = 1; //使能定时器2
EvaRegs.T2CON.bit.TCLKS10 = 3; //启动T2计数QEP
zhangmangui 发表于 2013-8-8 18:52 static/image/common/back.gif
看看我曾经配置过的
/*配置通用定时器3用于精确时间测量,服务于M/T测速 */
EvbRegs.T3CNT = 0;...
参考你的配置,觉得我的没有问题的啊,可是中断就是进不去,困扰我一天了,只能先放放了,不过还得感谢你的帮助,解决了不少问题!:) wang112411 发表于 2013-8-8 20:43 static/image/common/back.gif
参考你的配置,觉得我的没有问题的啊,可是中断就是进不去,困扰我一天了,只能先放放了,不过还得感谢你 ...
呵呵不谢共同进步 zhangmangui 发表于 2013-8-8 20:51 static/image/common/back.gif
呵呵不谢共同进步
问题已经解决,好像是没有将捕获单元的中断服务程序入口地址填写到PIE向量表中,
PieVectTable.CAPINT1=&CAPINT_ISR;
因此中断进不去,添加进去之后就OK了,
终于解决了! wang112411 发表于 2013-8-9 15:19 static/image/common/back.gif
问题已经解决,好像是没有将捕获单元的中断服务程序入口地址填写到PIE向量表中,
PieVectTable.CAPINT1= ...
哈哈 这个你没添加肯定进不去啊 要么你要文件里面写好的要么你就需要赋地址 zhangmangui 发表于 2013-8-9 15:53 static/image/common/back.gif
哈哈 这个你没添加肯定进不去啊 要么你要文件里面写好的要么你就需要赋地址 ...
昨天仔细检查了一遍,发现了这个问题,疏忽了 那个warning没错啊,变量f是被set(不是定义)了,但没有使用它。编译器可以认为是没用的,进而优化删掉它。
aresc 发表于 2013-8-11 09:49 static/image/common/back.gif
那个warning没错啊,变量f是被set(不是定义)了,但没有使用它。编译器可以认为是没用的,进而优化删掉它。 ...
嗯,这个警告说明我的中断没有进去,所以编译器才认为他是没用的吧
页:
[1]