在8052上启用中断会导致锁定

时间:2017-05-28 22:59:43

标签: loops microcontroller interrupt interrupt-handling 8051

我目前的问题是,自从我启用了中断后,程序就陷入了无限循环。如果我禁用中断,则程序正常执行。

我甚至确保通过将函数中的寄存器(变量)推入堆栈并在函数退出时弹出它们来保护函数中的寄存器(变量),这没有帮助。

我甚至采取了步骤甚至只用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

1 个答案:

答案 0 :(得分:0)

您确定中断服务程序实际上清除了中断吗?如果没有,核心将不断尝试为他们服务,因此显而易见的锁定。

查看datasheet pg。 17:

  

定时器2中断由寄存器T2CON中TF2和EXF2位的逻辑或产生。 NEI-   当服务程序被向量传送时,这些标志的这些标志被硬件清除。事实上,   服务例程可能必须确定是否是产生中断的TF2或EXF2,   那个位必须用软件清除。

因此,如果没有重置标志,你的中断将继续触发。

为什么要在汇编中编写代码?当然,对于此功能,您可以使用普通的C语言。