作者Jhih8051 ()
看板ASM
标题[问题] 8051的外部中断 除弹跳问题
时间Sat May 15 20:33:18 2010
各位高手好,
小弟最近在使用按钮触发8051外部中断的时候,
碰到了弹跳问题,
以往都使用轮询的方式,
例如:
sbit SW = P1^0;
if(SW == 0)
{
delay(); //避开按下去的弹跳现象
要作的动作;
while(SW == 0); //等待放开按钮
delay(); //避开放开的弹跳现象
}
小弟之前使用此种方式,
在轮询的情况下都可以除的还不错,
现在为了改进效能,而使用外部中断的方式,
但是将同样的方式用在外部中断的情况却失败了,
下面是我想做的一个测试,
就只是很简单的按一次,计数变数就+1,如此来确认是否除弹跳,
不知道应该如何改进弹跳现象,
程式如下:
unsigned int cnt=0;
void main(void)
{
EA = 1;
ET0 = 1;
EX0 = 1;
while(1)
{
P2 = cnt;
}
}
void EX0(void) interrupt 0 using 1
{
cnt++;
}
另外想请问,
中断旗标IE0是在进入中断就被清除 or 执行完中断副程式才清除?
又,在中断副程式执行过程中,
如果又发生中断,是否IE0也会被影响?
看似是一个简单不过的问题,
但真的卡很久在这里了,
要麻烦各位高手帮忙 > <"
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.45.141.204
※ 编辑: Jhih8051 来自: 114.45.141.204 (05/15 20:34)
1F:→ kissy:开关弹跳时间,一般来说是22ms(如果我没记错的话-.-) 05/16 01:32
2F:→ kissy:一般来说,中断程式内是很少再触发同样的中断发生(避免BUG) 05/16 01:33
3F:→ kissy:所以如果说要在中断内在中断,程式的架构要很完善 05/16 01:34
4F:→ kissy:至於旗标,一般来说是在要从中断副程式返回时,才会清除重设 05/16 01:35
5F:→ kissy:不过有时在例外情况中,也会有人为重设... 05/16 01:37
6F:→ Jhih8051:我在测试的时候,在cnt++後面丢一个很长的delay 05/16 13:21
7F:→ Jhih8051:就发现P2会在按了+1之後..一段时间又自己多+1 05/16 13:23
8F:→ Jhih8051:而我按键早已放开,所以才会怀疑IE0是否又被致能 05/16 13:23
9F:→ waynecone:你在进入中断副程式时,第一行就将中断智能关闭,等到要 05/16 14:02
10F:→ waynecone:结束中断副程式时再将中断智能打开,这样就好了! 05/16 14:03
11F:→ ksmrt0123:51可设中断priority, low priority中断的ISR会被 high 05/16 20:36
12F:→ ksmrt0123:priority的中断中断. 中断旗标在ISR何处清除没什麽影响 05/16 20:37
13F:推 WolfLord:我觉得.....是不是用错中断的用途了? 05/17 03:00
14F:→ WolfLord:需要DEBUNCE的输入不会快速到非用中断不可,想用自动对应 05/17 03:00
15F:→ WolfLord:用计时器扫描输入会不会比较适当? 05/17 03:01
16F:→ Jhih8051:楼上的意思是在计时中断里丢扫描讯号,然後侦测是否有按? 05/17 14:18
17F:→ Jhih8051:我会问这个问题只是单纯想解决外部中断的弹跳问题@@ 05/17 14:19
18F:推 WolfLord:每隔5-10MS检查,要持续两周期以才才MAKESURE 05/17 14:24
19F:推 WolfLord:一般,INT的输入都是提供给外部电子电路触发的,哪来弹跳 05/17 14:27
20F:推 waynecone:假如真的要用按钮开关触发何不再接个除弹跳电路勒?! 05/17 18:43