看板 ASM 關於我們 聯絡資訊
各位高手好, 小弟最近在使用按鈕觸發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)
kissy:開關彈跳時間,一般來說是22ms(如果我沒記錯的話-.-) 05/16 01:32
kissy:一般來說,中斷程式內是很少再觸發同樣的中斷發生(避免BUG) 05/16 01:33
kissy:所以如果說要在中斷內在中斷,程式的架構要很完善 05/16 01:34
kissy:至於旗標,一般來說是在要從中斷副程式返回時,才會清除重設 05/16 01:35
kissy:不過有時在例外情況中,也會有人為重設... 05/16 01:37
Jhih8051:我在測試的時候,在cnt++後面丟一個很長的delay 05/16 13:21
Jhih8051:就發現P2會在按了+1之後..一段時間又自己多+1 05/16 13:23
Jhih8051:而我按鍵早已放開,所以才會懷疑IE0是否又被致能 05/16 13:23
waynecone:你在進入中斷副程式時,第一行就將中斷智能關閉,等到要 05/16 14:02
waynecone:結束中斷副程式時再將中斷智能打開,這樣就好了! 05/16 14:03
ksmrt0123:51可設中斷priority, low priority中斷的ISR會被 high 05/16 20:36
ksmrt0123:priority的中斷中斷. 中斷旗標在ISR何處清除沒什麼影響 05/16 20:37
WolfLord:我覺得.....是不是用錯中斷的用途了? 05/17 03:00
WolfLord:需要DEBUNCE的輸入不會快速到非用中斷不可,想用自動對應 05/17 03:00
WolfLord:用計時器掃描輸入會不會比較適當? 05/17 03:01
Jhih8051:樓上的意思是在計時中斷裡丟掃描訊號,然後偵測是否有按? 05/17 14:18
Jhih8051:我會問這個問題只是單純想解決外部中斷的彈跳問題@@ 05/17 14:19
WolfLord:每隔5-10MS檢查,要持續兩週期以才才MAKESURE 05/17 14:24
WolfLord:一般,INT的輸入都是提供給外部電子電路觸發的,哪來彈跳 05/17 14:27
waynecone:假如真的要用按鈕開關觸發何不再接個除彈跳電路勒?! 05/17 18:43