Как остановить плавание цифровых контактов при перезагрузке?

У меня есть LattePanda 3 Delta, на основном процессоре которого работает Windows, а на сопроцессоре — скетч Arduino StandardFirmata. Он подключен к замку, который запирается при высоком уровне сигнала и отпирается при низком.

При загрузке/перезагрузке LattePanda возникает короткий промежуток времени, когда блокировка выходит из строя. Мне удалось исправить худшее, явно задав значения пинов по умолчанию в setup(), но, похоже, пины сбрасываются ещё до того, как setup() успевает запуститься.

Метод setup() теперь выглядит так:

void setup() {

  // ВЫХОДНЫЕ контакты
  for (int i = 0; i <= 6; i++) {
    pinMode(i, OUTPUT);
  }

  for (int i = 18; i <= 20; i++) {
    pinMode(i, OUTPUT);
  }

  // ВХОДНЫЕ контакты
  for (int i = 7; i <= 13; i++) {
    pinMode(i, INPUT_PULLUP);
  }

  for (int i = 21; i <= 23; i++) {
    pinMode(i, INPUT_PULLUP);
  }

  Firmata.begin(57600);
  Firmata.setFirmwareVersion(FIRMATA_FIRMWARE_MAJOR_VERSION, FIRMATA_FIRMWARE_MINOR_VERSION);
  Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
  Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback);
  Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
  Firmata.attach(REPORT_DIGITAL, reportDigitalCallback);
  Firmata.attach(SET_PIN_MODE, setPinModeCallback);
  Firmata.attach(SET_DIGITAL_PIN_VALUE, setPinValueCallback);
  Firmata.attach(START_SYSEX, sysexCallback);
  Firmata.attach(SYSTEM_RESET, systemResetCallback);

  while (!Serial) {;}
  systemResetCallback();
}

Есть ли способ установить значения пинов ещё до setup()? Мне совершенно необходимо, чтобы они НЕ были плавающими. Абсолютно.

, 👍2

Обсуждение

Вы можете использовать внешние подтягивающие или понижающие резисторы., @liaifat85


2 ответа


11

В принципе, вы могли бы установить состояние контакта немного раньше, подключая свой код к последовательности инициализации среды выполнения C. Это, Однако, это даст вам всего несколько микросекунд: контакты все равно будут плавать при загрузке. На программном уровне с этим ничего не поделаешь. Именно так работает микроконтроллер.

Если вам нужно, чтобы контакты никогда не плавали, вам нужно оборудование решение: понизить или повысить их уровень с помощью внешних резисторов.

,

В некоторых микроконтроллерах есть регистры, позволяющие управлять поведением некоторых выводов во время перезагрузки. Не знаю, так ли это в данном случае. Но, конечно, подходящие внешние резисторы могли бы решить проблему., @jcaron


1

Если необходимо, чтобы внешнее устройство ввода-вывода удерживало одно из двух состояний во время перезагрузки без увеличения потребляемого тока, может оказаться полезной схема, похожая на «устройство удержания шины».

схема

При включении питания выход по умолчанию будет находиться в состоянии высокого уровня (если на плате есть датчик пониженного напряжения, замените его на RC-цепь). Если на выводе процессора выводится высокий или низкий уровень, выход соответствующим образом переключится, но если вывод процессора находится в состоянии «плавающего» напряжения, выход сохранит своё состояние. Максимальный ток питания для четырёхканальной NAND-памяти TI 74HC00 составляет 2 микроампер при 25 °C или 20 мкА во всём диапазоне температур. Когда вывод процессора находится в состоянии «плавающего» напряжения, в состоянии высокого или низкого уровня, ток не будет постоянно проходить через резистор 10 кОм, но слабая подтяжка вверх или вниз может привести к постоянному току через резистор; таких режимов следует избегать при использовании данной схемы.

,