作者icetofux (豆腐)
看板ASM
標題Re: [請益] 89C51外部中斷小疑問
時間Thu Apr 17 17:55:47 2008
: 1. 中斷時,R0~R7最好和一般的程式用的R0~R7分開(利用切BANK達成)
: 2. 試試看,Good Luck!
參考您的說法,將CODE改寫:
ORG 00H
JMP INITIAL
ORG 03H
JMP SETP2
INITIAL:
MOV IE,
#10000001B
MOV IP,
#00000001B
SETB IT0
JMP START
START:
CLR RS0
CLR RS1
MOV P1,
#00000000B
CALL DELAY
MOV P1,
#11111111B
CALL DELAY
JMP START
SETP2:
SETB RS0
CLR RS1
CLR IE0
MOV P1,
#10101010B
CALL DELAY
MOV P1,
#01010101B
CALL DELAY
MOV P1,
#10101010B
CALL DELAY
MOV P1,
#01010101B
CALL DELAY
MOV P1,
#10101010B
CALL DELAY
MOV P1,
#01010101B
CALL DELAY
CLR RS0
CLR RS1
RETI
DELAY:
MOV R5,#10
D0: MOV R6,#200
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D0
RET
END
發現:
若只針對BANK做切換,仍然會發生問題,但於進入中斷後針對IE0狀態暫存器做
歸零,則可正確的進入REG 03H中斷並於結束後返回被中斷前的位址,故推測進
入中斷後,晶片並未自己將狀態暫存器歸零,要自己手動去做,這點跟參考資料
所述的有點差異。
另外,進入REG 03H後,應該只會交互閃三次:
第一次:01010101->10101010
第二次:01010101->10101010
第三次:01010101->10101010
但是實際上卻交互閃六次:
第一次:01010101->10101010
第二次:01010101->10101010
第三次:01010101->10101010
第四次:01010101->10101010
第五次:01010101->10101010
第六次:01010101->10101010
其中閃LED我是直接採用將值MOV至Port中,並未透過其他暫存器,對於為什麼發生
這個問題,我還是沒有頭緒。
※ 編輯: icetofux 來自: 203.67.181.137 (04/17 17:57)
1F:推 ruemann:1. 中斷返回不是返回0x00 2.閃六次的時間間隔都相同嗎? 04/17 18:41
2F:→ icetofux:抱歉應該是返回中斷前的位址,筆誤已修正原文。 04/17 22:58
3F:→ icetofux:閃六次間隔時間都相同,但是我沒示波器,是算出來DELAY 04/17 22:58
4F:→ icetofux:約0.5秒,實際上差不多也等於0.5秒。 04/17 22:59
※ 編輯: icetofux 來自: 218.167.86.219 (04/17 23:00)
5F:推 ruemann:你的負緣產生是什麼?按鍵? 04/17 23:36
6F:→ icetofux:我是以麵包版插線路,以單心線去碰GND觸發。 04/17 23:39
7F:推 ruemann:那 reti 前面再加一個 clr ie0 看看,不確定原因 04/18 00:02
8F:推 DamonF1:再進入中斷程式先CLR IE0,很有可能是類似彈跳現象 04/18 00:30
9F:→ DamonF1:之前我做過像你的實驗,是用開關的,都有寫軟體防彈跳 04/18 00:31
10F:→ DamonF1:這樣就不會出錯。 04/18 00:31
11F:→ icetofux:在RETI前加入CLR IE0,目前已解決問題。 04/18 09:01
12F:→ icetofux:經過這次測試,是不是代表以後使用各種中斷,在進入 04/18 09:02
13F:→ icetofux:後及離開前都要手動重置狀態暫存器呢? 04/18 09:03