Внешнее прерывание ESP8266

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем привет! Необходимо сделать внешнее прерывание (для обработки кнопок) на ESP8266. Но что-то у меня не получается. Нашел пример: https://mirrobo.ru/c-arduino-ide-esp8266-preryvaniya-interrupt/ 
Прошивается, но ESP8266 переходит в вечный ребут. Переназначение пина прерывания ни на что не влияет - вечная перезагрузка.

Что можете посоветовать? Как подключить внешнее прерывание на ESP8266?

forfrends
Offline
Зарегистрирован: 24.02.2015

ESP при этом в сериал выводит следующее:

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16 
tail 8
chksum 0x2d
csum 0x2d
v8b899c12
~ld
ISR not in IRAM!

Abort called

>>>stack>>>

ctx: cont
sp: 3ffffdb0 end: 3fffffc0 offset: 01b0
3fffff60:  feefeffe 00000001 3ffee254 3ffee2ac  
3fffff70:  3fffdad0 00000001 3ffee254 3ffee2ac  
3fffff80:  3fffdad0 00000000 3ffee27c 40100452  
3fffff90:  feefeffe 00000000 3ffee27c 40201071  
3fffffa0:  feefeffe feefeffe feefeffe 402017a4  
3fffffb0:  feefeffe feefeffe 3ffe84f4 4010073d  
<<<stack<<<

И так по кругу

FoxJone
Offline
Зарегистрирован: 19.04.2019

Просто процитирую себя же с этого же форума

FoxJone пишет:

С другой стороны, НАСТОЙЧИВО НЕ РЕКОМЕНДУЮ (сам обжегся очень) вешать на ESP8266 какие то другие задачи, кроме WiFi, web-сервера и вебинтерфейса. Ну максимум что то простенькое, типа кнопки или датчика температуры. Иначе, ой сколько вам открытий чудных готовит парадоксов друг....

Такую же фигню в сериале я от еспшки видел не раз, после чего зарекся использовать ее как то, кроме как для связи. Как я думаю, Wifi и вся прочая сетевая обвязка очень глубоко лезет в таймеры и прерывания, и совершенно не ясно, где именно и что кому помешает.

forfrends
Offline
Зарегистрирован: 24.02.2015

Да, вы правы. Отчасти. То что вы говорите 100% верно для Ардуино IDE. Нужно код для ESP писать в специализированной среде...

Проблему решил откатом менеджера плат для ESP на версию 2.4.2. В новых версиях отключена поддержка "чего-то-там.." из-за чего и происходит такой глюк.

Neoris
Offline
Зарегистрирован: 25.08.2019

Ключевым в вашем выводе с ESP8266 было "ISR not in IRAM!"

Надо объявить вашу функцию до setup() в виде:

void ICACHE_RAM_ATTR function();

Тогда скетч будет нормально работать с функцией function() назначенной прерыванию.

Таким образом надо объявлять дополнительно все функции вызываемые по прерываниям

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Это очень правильный совет, а ещё для ESPшек имеет смысл искать решения по коду ошибки и не только на ардуино ресурсах.
Единственное, как мне кажется с таким атрибутом нужно объявлять любую функцию которая используется в пребывании. И не важно до или после сетапа. Кстати по этой причине вызов любой ардуино функции из прерывания вызовет такую же ошибку. Поэтому уж если влезли в прерывания на есп пишите все ручками.

Logik
Offline
Зарегистрирован: 05.08.2014

FoxJone пишет:

Просто процитирую себя же с этого же форума

FoxJone пишет:

С другой стороны, НАСТОЙЧИВО НЕ РЕКОМЕНДУЮ (сам обжегся очень) вешать на ESP8266 какие то другие задачи, кроме WiFi, web-сервера и вебинтерфейса. Ну максимум что то простенькое, типа кнопки или датчика температуры. Иначе, ой сколько вам открытий чудных готовит парадоксов друг....

Такую же фигню в сериале я от еспшки видел не раз, после чего зарекся использовать ее как то, кроме как для связи. Как я думаю, Wifi и вся прочая сетевая обвязка очень глубоко лезет в таймеры и прерывания, и совершенно не ясно, где именно и что кому помешает.

Да, надо понимать что свой скетч - это только часть исполняемого ESP8266 кода. На одном ядре и железе кроме скетча работает и поддержка Wifi. И порядок взаимодействия между нашим скетчем и остальным вобщем то не известен. Но впадать в крайности тоже не стоит. Я писал драйвер Н-моста с ШИМ для управления мотором  - работает стабильно, управляется с броузера. В другом проекте - програмный SPI для динамической индикации на десятках светодиодов через регистры. И тоже норма, управляется с броузера. Везде чисто программная реализация. А вот лезть в прерывания и к переферии (кроме пинов)  - да черевато сюрпризами, мало информации и коллизии очень вероятны. 

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

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

В есп невозможно глубоко залезь в железо ибо максимальное дно это API которое предоставляет производитель. Никакого прямого общения с железом, нет. Попытка сразу вызовет системную ошибку. Это ииесть основной минус еспешек.

Logik
Offline
Зарегистрирован: 05.08.2014

Никогда не говори никогда. Кому интересно давно знают что там  Tensilica’s L106 и даташит на него гуляет по рукам. А отсутствие легальной полной доки - разумеется огромный минус. https://www.itead.cc/wiki/images/2/2d/0A-ESP8266_Specifications_v4.1.pdf явно маловато будет тем кто аппаратную часть ковыряет. А мне и без этого не плохо, даже ЛУА иногда хватает ;)