Проверить возможности PIN во время компиляции

Существуют ли независимые от платы функции для проверки возможностей pin-контакта во время компиляции?

  • Можно ли использовать pin в качестве вывода, как в digitalWrite()?
  • Поддерживает ли контакт ШИМ, как в analogWrite()?
  • Поддерживает ли пин АЦП, как в analogRead()?
  • Поддерживает ли контакт прерывания, как в attachInterrupt()?

Я ищу функции/макросы, такие как, например, isDigitalOutput(pin), которые возвращали бы false для только входных контактов, таких как A6 и A7 на 328P, но true на Mega, где эти контакты являются входом/выходом.

, 👍0

Обсуждение

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

@Coder9390 Я хотел проверить функцию библиотеки, для которой требуется аналоговый контакт, но я думаю, что просто отброшу эту идею. Ни в коем случае я не собираюсь искать каждый аналоговый штифт на каждой возможной плате., @Dmitry Grigoryev

возможно, проверка определения " A0 " сработает, @jsotola

Firmata содержит большой список определений контактов для плат. Официальная версия https://github.com/firmata/ConfigurableFirmata/blob/master/src/utility/Boards.h немного устарел, но наиболее распространенные Ардуино включены, @PMF

https://github.com/arduino/ArduinoCore-avr/blob/9f8d27f09f3bbd1da1374b5549a82bda55d45d44/variants/mega/pins_arduino.h#L27, @Juraj


1 ответ


1

Для совместимости с analogWrite() есть макрос digitalPinHasPWM(p), который возвращает 1, когда ШИМ поддерживается на выводе p.

Для analogRead() есть analogInputToDigitalPin (), который можно использовать как

#if ((p-PIN_A0 < 0) || (analogInputToDigitalPin(p-PIN_A0) != p))
#error Not an analog pin!
#endif

Для функции attachInterrupt() существует функция digitalPinToInterrupt(p), которая возвращает значение NOT_AN_INTERRUPT, если вывод p не поддерживает прерывания.

Я до сих пор не нашел ничего, чтобы проверить совместимость с digitalWrite().

,

вы спросили о времени компиляции, @Juraj

@Juraj Правильно, " A0 "не является макросом (вместо этого необходимо использовать "PIN_A0")., @Dmitry Grigoryev

но ответ касается времени выполнения, @Juraj

@Juraj Нет, все вышеперечисленные проверки являются макросами., @Dmitry Grigoryev

извините, я понимаю. после редактирования это макрос, @Juraj