打印
[技术问题解答]

外部没有脉冲,ECT输入捕捉自动进入中断

[复制链接]
2061|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xwzhao|  楼主 | 2014-9-16 13:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用了开发板上的的例程调试ECT模块的输入捕捉功能,每进入一次输入捕捉中断,给LED灯取反。程序里其他功能都没有使用,ECT的初始化程序就按照例程里的没变,现在问题是:
给输入捕捉的端口一插上杜邦线,另外一头什么都没有接,程序就一直进入输入捕捉中断中,表现在LED灯上一闪一闪的。把线拔了,就不进入中断了。
另外,由于实验需要,老板从我板子上分别引出了5V的线和地线,当我把地线接到示波器上时,有时候就不会再进入输入中断了,会不会是这几根线的问题?
还有,我把板子拿的离电源插座远点,有时候也可以不进入输入捕捉中断,会不会电源有干扰,在把杜邦线接到板子上时,测得的进入中断频率差不多也是200HZ的样子,会不会是电源干扰呢?

相关帖子

沙发
FSL_TICS_Robin| | 2014-9-16 13:32 | 只看该作者
楼主你好
请问你的开发板或芯片具体型号?
以便大家更容易参与此问题的讨论。

使用特权

评论回复
板凳
xwzhao|  楼主 | 2014-9-16 14:26 | 只看该作者
我用的是MC9S12XDT256,后来用了MC9S12XDP512,也有这个问题。下面贴上源程序,
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

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

unsigned int delaytime;
unsigned int time1;
unsigned int time2;
unsigned int data = 0x01;

/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
    CRGINT = 0;                  //关中断
    CLKSEL_PLLSEL = 0;           //在未初始化PLL前不使用PLL的输出作为CPU时钟
   
  #if(BUS_CLOCK == 40000000)
    SYNR = 4;
  #elif(BUS_CLOCK == 32000000)
    SYNR = 3;     
  #elif(BUS_CLOCK == 24000000)
    SYNR = 2;
  #endif

    REFDV = 1;                   //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
    PLLCTL_PLLON = 1;            //开PLL
    PLLCTL_AUTO = 1;             //选取自动模式
    while (CRG标志寄存器_LOCK == 0);    //等待PLL锁定频率
    CLKSEL_PLLSEL = 1;           //选择系统时钟由PLL产生
}

/*************************************************************/
/*                        延时函数                           */
/*************************************************************/
void delay(void)
{
  unsigned int i,j;
  for(j=0;j<2;j++)
  for(i=0;i<60000;i++)
  ;
}

/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void initialize_ect(void){
  TSCR1_TFFCA = 1;  // 定时器标志位快速清除
  TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
  TIOS  = 0xfe;      //指定通道0为输入捕捉方式
  //TCTL4 = 0x01;            // 设置通道0为捕捉上升沿方式
  TCTL4 = 0x02;            // 设置通道0为捕捉下降沿方式
  DLYCT = 0x00;            // 延迟控制功能禁止
  ICOVW = 0x00;            // 对应的寄存器允许被覆盖;  NOVWx = 1, 对应的寄存器不允许覆盖
  ICSYS = 0x00;            // 禁止IC及PAC的保持寄存器
  TIE   = 0x01;     // 允许通道0定时中断
  TSCR2 = 0x07;            // 预分频系数pr2-pr0:111,时钟周期为4us,
  T标志寄存器1 = 0xff;            // 清除各IC/OC中断标志位
  T标志寄存器2 = 0xff;     // 清除自由定时器中断标志位
}

/*************************************************************/
/*                   输入捕捉中断函数                        */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void capture(void)
{
// DisableInterrupts;
if(T标志寄存器1_C0F == 1)
   T标志寄存器1_C0F = 1;
time1 = time2;
time2 = TC0;
delaytime = time2-time1;
LEDCPU = ~LEDCPU;
// EnableInterrupts;
}
/*************************************************************/
/*                          主函数                           */
/*************************************************************/
void main(void) {
  
  DisableInterrupts;
// INIT_PLL();

  //initialize_ect();
  //init_pwm();
  LEDCPU_dir = 1;
  LED_dir = 1;
  LED=~data;          //点亮LED1
  
  EnableInterrupts;

  for(;;)
  { }
}


还请大家帮忙看看,ECT初始化用的是例程的,我觉得没什么问题的啊。后来,接入光栅尺信号,也不会再自动进入输入捕捉中断了。

使用特权

评论回复
地板
FSL_TICS_Robin| | 2014-9-16 14:44 | 只看该作者
Q1:给输入捕捉的端口一插上杜邦线,另外一头什么都没有接,程序就一直进入输入捕捉中断中,表现在LED灯上一闪一闪的。把线拔了,就不进入中断了。
A1:可能你的杜邦线收到了周围电磁信号的干扰导致了电压满足ECT输入。

使用特权

评论回复
5
FSL_TICS_Robin| | 2014-9-16 14:49 | 只看该作者
你周围有200HZ的干扰源吗?
板子上的线引太长是会接收到周围电磁场信号的,所以PCB布线时都有考虑走线。

使用特权

评论回复
6
jd972594| | 2014-9-16 15:07 | 只看该作者
线太长就变成天线接收无线电波啦
示波器表棒悬空也能测出50Hz的工频干扰

使用特权

