作者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