gpt4 book ai didi

C-AVR-简单PORTB、DDRB、PINB解释

转载 作者:太空狗 更新时间:2023-10-29 16:35:08 26 4
gpt4 key购买 nike

我正在做学校项目,需要使用 AVR atmega Controller 学习 C 语言的基础知识。

我不明白一切是如何设置的。例如PORTB、PORTD、DDRB; DDRD、PINB、PIND 等等。而且我不知道 if 语句、while 循环等一切如何运作。

有人可以给我一个简短的解释吗?

我有几行代码...

DDRB = 0b00000011; // I know that here DDRB is set to input/output

还有一个 if 语句:

if (PINB & (1 << PINB0)){
A = true;
}

谁能解释一下这个“if 语句”是如何工作的?为什么 PINB & (1<< PINB0))

谢谢

最佳答案

微处理器使用内存映射将其硬件功能与软件连接起来。

基本上,内存中有静态地址,硬件将使用这些地址来确定其功能。这些特定于制造商、部件,有时甚至是部件的配置方式。

零件的数据表会告诉您控制不同功能的确切内存位置。然而,这通常非常乏味。因此,数据表还将(几乎)始终为描述其功能的内存中的特定位置提供名称。再次重申,这些名称是特定于制造商和零件的。

为了让程序员更容易使用此接口(interface),人们(制造商或社区)通常会为这些内存位置创建宏。例如,您可以找到

// Clock Prescalar Register for ATMega328p
#define CLKPR *0x61

在与部件关联的头文件中(例如 AVR libc)。

现在,写 OSCCAL = 0b10000000 (或者我想写的数据表中的规范允许的任何其他内容)我可以直接访问和更改这部分的时钟预分频器模块。

但是,我们通常对单个位的值感兴趣,而不是整个字节的值。因此,我们使用按位运算符(例如 &|~<< >>)来“屏蔽”我们有兴趣操作的位。

这提供了同时的优势,允许我们只从感兴趣的位读取值,同时不会无意中更改我们不想切换的任何位。

许多位的位置也是由宏给出的。例如,OSCCAL 中的第 7 位被命名为CLKPCE (同样来自数据表)。

CLKPCE 最有可能定义(至少在 AVR libc 中 - 标准不同):

#define CLKPCE 7

因为它定义了到达 OSCCAL 中所需位所需的位移位.

为了在这里谈一点,我可以做几件事。

设置位

要设置该位,我们希望将其设置为 1,而不影响任何其他位。为此,我们使用 OR 掩码,如下所示:

OSCCAL = (OSCCAL | (1 << CLKPCE));

我将留给您审查位运算符并了解其工作原理。

清除位

在这里,我们要将其设为 0,而不影响其他位。它看起来像这样:

OSCCAL = (OSCCAL & ~(1 << CLKPCE));

查询位

查询时,我们需要一个表达式,如果该位已设置 (1),则返回非零,如果该位已清除 (0),则返回零。它看起来像这样:

(OSCCAL & (1 << CLKPCE));

要点

通过将这些不同的按位运算与预定义的宏一起使用,我们可以使用此静态内存映射直接控制和查询硬件的状态。

但是,要理解所有这些宏,您需要查阅(阅读、再阅读、再阅读)您的器件的数据表。幸运的是,Atmel 在您的零件页面上免费提供可搜索的 PDF!

关于C-AVR-简单PORTB、DDRB、PINB解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20993661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com