AVR 是否可以间接寻址IO端口

AVR Is it possible to address IO ports indirectly

我有一个问题:

是否可以像这样间接寻址 AVR 控制器的 I/O 端口:

out r16, r19

感谢您的帮助

根据官方instruction manual,不幸的是指令inout不支持间接寻址。但是您可以改用加载(ldldsldd)和存储(ststsstd)指令。它们通常用于更复杂(具有更多外围设备)AVR 微控制器的 I/O 操作,但也应该适用于小于 0x60 的 I/O 地址。

引自说明书:

Note: Some complex AVR Microcontrollers have more peripheral units than can be supported within the64 locations reserved in the opcode for I/O direct addressing. The extended I/O memory from address 64to 255 can only be reached by data addressing, not I/O addressing.

这些简单的间接寻址示例(GNU 汇编程序)应该可以工作:

/* Load DDRA I/O address into RAMPX (r26, r27) */
clr r27;
ldi r26, 0x21;
/* Store value 0xFF into specific (DDRA) register */
ldi r16, 0xFF;
st X, r16;

以上示例使用来自 ATMEGA2560 的 DDRA I/O 端口。有关正确的 I/O 地址,请参阅特定设备的数据表。