关于下降沿中断
发现一个很奇怪的现象
用下降沿(由5V变为0的信号)触发中断,该中断为void EInt1_OnInterrupt(void),如下所示。中断发生后iNum++,还有其他一些工作。
这时候,如果先把一个5V的信号加到该管脚(pad0,9s12hz64的pin45),然后在断开该信号,这时候引起一个中断,iNum加一。
但是,如果用一根金属丝触发该管脚,这时候,这个中断会连续的发生,iNum不断递增,知道把该金属丝移开。这是怎么回事呢?难道金属丝还会产生下降沿吗?还有,如果用示波器的探头放到该管脚,这时候并不触发中断。大家说是不是由于示波器探头有去耦处理?于是我并联一个小电容在管脚和地之间,却不能触发中断了。这是什么原因呢?
这个中断我是用PE做的。版本是4.7
/* MODULE Events */
#include "Cpu.h"
#include "Events.h"
#pragma CODE_SEG DEFAULT
extern char sFlag;//进样器动作前的标志位
extern int iNum;//当前第几个试管
extern int j;//当前第几个高(低)电平
extern int jMP1;//电机1已经正转的次数
extern int jMP2;//电机2已经正转的次数
extern int jMP3;//电机3已经正转的次数
extern int jMN1;//电机1已经反转的次数
extern int jMN2;//电机2已经反转的次数
extern int jMN3;//电机3已经反转的次数
extern int iTx;//控制X方向电机M1转动的方波周期
extern int iTy;//控制X方向电机M2转动的方波周期
extern int iTz;//控制X方向电机M3转动的方波周期
extern int imT;
extern void PerPulse(int mP); //通过延迟产生控制电机转动的周期
unsigned int iTT,time1,time2;//
//int ii=0;
/* word result;
word myreturn,oldData;
float one_loop_us;
//char isTwo;//判读是不是连续两次发生中断*/
/*
** ===================================================================
** Event : EInt1_OnInterrupt (module Events)
**
** From bean : EInt1 [ExtInt]
** Description :
** This event is called when an active signal edge/level has
** occurred.
** Parameters : None
** Returns : Nothing
** ===================================================================
*/
//PAD0外部信号下降沿触发
// 在第2.5",1号泵通电,继电器输出5V电平.这里触发外部中断的,就是这个信号的变化
void EInt1_OnInterrupt(void)
{ iNum++;
/* place your EInt1 interrupt procedure body here */
FC161_Enable();
// IEE1_SetWord(0x808,iNum);
// IEE1_GetWord(0x808,&result);
// oldData=result;
//ii++;
//IEE1_SetWord(0x808,0xAA);
//IEE1_GetWord(0x808,&result);
//myreturn=result;
sFlag='T';
//for (iTT = 0; iTT < 60000; ++iTT); /* for-cycle */
//FC161_GetTimeUS(&time1);
/* get measured time of whole for-cycle */
FC161_Reset(); /* reset the counter */
}
金属丝直接接触管脚,相当于管脚悬空
如果金属丝端一端接地,另一端接触管脚,这时候就不连续触发了
下面接一个下拉电阻看看行不行
接一个下拉电阻就可以了
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |