Я бы сказал «да», это возможно, но, возможно, не так, как вы этого хотите (или, может быть, я просто не знаю, как это сделать ^^)
Прежде всего, 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:
}
обратите внимание , чтовам также придется переопределить другие операторы, если вы хотите использовать побитовую адресацию и на своем собственном порту