打印

两个dsp2812的捕获中断(cap)的编程问题

[复制链接]
7560|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
汉唐风2009|  楼主 | 2010-1-7 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位朋友好!
      我的DSP2812的板子,原来我做了一路CAP中断来测量脉冲的频率,能实现频率测量。因为有几路脉冲信号需要测量频率,我修改程序后,只有原来的cap1能实现中断测量频率,增加的cap3不能测量频率,连中断都不进入。我附上程序,请各位朋友帮我查查,谢谢!!

void main(void)
{
/*初始化系统*/
InitSysCtrl();// 090717看门狗、PLL、时钟设置
/*关中断*/
// 090717 清除所有CPU中断
DINT;
IER = 0x0000; //Interrupt enable register
IFR = 0x0000; //Interrupt flag register
/*初始化PIE*/
InitPieCtrl(); //090717 PIE:外设中断
/*初始化PIE中断矢量表*/
InitPieVectTable();

/*初始化外设*/
    InitPeripherals();
    /*初始化GPIO*/
InitGpio(); //Set GPIO F port

InitXIntrupt();
// InitEv();//090721
flag_capint1=0;
flag_capint3=0;

EALLOW; // This is needed to write to EALLOW protected registers
// PieVectTable.T1PINT = &eva_timer1_isr;//090717 中断服务程序入口地址放入中断向量表,如下interrupt void eva_timer1_isr(void)
// PieVectTable.T2PINT = &eva_timer2_isr;
// PieVectTable.T3PINT = &evb_timer3_isr;
// PieVectTable.T4PINT = &evb_timer4_isr;
PieVectTable.CAPINT1= &CAPINT1_ISR;
PieVectTable.CAPINT3= &CAPINT3_ISR;

EDIS;   // This is needed to disable write to EALLOW protected registers
/*
    // Enable PIE group 2 interrupt 4 for T1PINT
    PieCtrl.PIEIER2.all = M_INT4;
    // Enable PIE group 3 interrupt 1 for T2PINT
    PieCtrl.PIEIER3.all = M_INT1;   
    // Enable PIE group 4 interrupt 4 for T3PINT
    PieCtrl.PIEIER4.all = M_INT4;
    // Enable PIE group 5 interrupt 1 for T4PINT
    PieCtrl.PIEIER5.all = M_INT1;
*/
PieCtrl.PIEIER3.bit.INTx5=1;//20090721  Enable PIE group 3 interrupt x for CAPINT1
PieCtrl.PIEIER3.bit.INTx7=1;//20100107  Enable PIE group 3 interrupt x for CAPINT3 ?
    // Enable CPU INT2 for T1PINT, INT3 for T2PINT, INT4 for T3PINT
    // and INT5 for T4PINT:
// IER |= (M_INT2 | M_INT3 | M_INT4 | M_INT5);//090717 #define M_INT2 0x0002(即IER的第2位、第3位、第4位、第5位都被置1)
IER |= M_INT3;// capture enable      
    // Enable global Interrupts and higher priority real-time debug events:

EINT;   // Enable Global interrupt INTM (090717 Enable interrupts by clearing the INTM status bit.)
ERTM; // Enable Global realtime interrupt DBGM
// Step 6. IDLE(空闲) loop. Just sit and loop forever:
// Freq_Adjust(1000,0x00,0x40);
for(;;)
{
  if(flag_capint1)//光电
  {
   flag_capint1=0;
   
    temp=(pinlvf[0]+pinlvf[1]+pinlvf[2]+pinlvf[3]+pinlvf[4])/5;
//   pinlv= 234375.0/(float)temp;//f= 15M/64/temp  SysCtrlRegs.PLLCR = 0x00;///锁相环直通方式,15M      
   pinlv= 234375.0*6/(float)temp;//f= 90M/64/temp  SysCtrlRegs.PLLCR = 0x00;///锁相环直通方式,15*6M  
//   pinlv=f;
   FQUD=0;
//   Freq_Adjust(pinlv,0x00,0x40);   
   
  }
  if(flag_capint3)//雷达
  {
   flag_capint3=0;
   
    temp=(pinlvf3[0]+pinlvf3[1]+pinlvf3[2]+pinlvf3[3]+pinlvf3[4])/5;
//   pinlv= 234375.0/(float)temp;//f= 15M/64/temp  SysCtrlRegs.PLLCR = 0x00;///锁相环直通方式,15M      
   pinlv= 234375.0*6/(float)temp;//f= 90M/64/temp  SysCtrlRegs.PLLCR = 0x00;///锁相环直通方式,15*6M  
//   pinlv=f;
   FQUD=0;
   Freq_Adjust(pinlv,0x00,0x40);   
   
  }  


interrupt void CAPINT3_ISR(void)    // EV-A
{
  // Insert ISR Code here

//090718 到下090718处,为增加捕获方式测频程序
unsigned int temp;
    EvaRegs.EVAIFRC.bit.CAP3INT=1;// 清捕获中断1标志位
    cap3num1=EvaRegs.CAP3FIFO;  //所有FIFO堆栈的顶层堆栈寄存器是只读寄存器,当读取FIFO堆栈的顶层寄存器的计数值时,
    cap3num2=EvaRegs.CAP3FIFO;  //堆栈底层寄存器的新计数值(如果有)将被压入顶层寄存器。090721
    if(cap3num2 > cap3num1)
     temp = cap3num2-cap3num1;
    else
        temp = cap3num2+(0xFFFF-cap3num1);
    pinlvf3[fnum++] =temp;
    if(fnum>4)
    {
     fnum=0;//取5个数值后回零  
        flag_capint3=1;  
    }
//     f= 234375.0/(float)temp;//f= 15M/64/temp  SysCtrlRegs.PLLCR = 0x00;///锁相环直通方式,15M
    PieCtrl.PIEACK.bit.ACK3 = 1;//开外设中断应答  
   
//    flag_capint1=1;
//090718====
  // To recieve more interrupts from this PIE group, acknowledge this interrupt
  // PieCtrl.PIEACK.all = PIEACK_GROUP3;  
  // Next two lines for debug only - remove after inserting
  // ISR Code
   //asm ("      ESTOP0");
   //for(;;);
  // Uncomment this line after adding ISR Code
   return;
}

cesunew.rar

4.77 KB

相关帖子

沙发
碧血黄花| | 2010-1-7 12:26 | 只看该作者
测量脉冲的频率需要CAP吗?
改外部时钟输入口!!不需要中断来做

使用特权

评论回复
板凳
kingxq| | 2010-3-28 09:37 | 只看该作者
关注中

使用特权

评论回复
地板
wang112411| | 2013-8-9 12:58 | 只看该作者
碧血黄花 发表于 2010-1-7 12:26
测量脉冲的频率需要CAP吗?
改外部时钟输入口!!不需要中断来做

楼主想做的是捕获测频,

使用特权

评论回复
5
wang112411| | 2013-8-9 13:06 | 只看该作者
楼主啊,我遇到你这样类似的问题,不知道你的解决了没有,
capnum1=EvaRegs.CAP1FIFO;
capnum2=EvaRegs.CAP1FIFO;
这样设置,我运行时通过观察窗口,得到的值,capnum1和capnum2是一样的值,这是怎么回事啊?!
是不是中断没进去呢?测频的话得到两组不同的值才对啊
希望楼主见到后帮帮忙,我做的是电网测频

使用特权

评论回复
6
threetigher| | 2013-8-30 00:34 | 只看该作者
顶起,lz的问题解决了没

使用特权

评论回复
7
tianwen_4524| | 2013-8-30 17:37 | 只看该作者
关注,学习!!!

使用特权

评论回复
8
yuspace| | 2014-8-3 20:11 | 只看该作者
谢谢

使用特权

评论回复
9
西门龙| | 2015-11-5 10:08 | 只看该作者
wang112411 发表于 2013-8-9 13:06
楼主啊,我遇到你这样类似的问题,不知道你的解决了没有,
capnum1=EvaRegs.CAP1FIFO;
capnum2=EvaRegs.C ...

你好,您所说的问题解决了么,我现在遇到跟您一样的问题了,不知道是怎么回事

使用特权

评论回复
10
xerez08| | 2016-6-2 20:30 | 只看该作者
LZ的问题解决了没?同样问题求解惑~~~

使用特权

评论回复
11
xerez08| | 2016-6-2 20:33 | 只看该作者
wang112411 发表于 2013-8-9 13:06
楼主啊,我遇到你这样类似的问题,不知道你的解决了没有,
capnum1=EvaRegs.CAP1FIFO;
capnum2=EvaRegs.C ...

哥们,我也遇到了类似的问题,通过变量窗口看到的值是一样的。不知道现在有否答案,求请教。

使用特权

评论回复
12
yuhang1991| | 2016-6-4 22:33 | 只看该作者
捕获的值一样是正常的,看你后面是怎么做的处理,如果捕获后寄存器的值不清零,就是两个寄存器的值相减;如果捕获后寄存器的值设置为清零,则捕获的值就是计算频率所要的值。

使用特权

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

本版积分规则

11

主题

17

帖子

1

粉丝