Доступ к физическим контактам Arduino Due из Arduino IDE

pins pinmode

Можно ли получить доступ к физическому контакту 93, контакту PC11 на ATSAM3X8E в Arduino Due из Arduino IDE?

Я программирую Barebone ATSAM3X8E, и он, похоже, не выделяется Arduino Due или ATSAM3X8E для каких-либо других целей, кроме порта ПК.

, 👍1

Обсуждение

вы можете настроить свою собственную плату для Arduino IDE https://arduinoprosto.ru/q/54484/adding-a-custom-board-to-the-arduino-ide/60660#60660, @Juraj


1 ответ


1

Изменение/Создание варианта

Если бы вы хотели сделать это в стиле Arduino, это потребовало бы редактирования Arduino Due variant.cpp или скопируйте свой собственный вариант, скажем, из копии Due, и отредактируйте массив extern const PinDescription g_APinDescription [], чтобы включить запись, соответствующую PC11.

Пример изменений

В качестве эксперимента я внес следующие изменения в файлы в пакетах/arduino/hardware/sam/1.6.12/variants/arduino_due_x в каталоге arduino15.

В variant.cpp, запись в массиве g_APinDescription-это вставка индексного номера 79 между существующими двумя записями (показано для контекста):

  { PIOB, PIO_PB23B_SPI0_NPCS3,ID_PIOB,PIO_PERIPH_B,PIO_DEFAULT, PIN_ATTR_DIGITAL,                  NO_ADC, NO_ADC, NOT_ON_PWM,  NOT_ON_TIMER }, // NPCS3
  // Строка добавления здесь VVVV (это строка для PC12, скопированная с PIO_PC12, измененная на PIO_PC11
  { PIOC, PIO_PC11,          ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL,                  NO_ADC, NO_ADC, NOT_ON_PWM,  NOT_ON_TIMER }, //
  // 79 .. 84 - маски "Все контакты" 

  // 79 - TWI0 все контакты
  { PIOA, PIO_PA17A_TWD0|PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER },

Это копия записи для PC12, с PIO_PC12, измененной на PIO_PC11.

В variant.h PINS_COUNT изменяется на 80u, потому что мы вставили контакт:

#define PINS_COUNT           (80u)

а позже в файле вывод, связанный с CAN, увеличивается на единицу еще и потому, что все они пронумерованы после точки вставки:

/*
 * Complementary CAN pins
 */
static const uint8_t CAN1RX = 89;
static const uint8_t CAN1TX = 90;

// CAN0
#define PINS_CAN0            (91u)
// CAN1
#define PINS_CAN1            (92u)

Я запрограммировал скетч blinks PC11 с помощью digitalWrite(79, state); и осторожно поместил логический зонд на необработанный вывод на плате Due, и он "мигает" просто отлично. Это все, что я проверил.

Прямое управление

С другой стороны, вы можете управлять выводом в своем коде вручную, делая то, что обычно делают digitalWrite или digitalRead. Другими словами, вы можете прочитать описание чего-то вроде digitalWrite здесь и заменить все ссылки, которые он получил бы от g_APinDescription, жестко закодированными значениями.

,

Если у меня будет шанс, я попробую изменить этот вариант здесь. Похоже, что новый контакт должен быть вставлен перед индексом PINS_COUNT, который должен быть увеличен на единицу. И тогда "PINS_COUNT" и несколько других именованных значений для контактов должны будут измениться, чтобы отразить все их индексы, увеличивающиеся на единицу., @timemage

Я сделал шесть изменений линии, указанных, по какой-то причине физический вывод 93, PC11, в нашем скетче на 79, он остается на 3,3 В. Буду продолжать пытаться, @Brethlosze

Вы не забыли pinMode(79, OUTPUT); ?, @timemage

ДА... как и все остальные контакты. Для справки, это 93 - й физический контакт в ATSAM3X8E, он расположен рядом с разъемом A0, на плате Arduino Due., @Brethlosze

Из этого и из обновления я понял, что вы беспокоитесь, что мы говорим не об одном и том же контакте, но я почти уверен, что это так. Вот [контакт, который я устанавливаю](https://imgur.com/a/nUdFbaO) зондировать., @timemage

Верно... Возможно, я упускаю какой-то шаг. Я буду продолжать проверять., @Brethlosze