AVR 外部中断在汇编中触发
AVR External Interrupts Triggering in Assembly
我想通过在 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 外部中断未触发。谁能告诉我哪里出了问题?
注意:弹跳效果已通过硬件解决,请不要介意。
您使用了错误的指令将值保存到 EIMSK。 EIMSK 不是内存映射的。
你应该使用out指令
out EIMSK, r16
我想通过在 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 外部中断未触发。谁能告诉我哪里出了问题?
注意:弹跳效果已通过硬件解决,请不要介意。
您使用了错误的指令将值保存到 EIMSK。 EIMSK 不是内存映射的。 你应该使用out指令
out EIMSK, r16