看板 ASM 關於我們 聯絡資訊
: 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)
ruemann:1. 中斷返回不是返回0x00 2.閃六次的時間間隔都相同嗎? 04/17 18:41
icetofux:抱歉應該是返回中斷前的位址,筆誤已修正原文。 04/17 22:58
icetofux:閃六次間隔時間都相同,但是我沒示波器,是算出來DELAY 04/17 22:58
icetofux:約0.5秒,實際上差不多也等於0.5秒。 04/17 22:59
※ 編輯: icetofux 來自: 218.167.86.219 (04/17 23:00)
ruemann:你的負緣產生是什麼?按鍵? 04/17 23:36
icetofux:我是以麵包版插線路,以單心線去碰GND觸發。 04/17 23:39
ruemann:那 reti 前面再加一個 clr ie0 看看,不確定原因 04/18 00:02
DamonF1:再進入中斷程式先CLR IE0,很有可能是類似彈跳現象 04/18 00:30
DamonF1:之前我做過像你的實驗,是用開關的,都有寫軟體防彈跳 04/18 00:31
DamonF1:這樣就不會出錯。 04/18 00:31
icetofux:在RETI前加入CLR IE0,目前已解決問題。 04/18 09:01
icetofux:經過這次測試,是不是代表以後使用各種中斷,在進入 04/18 09:02
icetofux:後及離開前都要手動重置狀態暫存器呢? 04/18 09:03