Сделайте «виртуальный порт», который состоит из нескольких портов на Arduino - PullRequest
0 голосов
/ 18 февраля 2019

Я начал использовать порты на Arduino вместо того, чтобы вручную устанавливать каждый пин-код на низкий или высокий.Это очень полезно и намного быстрее.Я нахожусь на проекте, где мне нужен по крайней мере один полный порт (8 бит) и по крайней мере один последовательный порт.

Я хотел использовать Arduino UNO, но он имеет только один полный порт, порт D. PD0 и PD1 используются для последовательной связи.Это означает, что я не могу использовать порт D.

Мне было интересно, есть ли возможность для меня объединить несколько портов в «виртуальный порт».В конце концов я хочу что-то вроде этого:

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

Возможно ли это каким-либо образом ???

1 Ответ

0 голосов
/ 19 февраля 2019

Я бы сказал «да», это возможно, но, возможно, не так, как вы этого хотите (или, может быть, я просто не знаю, как это сделать ^^)

Прежде всего, PORTS - это макросы от Atmel.Ваш Arduino-Uno основан на AtMega328p и поэтому использует AVR-Toolchain со всеми этими PORTS под капотом.Если бы вы собирались запрограммировать свой микроконтроллер без arduino-bootloader и всей этой фантастической библиотеки arduino, вы бы обратились ко всем своим GPIO таким образом.

Если вы посмотрите на код Atmel-AVR Toolchain (над которым стоит arduino), вы увидите, что PORTS определены в iom328p.h и являются только адресами внутренних регистров ввода-вывода в микроконтроллере.

Итак, просто объявляемВиртуальный порт не так прост (может быть, с каким-то отображением памяти с чем-то похожим на std::mmap(), но я никогда не пробовал это).

В любом случае вы программист, так что есть решениепочти всегда;) Я бы лично предложил создать свой собственный Port -Класс:

  • , этот класс содержит необходимые Pins как члены, и у вас есть установщик, который перезаписывает ваш член-Пины в соответствии с числом, которое вы передаете ему
  • (этот код не предназначен для «идеального» решения, просто быстрая подсказка в направлении)

Я бы порекомендовал вам остаться с Arduino-библиотекой для этого подхода.Если вы сделаете это с помощью простого PORTS, вы можете что-нибудь испортить.Так, например, если вы инициируете ваш SerialPort, а затем делаете что-то вроде 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:
}

обратите внимание , чтовам также придется переопределить другие операторы, если вы хотите использовать побитовую адресацию и на своем собственном порту

...