如何用 AVR 汇编语言在 ATmega328P 上设置 ADMUX 的第 6 位



我正在尝试初始化ADC。第一件事是启用 Vref。为此,我需要设置 ADMUX 的第 6 位。

我尝试过的事情:


sbi ADMUX, 6

错误:I/O out of range (0 <= P <= 31)


ldi r16, 0b01000000
out ADMUX, r16

错误:I/O out of range (0 <= P <= 63)


这些错误甚至意味着什么?请有人帮忙!!

你走在正确的轨道上。问题是这样的:

看《m328Pdef.inc》,ADMUX 0x7C。所以你的

out ADMUX, r16就像写作
out 0x7C, r16 .

outsbi无法"到达"该地址(0x7C(。这正是您遇到那些神秘out of range错误的原因。

看看ATMEL文件,out是为了Store Register to I/O Location。它只能访问属于 I/O 空间的地址。
ADMUXADCSRA等不属于 I/O 空间。
PortAPortB等都属于I/O空间。

因此,我们只需要找到一个可以到达/访问地址的命令 0x7C .其中之一是sts命令。

sts可以到达任何地方!但它也需要 2 个周期才能完成。

您可以通过编写以下内容来解决问题:

ldi r16, 0b01000000
sts ADMUX, r16

最新更新