打印
[8/16-bit MCU]

ECT输入捕捉功能定时器中断程序问题(已解决)

[复制链接]
3999|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
williamstar|  楼主 | 2014-3-11 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 FSL_TICS_A 于 2014-4-1 10:06 编辑

请教各位老师,这里的
time1 = time2;
time2 = ECT_TC0;
delaytime = time2-time1;
有什么作用?(XET256MAL)
/*************************************************************/
/*                   输入捕捉中断函数                        */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void capture(void)
{
if(ECT_T标志寄存器1_C0F == 1)
   ECT_T标志寄存器1_C0F = 1;
time1 = time2;
time2 = ECT_TC0;
delaytime = time2-time1;
LEDCPU = ~LEDCPU;
}
#pragma CODE_SEG DEFAULT


全部的程序代码:
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define BUS_CLOCK                   32000000           //总线频率
#define OSC_CLOCK                   16000000           //晶振频率

unsigned int delaytime;
unsigned int time1;
unsigned int time2;

/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk
    PLLCTL &= 0x8F;       //Disable PLL circuit
    CRGINT &= 0xDF;
   
    #if(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif

    REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
    PLLCTL =PLLCTL|0x70;  //Enable PLL circuit
    asm NOP;
    asm NOP;
    while(!(CRG标志寄存器&0x08)); //PLLCLK is Locked already
    CLKSEL |= 0x80;        //set PLLCLK as sysclk
}
/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void initialize_ect(void){
  ECT_TSCR1_TFFCA = 1;  // 定时器标志位快速清除
  ECT_TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
  ECT_TIOS  = 0xfe;      //指定通道0为输入捕捉方式
  ECT_TCTL4 = 0x03;            // 设置通道0为捕捉下降沿方式
  ECT_DLYCT = 0x00;            // 延迟控制功能禁止
  ECT_ICOVW = 0x00;            // 对应的寄存器允许被覆盖;  NOVWx = 1, 对应的寄存器不允许覆盖
  ECT_ICSYS = 0x00;            // 禁止IC及PAC的保持寄存器
  ECT_TIE   = 0x01;     // 使能通道0定时中断
  ECT_TSCR2 = 0x07;            // 预分频系数pr2-pr0:111,,时钟周期为4us,
  ECT_T标志寄存器1 = 0xff;            // 清除各IC/OC中断标志位
  ECT_T标志寄存器2 = 0xff;     // 清除自由定时器中断标志位
}
/************************************************************/
/*                      延时程序                            */
/************************************************************/
void delay(void)
{
   unsigned int i,j;
   for(j=0;j<50;j++) {
   
   for(i=0;i<50000;i++);
   }
}
/*************************************************************/
/*                   输入捕捉中断函数                        */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void capture(void)
{
if(ECT_T标志寄存器1_C0F == 1)
   ECT_T标志寄存器1_C0F = 1;
time1 = time2;
time2 = ECT_TC0;
delaytime = time2-time1;
LEDCPU = ~LEDCPU;
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/*                          主函数                           */
/*************************************************************/
void main(void) {
  DisableInterrupts;
  INIT_PLL();
  initialize_ect();
  //init_pwm();
  LEDCPU_dir = 1;
  EnableInterrupts;
  LEDCPU = 0;
  DDRK_DDRK1=1;
  for(;;)
  {
     PORTK_PK1=1;
     delay();
     PORTK_PK1=0;
     delay();
  }
}

相关帖子

沙发
FSL_TICS_Robin| | 2014-3-11 13:38 | 只看该作者
计算出2次输入捕获的counter差值,counter的频率应该是已知的

使用特权

评论回复
板凳
williamstar|  楼主 | 2014-3-11 21:52 | 只看该作者
FSL_TICS_Robin 发表于 2014-3-11 13:38
计算出2次输入捕获的counter差值,counter的频率应该是已知的

但是time1,time2,delaytime只是被赋值,没有被使用啊

使用特权

评论回复
地板
FSL_TICS_Robin| | 2014-3-12 09:11 | 只看该作者
本帖最后由 FSL_TICS_Robin 于 2014-3-12 09:12 编辑
williamstar 发表于 2014-3-11 21:52
但是time1,time2,delaytime只是被赋值,没有被使用啊

请问楼主的程序是从哪下载的?
这些都是全局变量,可能在其他地方被使用了。

我没有使用过你的这款芯片。
但是就输入捕获功能来说,通过记录两次输入捕获时刻的counter值,经相减后就能得出两次捕获的counter差。
而counter的时钟一般都是已知的,根据时钟频率推算一个counter的时间,再以之前两次counter差的个数就能够计算出两次捕获的时间差了。
(当然这是需要你的两次捕获时间间隔中未发生counter溢出复位的情况)

使用特权

评论回复
5
williamstar|  楼主 | 2014-3-12 10:18 | 只看该作者
FSL_TICS_Robin 发表于 2014-3-12 09:11
请问楼主的程序是从哪下载的?
这些都是全局变量,可能在其他地方被使用了。

这个程序是我买的开发板里配套的学习程序,是个独立的程序。多谢指点,结合您的思路,我再研读下datasheet~

使用特权

评论回复
6
FSL_TICS_Robin| | 2014-3-12 11:38 | 只看该作者
williamstar 发表于 2014-3-12 10:18
这个程序是我买的开发板里配套的学习程序,是个独立的程序。多谢指点,结合您的思路,我再研读下datashee ...

恩 好的 如果遇到什么问题,可以再讨论。
因为我在4#楼的描述,是根据Kinetis芯片使用时得出的经验,所以对已你这款芯片可能有点区别。
你可以根据芯片手册看下相关输入捕获的描述。

使用特权

评论回复
7
FSL_TICS_Robin| | 2014-3-17 14:04 | 只看该作者
楼主你好,不知此问题是否已经得到解决?
如果问题尚未解决,你可以继续在此提问。
如果问题已经解决,请按照https://bbs.21ic.com/icview-692566-1-1.html帖子描述操作结贴。
谢谢配合

使用特权

评论回复
8
lefeng| | 2015-7-3 21:42 | 只看该作者
输入捕获是,通过记录两次输入捕获时刻的counter值,经相减后,得出两次捕获的counter差

使用特权

评论回复
9
大苏牙| | 2015-7-5 21:07 | 只看该作者
计算出2次输入捕获的counter差值,counter的频率应该是已知的

使用特权

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

本版积分规则

3

主题

11

帖子

0

粉丝