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

Loops 在8052上启用中断会导致锁定,loops,microcontroller,interrupt,interrupt-handling,8051,Loops,Microcontroller,Interrupt,Interrupt Handling,8051,我目前的问题是,自从我启用了中断,程序就陷入了一个无休止的循环。如果我禁用中断,那么程序将正常执行 我甚至通过将函数中的寄存器(变量)推到堆栈上并在函数退出时将其弹出来确保对它们进行保护,但这并没有帮助 我甚至采取了步骤,甚至只用iret(退出中断)替换函数名,但我仍然面临同样的问题 我现在解决这个问题的唯一方法是通过不执行mov TCON、#50h来禁用中断。这让我觉得在互联网上发布的中断向量地址是不正确的,事实上,错误的代码正在被执行 我使用的微控制器是AT89S52 我的向量寻址到此结束了

我目前的问题是,自从我启用了中断,程序就陷入了一个无休止的循环。如果我禁用中断,那么程序将正常执行

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

我甚至采取了步骤,甚至只用iret(退出中断)替换函数名,但我仍然面临同样的问题

我现在解决这个问题的唯一方法是通过不执行
mov TCON、#50h
来禁用中断。这让我觉得在互联网上发布的中断向量地址是不正确的,事实上,错误的代码正在被执行

我使用的微控制器是AT89S52

我的向量寻址到此结束了吗?我需要一些建议,因为当定时器中断被启用时,我当前在下面使用的代码当前不起作用

org 000h
;程序首次运行时的入口点
ljmp系统初始化;似乎执行
sjmp$
org 00Bh
;定时器0中断每65536个机器周期执行一次,即使定时器1中断执行
ljmp标准
sjmp$
组织01Bh
;定时器1中断每256个机器周期执行一次
ljmp进程密钥
sjmp$
org 030h
开始:
;程序的其余部分在这里。
sysinit:
mov TL0,#0h
移动TH0,#0h
移动TH1,#0h
mov TL1,#0h
移动PSW,#0h
mov R0,#7Fh
;使所有ram地址0h至7Fh包含值0
系统重置:
CLR A
mov@R0,A
djnz R0,系统重置
mov T2CON,#0h;8052寄存器
mov AUXR,#0h;8052寄存器
mov AUXR1,#0h;8052寄存器
mov-PCON,#80h;使波特率除数=192
mov TMOD,#21h;计时器1=0-255,计时器2=0-65535
mov-IP#02h;计时器0的优先级
mov-TCON#50h;计时器打开
mov SP#050h;堆栈=50小时
电影#8Ah ;;ints已启用
ljmp启动

您确定中断服务例程确实清除了中断吗?如果没有,核心将继续努力为他们服务,因此明显被锁定

查看第17页:

定时器2中断由寄存器T2CON中位TF2和EXF2的逻辑OR生成。内- 当服务例程矢量化到时,硬件会清除其中的一个标志。事实上 服务例程可能必须确定生成中断的是TF2还是EXF2, 那个位必须在软件中清除

因此,如果不重置标志,中断将继续触发


为什么要在汇编中编写代码?当然,对于这个功能,您可以使用普通C来代替。

汇编程序是我所拥有的,而且它提供了更多的控制。我已经考虑了您显示的片段,R0表示地址0的内容。因为当R0达到零时,DJNZ不会继续,所以我给循环中地址1到7Fh的值0,在退出时,地址0是0。我读到,除非8052.com上的文献不正确,否则当中断执行时,计时器中断标志会自动清除?我还尝试将中断处理程序转换为只有RETI命令,就是这样,程序仍然产生错误的结果。不知何故,我认为atmel没有提供它需要提供的信息。确保在跳入isr时中断被暂时禁用。但是,如果您不清除中断的原因,它将重新发出。我更新了我的答案,加入了数据表中的一段引用。谢谢,但我没有使用计时器2中断。我只是尝试替换中断代码,以便重置计时器值并清除溢出标志,但仍然没有成功。芯片执行定时器中断时是否有不同的矢量地址?我用nops填充代码,从第三个字节开始,共32个字节,然后在第三个字节后执行中断,但这没有帮助。我也有ea/vpp线绑低,所以它可以访问片上EEPROM。