【问题标题】:Timer interrupt doesn't run it's service routine in atmel simulation定时器中断在 atmel 仿真中不运行它的服务程序
【发布时间】: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

【问题讨论】:

    标签: assembly interrupt avr atmel


    【解决方案1】:

    您的程序在使用中断之前不会初始化堆栈指针。

    AVR 依赖于堆栈指针,以便知道在RETI 之后程序将继续执行的返回地址放在哪里。 堆栈指针通常通过设置堆栈指针高位SPH 和低位寄存器SPLRAMEND 来初始化为指向最后一个内存位置(堆栈“向后”增长)。 以下代码 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返回。

    【讨论】:

    • 我初始化了堆栈,但我的问题中没有提到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    相关资源
    最近更新 更多