定时器中断在 atmel 仿真中不运行它的服务程序
Posted
技术标签:
【中文标题】定时器中断在 atmel 仿真中不运行它的服务程序【英文标题】:Timer interrupt doesn't run it's service routine in atmel simulation 【发布时间】:2016-01-23 12:03:01 【问题描述】:我使用“Step Into”对应用程序进行逐行调试。我想使用 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
【问题讨论】:
【参考方案1】:您的程序在使用中断之前不会初始化堆栈指针。
AVR 依赖于堆栈指针,以便知道在RETI
之后程序将继续执行的返回地址放在哪里。
堆栈指针通常通过设置堆栈指针高位SPH
和低位寄存器SPL
到RAMEND
来初始化为指向最后一个内存位置(堆栈“向后”增长)。
以下代码 sn-p 取自 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
把这个sn-p放到你的SEI
当前所在的位置,你的程序应该能够跳转到ISR并从ISR返回。
【讨论】:
我初始化了堆栈,但我的问题中没有提到以上是关于定时器中断在 atmel 仿真中不运行它的服务程序的主要内容,如果未能解决你的问题,请参考以下文章