Re: [請益] 89C51外部中斷小疑問

看板ASM (組合語言)作者 (豆腐)時間16年前 (2008/04/17 17:55), 編輯推噓4(409)
留言13則, 3人參與, 最新討論串3/3 (看更多)
: 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)

04/17 18:41, , 1F
1. 中斷返回不是返回0x00 2.閃六次的時間間隔都相同嗎?
04/17 18:41, 1F

04/17 22:58, , 2F
抱歉應該是返回中斷前的位址,筆誤已修正原文。
04/17 22:58, 2F

04/17 22:58, , 3F
閃六次間隔時間都相同,但是我沒示波器,是算出來DELAY
04/17 22:58, 3F

04/17 22:59, , 4F
約0.5秒,實際上差不多也等於0.5秒。
04/17 22:59, 4F
※ 編輯: icetofux 來自: 218.167.86.219 (04/17 23:00)

04/17 23:36, , 5F
你的負緣產生是什麼?按鍵?
04/17 23:36, 5F

04/17 23:39, , 6F
我是以麵包版插線路,以單心線去碰GND觸發。
04/17 23:39, 6F

04/18 00:02, , 7F
那 reti 前面再加一個 clr ie0 看看,不確定原因
04/18 00:02, 7F

04/18 00:30, , 8F
再進入中斷程式先CLR IE0,很有可能是類似彈跳現象
04/18 00:30, 8F

04/18 00:31, , 9F
之前我做過像你的實驗,是用開關的,都有寫軟體防彈跳
04/18 00:31, 9F

04/18 00:31, , 10F
這樣就不會出錯。
04/18 00:31, 10F

04/18 09:01, , 11F
在RETI前加入CLR IE0,目前已解決問題。
04/18 09:01, 11F

04/18 09:02, , 12F
經過這次測試,是不是代表以後使用各種中斷,在進入
04/18 09:02, 12F

04/18 09:03, , 13F
後及離開前都要手動重置狀態暫存器呢?
04/18 09:03, 13F
文章代碼(AID): #181nwbWQ (ASM)
文章代碼(AID): #181nwbWQ (ASM)