【问题标题】:AVR interrupt - reset vectors handling in assemblyAVR 中断 - 汇编中的复位向量处理
【发布时间】:2020-01-21 14:16:14
【问题描述】:

我正在使用 AVR ATmega16,我正在尝试实现 一个计数秒数的计数器。我正在使用timer0,以便在重复 16 次的循环中每 1/16 秒产生一次中断。给定微处理器的频率 (f=4Mhz) 和 预分频器 值 (=1024) 我计算出我需要给定时器一个初始值 12

这是我在自己的教科书中找到的示例代码的开头:

.include "m16def.inc"
.equ start = 12
.equ loops = 16
jmp reset
reti (x16)    ;there will be needed a total of 16 reti's in order for the next
              ;instruction to be at 0x12 = 0d18 where the jmp instruction is placed at the 
              ;overflow interrupt handling routine of timer0
jmp TIM0_OVF
reti          ;other Handlers

能否解释一下这两个reti 命令实际上在做什么?它们是如何工作的?代码注释是什么意思?

*让我告诉你,在 ATmega16 上,TIMER0_OVF 向量在 program memory address = 0x12

【问题讨论】:

  • 如果我们假设reti (x16)的意思是“输出16条reti指令”,那么它的目的是用一些东西来填充RESETTIMER0_OVF之间的所有中断向量槽。如果您不关心处理这些中断,那么在每个插槽中放置 reti 似乎是个好主意,因为它只是意味着“从中断中返回”。
  • 哇!这一切都说得通。多谢。如果您愿意,可以将其作为答案发布,以便我接受。谢谢

标签: assembly timer interrupt reset avr


【解决方案1】:

这是ATMega16的中断向量表:

1 $000(1) RESET External Pin, Power-on Reset, Brown-out
Reset, Watchdog Reset, and JTAG AVR
Reset
2 $002 INT0 External Interrupt Request 0
3 $004 INT1 External Interrupt Request 1
4 $006 TIMER2 COMP Timer/Counter2 Compare Match
5 $008 TIMER2 OVF Timer/Counter2 Overflow
6 $00A TIMER1 CAPT Timer/Counter1 Capture Event
7 $00C TIMER1 COMPA Timer/Counter1 Compare Match A
8 $00E TIMER1 COMPB Timer/Counter1 Compare Match B
9 $010 TIMER1 OVF Timer/Counter1 Overflow
10 $012 TIMER0 OVF Timer/Counter0 Overflow
11 $014 SPI, STC Serial Transfer Complete
12 $016 USART, RXC USART, Rx Complete
13 $018 USART, UDRE USART Data Register Empty
14 $01A USART, TXC USART, Tx Complete
15 $01C ADC ADC Conversion Complete
16 $01E EE_RDY EEPROM Ready
17 $020 ANA_COMP Analog Comparator
18 $022 TWI Two-wire Serial Interface
19 $024 INT2 External Interrupt Request 2
20 $026 TIMER0 COMP Timer/Counter0 Compare Match
21 $028 SPM_RDY Store Program Memory Ready

在您显示的代码中,第一个插槽 (RESET) 由 jmp reset 指令填充。您有兴趣填充的下一个槽位是TIMER0_OVF,但在RESETTIMER0_OVF 之间有8 个槽位您应该用something 填充。如果您不关心处理这些中断,用reti(从中断返回)指令可能就足够了。

如果我们假设 reti (x16) 被此汇编器解释为 “输出 16 reti 指令”,那么这将负责填充这 8 个插槽。如果您想知道“为什么 8 个插槽需要 16 条指令?” - 这是因为每个插槽占用 2 个单词(足以容纳 jmp 指令) ,并且单个reti 指令的大小为1 个字。所以你用两条reti 指令填充每个槽,其中第二条没有实际用途。

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 2021-12-20
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多