gpt4 book ai didi

arduino - 在Arduino上制作一个由多个端口组成的 "virtual port"

转载 作者:行者123 更新时间:2023-12-02 11:05:52 27 4
gpt4 key购买 nike

我开始使用 Arduino 上的端口,而不是手动将每个引脚设置为低电平或高电平。这非常有用并且速度更快。我正在进行一个项目,其中我需要至少一个完整端口(8 位)和至少一个串行端口。

我想使用 Arduino UNO,但它只有一个完整端口,端口 D。 PD0和PD1用于串行通信。这意味着我无法使用端口 D。

我想知道是否有可能将多个端口合并为“虚拟端口”。最后我想要这样的东西:

PORTX = 0b11111111; // the first 2 bits are PB0/PB1 and bit 3-8 are PD3-PD8

这有可能吗???

最佳答案

我会说“是的”这是可能的,但可能不是你想要的方式(或者也许我只是不知道该怎么做^^)

首先,PORTS是 Atmel 的宏。您的 Arduino-Uno 基于 AtMega328p,因此使用 AVR 工具链以及所有这些 PORTS在引擎盖下。如果您要在没有 arduino-bootloader 和所有奇特的 arduino-library-stuff 的情况下对微 Controller 进行编程,您将通过这种方式寻址所有 GPIO。

如果您查看 Atmel-AVR 工具链(arduino 位于其上)的代码,您会看到 PORTS定义于 iom328p.h和 只是微 Controller 内内部 IO 寄存器的地址。

所以,仅仅声明一个虚拟端口并不那么容易(也许使用一种类似于 std::mmap() 的内存映射,但我从未尝试过这个)。

无论如何,你是一名程序员,所以几乎所有事情都有解决方案;)我个人建议,创建您自己的 Port -类别:

  • 此类包含您所需的Pins作为成员(member),您有一个 setter ,它会根据您传递给它的编号覆盖您的成员(member) Pin 图
  • (此代码并不意味着是“完美”的解决方案,只是快速提示方向)

我建议您继续使用 arduino-library 来实现这种方法。如果你用简单的 PORTS 来做到这一点,你可能会在某个地方弄乱一些东西。例如,如果您初始化串行端口,然后执行类似 PORTD |= (1<<PD0) 的操作,您将无法接收任何数据并且不知道为什么。

class MyPort
{
private:
uint8_t m_pin[8];
public:
MyPort(uint8_t pins[8])
{
for(int i=0; i<8; ++i)
{
m_pin[i] = pins[i]; //copy from constructor-argument into member-variable
pinMode(pins[i], OUTPUT); //setting pin as OUTPUT
}
}

void operator =(uint8_t val)
{
for(int i=0; i<8; ++i)
{
digitalWrite(m_pin[i], (val >> i)&1);
}
}
};

// B0,B1,D2,D3,D4,D5,D6,D7
// v v v v v v v v
uint8_t pins[]{8, 9, 2, 3, 4, 5, 6, 7};
MyPort PORTX(pins);

void setup()
{
PORTX = 0b11001100;
}

void loop()
{
// put your main code here, to run repeatedly:
}

请注意,如果您也想在自己的端口上按位寻址,则还必须覆盖其他运算符

关于arduino - 在Arduino上制作一个由多个端口组成的 "virtual port",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54753964/

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