我使用' Step Into'用于app的行到行调试。我想使用Timer1溢出中断,定时器溢出但中断没有运行它的服务程序。有什么问题?
.INCLUDE "M32DEF.inc"
.ORG 0
JMP MAIN
.ORG 0x12
JMP TOV_1
.ORG 0x100
MAIN:
LDI R16, 0xFF
OUT TCNT1H, R16
LDI R16, 0xF0
OUT TCNT1L, R16
;START Timer1
LDI R16, 0
OUT TCCR1A, R16
LDI R16, 1
OUT TCCR1B, R16
;Init Timer1 Interrupt
LDI R16, (1<<TOIE1)
OUT TIMSK, R16
SEI
A:
RJMP A
.ORG 0x200
TOV_1:
INC R20
RETI
答案 0 :(得分:1)
您的程序在使用中断之前不会初始化堆栈指针。
AVR依赖于堆栈指针,以便知道在RETI
之后将程序执行继续的返回地址放在何处。
堆栈指针通常通过将堆栈指针设置为高SPH
并将低寄存器SPL
设置为RAMEND
来初始化为指向最后一个存储器位置(堆栈增长&#39;向后&#39;)。
以下代码段摘自ATmega32 datasheet第45页。
RESET: ldi r16,high(RAMEND) ; Main program start out SPH,r16 ; Set Stack Pointer to top of RAM ldi r16,low(RAMEND) out SPL,r16 sei
将此代码段放到当前SEI
所在的位置,您的程序应该可以跳转并从ISR返回。