定时器中断在atmel仿真中没有运行它的服务程序

时间:2016-01-23 12:03:01

标签: assembly interrupt avr atmel

我使用' 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

1 个答案:

答案 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返回。