Внешнее прерывание ESP8266
- Войдите на сайт для отправки комментариев
Ср, 29/05/2019 - 11:16
Всем привет! Необходимо сделать внешнее прерывание (для обработки кнопок) на ESP8266. Но что-то у меня не получается. Нашел пример: https://mirrobo.ru/c-arduino-ide-esp8266-preryvaniya-interrupt/
Прошивается, но ESP8266 переходит в вечный ребут. Переназначение пина прерывания ни на что не влияет - вечная перезагрузка.
Что можете посоветовать? Как подключить внешнее прерывание на ESP8266?
ESP при этом в сериал выводит следующее:
И так по кругу
Просто процитирую себя же с этого же форума
С другой стороны, НАСТОЙЧИВО НЕ РЕКОМЕНДУЮ (сам обжегся очень) вешать на ESP8266 какие то другие задачи, кроме WiFi, web-сервера и вебинтерфейса. Ну максимум что то простенькое, типа кнопки или датчика температуры. Иначе, ой сколько вам открытий чудных готовит парадоксов друг....
Такую же фигню в сериале я от еспшки видел не раз, после чего зарекся использовать ее как то, кроме как для связи. Как я думаю, Wifi и вся прочая сетевая обвязка очень глубоко лезет в таймеры и прерывания, и совершенно не ясно, где именно и что кому помешает.
Да, вы правы. Отчасти. То что вы говорите 100% верно для Ардуино IDE. Нужно код для ESP писать в специализированной среде...
Проблему решил откатом менеджера плат для ESP на версию 2.4.2. В новых версиях отключена поддержка "чего-то-там.." из-за чего и происходит такой глюк.
Ключевым в вашем выводе с ESP8266 было "
ISR not
in
IRAM!
"Надо объявить вашу функцию до setup() в виде:
void ICACHE_RAM_ATTR function();
Тогда скетч будет нормально работать с функцией function() назначенной прерыванию.
Таким образом надо объявлять дополнительно все функции вызываемые по прерываниям
Это очень правильный совет, а ещё для ESPшек имеет смысл искать решения по коду ошибки и не только на ардуино ресурсах.
Единственное, как мне кажется с таким атрибутом нужно объявлять любую функцию которая используется в пребывании. И не важно до или после сетапа. Кстати по этой причине вызов любой ардуино функции из прерывания вызовет такую же ошибку. Поэтому уж если влезли в прерывания на есп пишите все ручками.
Просто процитирую себя же с этого же форума
С другой стороны, НАСТОЙЧИВО НЕ РЕКОМЕНДУЮ (сам обжегся очень) вешать на ESP8266 какие то другие задачи, кроме WiFi, web-сервера и вебинтерфейса. Ну максимум что то простенькое, типа кнопки или датчика температуры. Иначе, ой сколько вам открытий чудных готовит парадоксов друг....
Такую же фигню в сериале я от еспшки видел не раз, после чего зарекся использовать ее как то, кроме как для связи. Как я думаю, Wifi и вся прочая сетевая обвязка очень глубоко лезет в таймеры и прерывания, и совершенно не ясно, где именно и что кому помешает.
Да, надо понимать что свой скетч - это только часть исполняемого ESP8266 кода. На одном ядре и железе кроме скетча работает и поддержка Wifi. И порядок взаимодействия между нашим скетчем и остальным вобщем то не известен. Но впадать в крайности тоже не стоит. Я писал драйвер Н-моста с ШИМ для управления мотором - работает стабильно, управляется с броузера. В другом проекте - програмный SPI для динамической индикации на десятках светодиодов через регистры. И тоже норма, управляется с броузера. Везде чисто программная реализация. А вот лезть в прерывания и к переферии (кроме пинов) - да черевато сюрпризами, мало информации и коллизии очень вероятны.
Получается камень приятный для програмера, не пугающегося сложной и большой реализации (много памяти, быстрый), но не подходит для челов, предпочитающих глубоко лезть в аппаратную часть контроллера.
В есп невозможно глубоко залезь в железо ибо максимальное дно это API которое предоставляет производитель. Никакого прямого общения с железом, нет. Попытка сразу вызовет системную ошибку. Это ииесть основной минус еспешек.
Никогда не говори никогда. Кому интересно давно знают что там Tensilica’s L106 и даташит на него гуляет по рукам. А отсутствие легальной полной доки - разумеется огромный минус. https://www.itead.cc/wiki/images/2/2d/0A-ESP8266_Specifications_v4.1.pdf явно маловато будет тем кто аппаратную часть ковыряет. А мне и без этого не плохо, даже ЛУА иногда хватает ;)
Ключевым в вашем выводе с ESP8266 было "
ISR not
in
IRAM!
"Надо объявить вашу функцию до setup() в виде:
void ICACHE_RAM_ATTR function();
Тогда скетч будет нормально работать с функцией function() назначенной прерыванию.
Таким образом надо объявлять дополнительно все функции вызываемые по прерываниям
спасибо . Предложенное Вами решение, на версии поддержки платы 2.7.4 тоже прекрасно взлетело.