AVR 中断 - 汇编中的复位向量处理
AVR interrupt - reset vectors handling in assembly
我正在使用 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
上
这是ATMega16的中断向量table:
1 [=10=]0(1) RESET External Pin, Power-on Reset, Brown-out
Reset, Watchdog Reset, and JTAG AVR
Reset
2 [=10=]2 INT0 External Interrupt Request 0
3 [=10=]4 INT1 External Interrupt Request 1
4 [=10=]6 TIMER2 COMP Timer/Counter2 Compare Match
5 [=10=]8 TIMER2 OVF Timer/Counter2 Overflow
6 [=10=]A TIMER1 CAPT Timer/Counter1 Capture Event
7 [=10=]C TIMER1 COMPA Timer/Counter1 Compare Match A
8 [=10=]E TIMER1 COMPB Timer/Counter1 Compare Match B
9 0 TIMER1 OVF Timer/Counter1 Overflow
10 2 TIMER0 OVF Timer/Counter0 Overflow
11 4 SPI, STC Serial Transfer Complete
12 6 USART, RXC USART, Rx Complete
13 8 USART, UDRE USART Data Register Empty
14 A USART, TXC USART, Tx Complete
15 C ADC ADC Conversion Complete
16 E EE_RDY EEPROM Ready
17 0 ANA_COMP Analog Comparator
18 2 TWI Two-wire Serial Interface
19 4 INT2 External Interrupt Request 2
20 6 TIMER0 COMP Timer/Counter0 Compare Match
21 8 SPM_RDY Store Program Memory Ready
在您显示的代码中,第一个插槽 (RESET
) 由 jmp reset
指令填充。您感兴趣的下一个空位是 TIMER0_OVF
,但在 RESET
和 TIMER0_OVF
之间有 8 个空位您应该用 东西 填充。如果您不关心处理这些中断,用 reti
(来自中断的 RETurn)指令填充它们可能就足够了。
如果我们假设 reti (x16)
被该汇编程序解释为 "output 16 reti
instructions",那么这将负责填充这 8 个槽。如果您想知道 "why 16 instructions for 8 slots?" - 那是因为每个插槽占用 2 words(足以容纳 jmp
指令),单个 reti
指令的大小为 1 个字。因此,您用两条 reti
指令填充每个插槽,其中第二条指令没有实际用途。
我正在使用 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
这是ATMega16的中断向量table:
1 [=10=]0(1) RESET External Pin, Power-on Reset, Brown-out
Reset, Watchdog Reset, and JTAG AVR
Reset
2 [=10=]2 INT0 External Interrupt Request 0
3 [=10=]4 INT1 External Interrupt Request 1
4 [=10=]6 TIMER2 COMP Timer/Counter2 Compare Match
5 [=10=]8 TIMER2 OVF Timer/Counter2 Overflow
6 [=10=]A TIMER1 CAPT Timer/Counter1 Capture Event
7 [=10=]C TIMER1 COMPA Timer/Counter1 Compare Match A
8 [=10=]E TIMER1 COMPB Timer/Counter1 Compare Match B
9 0 TIMER1 OVF Timer/Counter1 Overflow
10 2 TIMER0 OVF Timer/Counter0 Overflow
11 4 SPI, STC Serial Transfer Complete
12 6 USART, RXC USART, Rx Complete
13 8 USART, UDRE USART Data Register Empty
14 A USART, TXC USART, Tx Complete
15 C ADC ADC Conversion Complete
16 E EE_RDY EEPROM Ready
17 0 ANA_COMP Analog Comparator
18 2 TWI Two-wire Serial Interface
19 4 INT2 External Interrupt Request 2
20 6 TIMER0 COMP Timer/Counter0 Compare Match
21 8 SPM_RDY Store Program Memory Ready
在您显示的代码中,第一个插槽 (RESET
) 由 jmp reset
指令填充。您感兴趣的下一个空位是 TIMER0_OVF
,但在 RESET
和 TIMER0_OVF
之间有 8 个空位您应该用 东西 填充。如果您不关心处理这些中断,用 reti
(来自中断的 RETurn)指令填充它们可能就足够了。
如果我们假设 reti (x16)
被该汇编程序解释为 "output 16 reti
instructions",那么这将负责填充这 8 个槽。如果您想知道 "why 16 instructions for 8 slots?" - 那是因为每个插槽占用 2 words(足以容纳 jmp
指令),单个 reti
指令的大小为 1 个字。因此,您用两条 reti
指令填充每个插槽,其中第二条指令没有实际用途。