打印
[DSP编程]

捕获测频技术

[复制链接]
1546|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wang112411|  楼主 | 2013-8-8 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
"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;//开全局中断
         // 返回;
}

相关帖子

沙发
zhangmangui| | 2013-8-8 16:19 | 只看该作者
你把定义的float f这句注释掉看看是什么情况
确实很奇怪   这个警告确定是捕获中断里面的吗
捕获中断能进入吗  其实进不进入  编译器应该不知道啊

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wang112411 + 1
板凳
wang112411|  楼主 | 2013-8-8 16:49 | 只看该作者
zhangmangui 发表于 2013-8-8 16:19
你把定义的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 18:25 | 只看该作者
wang112411 发表于 2013-8-8 16:49
我链接了开发板和仿真器,调试发现中断进去了,是不是因为定时器计数是十六进制计数的,而
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);
}

使用特权

评论回复
5
zhangmangui| | 2013-8-8 18:52 | 只看该作者
wang112411 发表于 2013-8-8 18:25
我又测试了一下,发现是中断没进去,但是不知道那出问题了,为什么中断进不去呢,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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wang112411 + 1
6
wang112411|  楼主 | 2013-8-8 20:43 | 只看该作者
zhangmangui 发表于 2013-8-8 18:52
看看我曾经配置过的
/*配置通用定时器3用于精确时间测量,服务于M/T测速     */
    EvbRegs.T3CNT = 0;  ...

参考你的配置,觉得我的没有问题的啊,可是中断就是进不去,困扰我一天了,只能先放放了,不过还得感谢你的帮助,解决了不少问题!:)

使用特权

评论回复
7
zhangmangui| | 2013-8-8 20:51 | 只看该作者
wang112411 发表于 2013-8-8 20:43
参考你的配置,觉得我的没有问题的啊,可是中断就是进不去,困扰我一天了,只能先放放了,不过还得感谢你 ...

呵呵  不谢  共同进步

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
wang112411 + 2
8
wang112411|  楼主 | 2013-8-9 15:19 | 只看该作者
zhangmangui 发表于 2013-8-8 20:51
呵呵  不谢  共同进步

问题已经解决,好像是没有将捕获单元的中断服务程序入口地址填写到PIE向量表中,
PieVectTable.CAPINT1=&CAPINT_ISR;
因此中断进不去,添加进去之后就OK了,
终于解决了!

使用特权

评论回复
9
zhangmangui| | 2013-8-9 15:53 | 只看该作者
wang112411 发表于 2013-8-9 15:19
问题已经解决,好像是没有将捕获单元的中断服务程序入口地址填写到PIE向量表中,
PieVectTable.CAPINT1= ...

哈哈 这个你没添加肯定进不去啊   要么你要文件里面写好的  要么你就需要赋地址

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
wang112411 + 3
10
wang112411|  楼主 | 2013-8-10 13:18 | 只看该作者
zhangmangui 发表于 2013-8-9 15:53
哈哈 这个你没添加肯定进不去啊   要么你要文件里面写好的  要么你就需要赋地址 ...

昨天仔细检查了一遍,发现了这个问题,疏忽了

使用特权

评论回复
11
aresc| | 2013-8-11 09:49 | 只看该作者
那个warning没错啊,变量f是被set(不是定义)了,但没有使用它。编译器可以认为是没用的,进而优化删掉它。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wang112411 + 1
12
wang112411|  楼主 | 2013-8-11 13:45 | 只看该作者
aresc 发表于 2013-8-11 09:49
那个warning没错啊,变量f是被set(不是定义)了,但没有使用它。编译器可以认为是没用的,进而优化删掉它。 ...

嗯,这个警告说明我的中断没有进去,所以编译器才认为他是没用的吧

使用特权

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

本版积分规则

13

主题

77

帖子

0

粉丝