Как остановить плавание цифровых контактов при перезагрузке?
У меня есть 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()? Мне совершенно необходимо, чтобы они НЕ были плавающими. Абсолютно.
@Josmund, 👍2
Обсуждение2 ответа
В принципе, вы могли бы установить состояние контакта немного раньше, подключая свой код к последовательности инициализации среды выполнения C. Это, Однако, это даст вам всего несколько микросекунд: контакты все равно будут плавать при загрузке. На программном уровне с этим ничего не поделаешь. Именно так работает микроконтроллер.
Если вам нужно, чтобы контакты никогда не плавали, вам нужно оборудование решение: понизить или повысить их уровень с помощью внешних резисторов.
В некоторых микроконтроллерах есть регистры, позволяющие управлять поведением некоторых выводов во время перезагрузки. Не знаю, так ли это в данном случае. Но, конечно, подходящие внешние резисторы могли бы решить проблему., @jcaron
Если необходимо, чтобы внешнее устройство ввода-вывода удерживало одно из двух состояний во время перезагрузки без увеличения потребляемого тока, может оказаться полезной схема, похожая на «устройство удержания шины».

При включении питания выход по умолчанию будет находиться в состоянии высокого уровня (если на плате есть датчик пониженного напряжения, замените его на RC-цепь). Если на выводе процессора выводится высокий или низкий уровень, выход соответствующим образом переключится, но если вывод процессора находится в состоянии «плавающего» напряжения, выход сохранит своё состояние. Максимальный ток питания для четырёхканальной NAND-памяти TI 74HC00 составляет 2 микроампер при 25 °C или 20 мкА во всём диапазоне температур. Когда вывод процессора находится в состоянии «плавающего» напряжения, в состоянии высокого или низкого уровня, ток не будет постоянно проходить через резистор 10 кОм, но слабая подтяжка вверх или вниз может привести к постоянному току через резистор; таких режимов следует избегать при использовании данной схемы.
- Отправка цифрового сигнала с одного Arduino на другой для запуска события
- Как использовать SPI на Arduino?
- Нажать клавишу Windows, используя «keyboard.press();»
- Как подключить вывод INT MPU 6050?
- Улучшенное циклическое переключение цветов RGB.
- Проблема с загрузкой моего скетча на Ардуино
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- Распиновка аналога Arduino Pro Micro
Вы можете использовать внешние подтягивающие или понижающие резисторы., @liaifat85