评论回复
7
xwzhao|  楼主 | 2014-9-16 15:11 | 只看该作者
恩恩,谢谢斑竹的提示~
其实我昨天一开始调试的程序是,用PWM模块发波,然后用定时器PIT器定时10个PWM波的时长,定时时间到则停止PWM波,就相当于发送已知个数的PWM波。然后把从PP口发出的波引入到PT口,用PT口的输入捕捉去计数,即每捕捉到1个脉冲,则给计数变量加1。可是昨天调试的结果是,PIT定时中断进不去,也就意味着PWM波停止不了了,所以程序就一直进入输入捕捉的中断中去了。
单独调试PIT和PWM波,来完成定时时间到停止发波,是可以的。但是加上ECT的输入捕捉后,PIT中断就进不去了,我想会不会是这ECT和PIT中断有冲突,还是要调中断优先级(这块没有接触过),又或是PT和PP口不能直接相连?

使用特权

评论回复
8
xwzhao|  楼主 | 2014-9-16 15:38 | 只看该作者
jd972594 发表于 2014-9-16 15:07
线太长就变成天线接收无线电波啦
示波器表棒悬空也能测出50Hz的工频干扰

恩恩,谢谢提示~
其实我昨天一开始调试的程序是,用PWM模块发波,然后用定时器PIT器定时10个PWM波的时长,定时时间到则停止PWM波,就相当于发送已知个数的PWM波。然后把从PP口发出的波引入到PT口,用PT口的输入捕捉去计数,即每捕捉到1个脉冲,则给计数变量加1。可是昨天调试的结果是,PIT定时中断进不去,也就意味着PWM波停止不了了,所以程序就一直进入输入捕捉的中断中去了。
单独调试PIT和PWM波,来完成定时时间到停止发波,是可以的。但是加上ECT的输入捕捉后,PIT中断就进不去了,我想会不会是这ECT和PIT中断有冲突,还是要调中断优先级(这块没有接触过),又或是PT和PP口不能直接相连?

使用特权

评论回复
9
FSL_TICS_Robin| | 2014-9-17 09:09 | 只看该作者
xwzhao 发表于 2014-9-16 15:11
恩恩,谢谢斑竹的提示~
其实我昨天一开始调试的程序是,用PWM模块发波,然后用定时器PIT器定时10个PWM波的 ...

通常来说哪怕你不改中断优先级,只要高优先级的中断退出后低优先级的中断还是会执行的。
除非你高优先级的中断始终在执行到底无法进入低优先级中断。




使用特权

评论回复
10
FSL_TICS_Robin| | 2014-9-17 09:12 | 只看该作者
另外如果想计PWM个数,不能在PWM 溢出中断里软件计数吗? 没有用过你这款芯片,你看下是否可以实现。Kinetis芯片就可以这么操作:
方法1:在PWM counter溢出中断里软件计数,到达指定数后就停止PWM输出。
方法2:利用LPTMR(计数器模数)输入PWM波形,先指定好比较的上升沿个数,该模块上升沿个数到达指定比较值时触发中断并在中断里关闭PWM。

你可以参考一下,看你的芯片是否有类似模块可以应用。

使用特权

评论回复
11
xwzhao|  楼主 | 2014-9-18 14:45 | 只看该作者
FSL_TICS_Robin 发表于 2014-9-17 09:12
另外如果想计PWM个数,不能在PWM 溢出中断里软件计数吗? 没有用过你这款芯片,你看下是否可以实现。Kineti ...

恩恩,谢谢斑竹~~
我的这款好像pwm好像没有溢出中断的功能;方法2,之前我用ECT模块中的脉冲累加计数器也是这么做的。
另外,现在大多用的是Kinetis芯片吗,好像比9s12的要强很多啊

使用特权

评论回复
12
xwzhao|  楼主 | 2014-9-18 14:48 | 只看该作者
FSL_TICS_Robin 发表于 2014-9-17 09:12
另外如果想计PWM个数,不能在PWM 溢出中断里软件计数吗? 没有用过你这款芯片,你看下是否可以实现。Kineti ...

之前的确是干扰的问题,后来把和PWM口共用的IO的内部下拉器件用上,就可以消除了。

使用特权

评论回复
13
FSL_TICS_Robin| | 2014-9-18 15:09 | 只看该作者
xwzhao 发表于 2014-9-18 14:45
恩恩,谢谢斑竹~~
我的这款好像pwm好像没有溢出中断的功能;方法2,之前我用ECT模块中的脉冲累加计数器也 ...

Kinetis 毕竟是基于ARM Cortex M0+\M4内核32位的芯片,所以各方面性能都强了许多。
现在Cortex内核的芯片比较流行吧。

使用特权

评论回复
14
FSL_TICS_Robin| | 2014-9-18 15:10 | 只看该作者
xwzhao 发表于 2014-9-18 14:48
之前的确是干扰的问题,后来把和PWM口共用的IO的内部下拉器件用上,就可以消除了。 ...

有内部拉电阻就比较方便,否则就要外部加电阻了。
其实也看你光栅输出,如果本身就是开漏输出配上拉电阻这种结构,应该也没啥问题。

使用特权

评论回复
15
xwzhao|  楼主 | 2014-9-18 15:12 | 只看该作者
FSL_TICS_Robin 发表于 2014-9-18 15:10
有内部拉电阻就比较方便,否则就要外部加电阻了。
其实也看你光栅输出,如果本身就是开漏输出配上拉电阻 ...

恩恩~
斑竹,结分怎么结不了啊,提示:分数未分配完,或分数分配存在错误!

使用特权

评论回复
16
FSL_TICS_Robin| | 2014-9-18 15:15 | 只看该作者
xwzhao 发表于 2014-9-18 15:12
恩恩~
斑竹,结分怎么结不了啊,提示:分数未分配完,或分数分配存在错误! ...

结帖方法请参考论坛置顶帖:本论坛中结帖方式

使用特权

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

本版积分规则

2

主题

9

帖子

0

粉丝