`noInterrupts()` заставляет arduino больше не отображаться в портах
Минимальный рабочий пример:
void setup() {
// инициализируем цифровой вывод LED_BUILTIN как выход.
noInterrupts();
pinMode(LED_BUILTIN, OUTPUT);
}
// функция цикла запускается снова и снова навсегда
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // включаем светодиод (HIGH - уровень напряжения)
delay(1000); // ждем секунду
digitalWrite(LED_BUILTIN, LOW); // выключаем светодиод, понижая напряжение
delay(1000); // ждем секунду
}
При загрузке в мой Arduino Nano 3.3v BLE с моего M1 Mac Nano больше не отображается в меню портов. Чтобы он снова появился, мне нужно дважды нажать кнопку сброса на Nano, чтобы он сбрасывался на сценарий по умолчанию. После этого Nano снова будет доступен в меню портов.
Я также не могу увидеть Nano через cat /dev/cu.<TAB>
, когда на него загружен этот скрипт.
Кто-нибудь знает, почему это происходит? Или, в качестве альтернативы (если это предполагаемое поведение), почему это не задокументировано в interrupts()
или noInterrupts
?
Я просмотрел несколько других сообщений, но не думаю, что они дублируют это:
- Какие функции отключены с помощью noInterrupts()?: не выделяет поведение, которое я видел в MWE.
- Попытка понять взаимодействие прерываний, noInterrupts и задержек: дает интересные методы для прерываний и встроенного программирования, но не упоминает поведение, которое я видел
Редактирует в ответ на ответы
Таким образом, MWE не совсем точно описал мою проблему, и некоторые ответы зациклились на этом (это моя вина). Я включил более подробное описание того, что я делаю ниже, чтобы описать, что я на самом деле делаю, но я также принял ответ, который, я думаю, отвечает на суть вопроса «почему прерывания заставляют Nano работать». не появляется в порту?".
На самом деле у меня есть два Arduino Nano (назовем их основным и дополнительным), подключенные через I2C и Wire.h
. Каждый Arduino nano считывает 15 аналоговых входов (через мультиплексор). Затем вторичный Nano отправляет свои 15 аналоговых показаний первичному через I2C. Но у меня в аналоговых показаниях первичного Nano много шума, а во вторичном шумов нет. Этот шум исчезает, когда я отключаю I2C. Итак, моя теория заключалась в том, что цифровые провода SCL и SDA вызывали шум в проводах аналоговых датчиков, но я заметил, что шум будет возникать только в течение ~ 2 мс каждые ~ 10 мс. Я подумал, что отключу прерывания (и, следовательно, отключу Wire.h
от пульсирующего SCL/SDA), пока считываю аналоговые датчики основного устройства, а затем включу прерывания. Из-за этого Nano не отображался на вкладке «Порты», а остальное — результат этого поста.
Теперь я думаю, что не включил подтягивающий резистор 4,7 Ом в SDA и SCL, который, кажется, включен только в официальные примеры Arduino и никогда в какие-либо случайные примеры из Интернета.
@beyarkay, 👍-1
Обсуждение1 ответ
Лучший ответ:
Я не очень хорошо разбираюсь в Nano 3.3v BLE, однако оказалось, что он напрямую подключен к USB-порту, поэтому отключение прерываний также лишает его возможности реагировать на рукопожатия USB, поэтому он будет отображаться для хост, что он был отключен.
У оригинального Nano был отдельный чип (FT232RL), который обрабатывал интерфейс USB, поэтому отключение прерываний на этом Arduino не приводило к разрыву USB-соединения.
Или, в качестве альтернативы (если это задуманное поведение), почему это не задокументировано в interrupts() или noInterrupts?
Возможно, документация не обновлялась до более поздних выпусков продукта. Нередко документация отстает от того, что на самом деле делают выпущенные продукты.
Как указывает timemage в другом ответе, ваши попытки мигать светодиодами с отключенными прерываниями не увенчаются успехом. На самом деле отключение прерываний должно выполняться только на миллисекунды, а не навсегда. Я предполагаю, что это демонстрационный скетч, но все же... если вы отключите прерывания только на короткое время, проблема должна исчезнуть.
Да, я добавил уточнение о типичной временной шкале примерно за две минуты до того, как пришел этот ответ. Так что, вероятно, его не было, когда вы сочиняли. Это хорошее замечание о документации. Большая часть этого действительно ориентирована на ранние платы., @timemage
Спасибо! Да, светодиодная часть MWE на самом деле не имела отношения к полной проблеме, но вы все равно ответили на основной вопрос, почему это происходит. Я собираюсь отправить PR, чтобы обновить документы. Есть идеи, это только Nano или есть и другие платы?, @beyarkay
Меня не удивит, если это будет связано с более современными платами с новыми процессорами, однако я не в курсе, какие они могут быть., @Nick Gammon
@NickGammon Я избавился от своего ответа. Их вопрос, по-видимому, сейчас касается I2C... или что-то в этом роде. Не заинтересован в погоне за переопределением., @timemage
- Использование millis() и micros() внутри процедуры прерывания
- Подсчет импульсов с прерыванием
- Устранение дребезга кнопки с помощью прерывания
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- Почему необходимо использовать ключевое слово volatile для глобальных переменных при обработке прерываний в ардуино?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Использование поворотных энкодеров с прерываниями смены контактов
- Arduino непрерывно считывает значение АЦП с помощью прерывания
Я понятия не имею, что такое MWE, и вы отредактировали свой вопрос до такой степени, что мой ответ больше не синхронизировался с ним., @timemage
Извините, MWE=минимальный рабочий пример., @beyarkay