我目前的问题是,自从我启用了中断后,程序就陷入了无限循环。如果我禁用中断,则程序正常执行。
我甚至确保通过将函数中的寄存器(变量)推入堆栈并在函数退出时弹出它们来保护函数中的寄存器(变量),这没有帮助。
我甚至采取了步骤甚至只用iret替换函数名称(退出中断),我仍然面临同样的问题。
我现在解决问题的唯一方法是通过不执行mov TCON,#50h
来禁用中断。这让我觉得互联网上发布的中断向量地址不正确,实际上,正在执行搞砸的代码。
我使用的微控制器是AT89S52。
我的矢量寻址在这里吗?我需要一些建议,因为当启用定时器中断时,我当前使用的代码当前无效。
org 000h
;entry point when program first runs
ljmp sysinit ;seems to execute
sjmp $
org 00Bh
;Timer 0 interrupt executes every 65536 machine cycles even if timer 1 interrupt executes
ljmp crit
sjmp $
org 01Bh
;Timer 1 interrupt executes every 256 machine cycles
ljmp processkey
sjmp $
org 030h
start:
;rest of program goes here.
sysinit:
mov TL0,#0h
mov TH0,#0h
mov TH1,#0h
mov TL1,#0h
mov PSW,#0h
mov R0,#7Fh
;make all ram addresses 0h to 7Fh contain value 0
sysreset:
CLR A
mov @R0,A
djnz R0,sysreset
mov T2CON,#0h ;8052 register
mov AUXR,#0h ;8052 register
mov AUXR1,#0h ;8052 register
mov PCON,#80h ;Make baud divisor=192
mov TMOD,#21h ;Timer1=0-255,Timer2=0-65535
mov IP,#02h ;priority to timer 0
mov TCON,#50h ;timers on
mov SP,#050h ;stack=50h
mov IE,#8Ah ;ints enabled
ljmp start
答案 0 :(得分:0)
您确定中断服务程序实际上清除了中断吗?如果没有,核心将不断尝试为他们服务,因此显而易见的锁定。
查看datasheet pg。 17:
定时器2中断由寄存器T2CON中TF2和EXF2位的逻辑或产生。 NEI- 当服务程序被向量传送时,这些标志的这些标志被硬件清除。事实上, 服务例程可能必须确定是否是产生中断的TF2或EXF2, 那个位必须用软件清除。
因此,如果没有重置标志,你的中断将继续触发。
为什么要在汇编中编写代码?当然,对于此功能,您可以使用普通的C语言。