汇编中的 AVR 外部中断触发

Posted

技术标签:

【中文标题】汇编中的 AVR 外部中断触发【英文标题】:AVR External Interrupts Triggering in Assembly 【发布时间】:2021-12-20 21:34:27 【问题描述】:

我想通过在 AVR 汇编代码中触发外部中断(使用引脚 INT0 - PD2)来更改 Arduino Nano (ATMega328p) LED 引脚 (13 - PB5) 状态。

我正在使用 Atmel 的 avrasm2 汇编器编译为 .hex 文件。代码是:

.list               
.org 0x0000
    rjmp main
.org 0x0002 
    rjmp INT0_ISR       
.org INT_VECTORS_SIZE
.def dreg = r18
main:           
    cli                
    ldi r17, LOW(RAMEND)
    out SPL, r17
    ldi r17, HIGH(RAMEND)
    out SPH, r17            ; set Stack Pointer
    sbi DDRB, 0x05          ; set PINB5 as output (Pin 13)
    sbi PORTB, 0x05         ; set PINB5
    cbi DDRD, 0x02          ; set PIND2 as input
    cbi PORTD, 0x02
    ldi r16, 0x01           ; enable external interrupts
    sts EIMSK, r16
    ldi r16, 0x05           ; change triggers
    sts EICRA, r16
    ldi r16, 0x20
    sei    
loop:          
    rjmp loop
INT0_ISR:    
    push r17
    in r17, SREG            ; push status register to SP
    com r16
    out PORTB, r16          ; negate PORTB (PINB5)
    out SREG, r17           ; restore status register
    pop r17            
    reti                    ; return from ISR (INT0)

在 Atmel Studio 的模拟器和微控制器中尝试代码时,未触发 INT0 外部中断。谁能告诉我怎么了?

注意:弹跳效果是硬件解决的,不要介意。

【问题讨论】:

【参考方案1】:

您使用错误的指令将值保存到 EIMSK。 EIMSK 不是内存映射的。 你应该使用out指令

    out EIMSK, r16

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 感谢您的贡献!但是使用 out 或 sts 没有任何效果,模拟器上的 EIMSK 寄存器保持其预期的行为,但无论指令如何,堆栈指针都不会跳转到 ISR... 这是另一个问题。在 AVR 工作室中是标志 在步进时屏蔽中断。您应该将 flag 设置为 false。您可以在 Tools 菜单、Options... 项中找到此标志,然后是 Tools 谢谢,伙计!!!就是这样,你太棒了!

以上是关于汇编中的 AVR 外部中断触发的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言 外部中断

Proteus仿真Arduino UNO利用74LS148扩展中断

汇编语言中断及外部设备操作篇--06

STM8L 外部中断触发方式选择问题

6.STC15W408AS单片机外部中断

6.STC15W408AS单片机外部中断