定时器中断在 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 和低位寄存器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返回。

【讨论】:

我初始化了堆栈,但我的问题中没有提到

以上是关于定时器中断在 atmel 仿真中不运行它的服务程序的主要内容,如果未能解决你的问题,请参考以下文章

Proteus仿真定时器1外部计数中断

蓝桥杯单片机定时器与中断秒表实验+Proteus仿真

Proteus仿真51单片机外部中断控制输出10秒,后关闭输出

51单片机定时器中断

在 atmel 工作室中观察状态随时间的变化?

SylixOS定时器测试误差分析