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