首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建一个由Arduino上的多个端口组成的“虚拟端口”

创建一个由Arduino上的多个端口组成的“虚拟端口”
EN

Stack Overflow用户
提问于 2019-02-18 19:18:48
回答 1查看 961关注 0票数 6

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

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

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

代码语言:javascript
运行
复制
PORTX = 0b11111111; // the first 2 bits are PB0/PB1 and bit 3-8 are PD3-PD8

这有可能吗?

EN

回答 1

Stack Overflow用户

发布于 2019-02-19 10:14:04

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

首先,PORTS是来自Atmel的宏。您的Arduino-Uno是基于AtMega328p,因此使用AVR-工具链与所有的PORTS在引擎盖下。如果你要在没有arduino引导加载程序和所有花哨的arduino库的情况下编程你的微控制器,你会用这种方式来处理你所有的GPIOs。

如果您查看Atmel-AVR工具链( arduino所处的)的代码,您会发现,PORTS是在iom328p.h中定义的,并且仅是微控制器内部IO寄存器的地址。

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

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

  • 这个类作为成员保存所需的Pins,并且有一个setter,它根据传递给它的数字覆盖您的成员-Pins。
  • (这段代码并不意味着是“完美的”解决方案,只是简单地提示一下方向)

我建议您在arduino库中使用这种方法。如果你用普通的PORTS做这件事,你可能会在某个地方搞砸了。因此,例如,如果您插入SerialPort,然后执行类似于PORTD |= (1<<PD0)的操作,您将无法接收任何数据,并且不知道原因。

代码语言:javascript
运行
复制
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:
}

请注意,如果您也希望在您自己的端口上按位寻址,则也必须重写其他运算符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54753964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档