ESP8266 и прерывания - невозможно?
Я планирую использовать ESP8266 (Wemos D1 Mini) в качестве программного SPI-монитора для отправки по Wi-Fi.
В качестве теста я сделал сокращенный скетч, который просто подсчитывает прерывания, простой счетчик частоты. Я сделал это как можно проще, но он не остается подключенным к Wi-Fi и вылетает примерно через 10 секунд.
Входной сигнал на CLKPin составляет 6667 Гц.
Вот набросок:
#include <ESP8266WiFi.h>
const char* ssid = "SSID";
const char* password = "PASSWORD";
long nextPrint = 1000; // когда печатать следующее сообщение в serial
const int CLKPin = 5; // Вывод, подключенный к CLK
volatile long ClkCount = 0; // количество срабатываний тактового прерывания
void CLK_ISR() {
ClkCount++;
}
void setup() {
Serial.begin(115200);
long startTime = millis();
WiFi.begin(ssid, password); // Подключение к сети
Serial.print("Connecting to ");
Serial.print(ssid); Serial.println(" ...");
while (WiFi.status() != WL_CONNECTED) { // Дождитесь подключения Wi-Fi
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to wifi");
attachInterrupt(CLKPin, CLK_ISR, RISING);
//Установите CLK-pin в положение input
pinMode(CLKPin, INPUT);
}
void loop() {
if (millis() > nextPrint) {
Serial.print("Freq is: ");
Serial.println(ClkCount);
ClkCount = 0;
nextPrint += 1000;
}
yield();
}
Он всегда попадает в цикл перезагрузки / сбоя (понятия не имею, почему первые несколько отсчетов неверны - я думаю, ESP еще не готов):
Connecting to SSID ...
.Connected to wifi
Freq is: 1
Freq is: 1
Freq is: 0
Freq is: 0
Freq is: 1
Freq is: 0
Freq is: 2313
Freq is: 6667
Freq is: 6666
Freq is: 6667
Freq is: 6667
Freq is: 6667
Freq is: 6667
Freq is: 6667
Freq is: 6667
Freq is: 6667
Exception (0):
epc1=0x40202034 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
ctx: sys
sp: 3ffffc40 end: 3fffffb0 offset: 01a0
>>>stack>>>
3ffffde0: 401067da 00000026 00000000 00000001
3ffffdf0: c0017025 3ffe8d04 3ffee188 00000001
3ffffe00: 00000003 00000008 3ffee99c 00000022
3ffffe10: 3fffc200 401067a0 3fffc258 4000050c
3ffffe20: 40004384 00000030 00000012 ffffffff
3ffffe30: 60000200 00000006 30043003 80000000
3ffffe40: 20000000 3fff0c38 80000000 203fc120
3ffffe50: 00000000 3fffc6fc 00000001 3fff0c3c
3ffffe60: 00000154 003fc120 60000600 00000030
3ffffe70: 40106845 00000080 00000022 3fffc200
3ffffe80: c0017025 3fffc258 4000050c 00000022
3ffffe90: 3fffc200 401067a0 3fffc258 00000022
3ffffea0: 3fffc200 401067a0 3fffc258 4000050c
3ffffeb0: 40202b20 00000030 00000012 ffffffff
3ffffec0: 40000f49 3ffee9e8 00000000 3fffd9d0
3ffffed0: 00000000 00000000 00000000 fffffffe
3ffffee0: ffffffff 3fffc6fc 00000001 3fffdab0
3ffffef0: 00000000 3fffdad0 3ffee9e8 00000030
3fffff00: 3ffee99c 0000000a 3ffe8bc8 402094cc
3fffff10: 00000000 400042db 3ffeff84 40104580
3fffff20: 40004b31 3fff0b84 000001f4 003fc080
3fffff30: 40105aac 000001f4 3ffed190 401004f4
3fffff40: 40106e4d 3fff0b84 00000000 00f8676f
3fffff50: 3ffe8bc8 3ffe8d04 3ffed190 40224d02
3fffff60: 40223d49 40223d52 3ffed004 3ffee1b0
3fffff70: 40228445 3ffed004 3ffee1b0 00f857fe
3fffff80: 4022848a 3fffdab0 00000000 3fffdcb0
3fffff90: 3ffee1c8 3fffdad0 3ffee9e8 40202b43
3fffffa0: 40000f49 40000f49 3fffdab0 40000f49
<<<stack<<<
ets Jan 8 2013,rst cause:2, boot mode:(1,6)
ets Jan 8 2013,rst cause:4, boot mode:(1,6)
wdt reset
Что я делаю не так, или просто невозможно оставаться на связи с Wi-Fi при использовании прерываний на ESP8266?
@localhost, 👍2
Обсуждение2 ответа
Лучший ответ:
Я нашел решение на другом форуме.
Вам нужно добавить атрибут ICACHE_RAM_ATTR к прерыванию, чтобы оно оставалось в кэше.
void ICACHE_RAM_ATTR CLK_ISR() {
ClkCount++;
}
Теперь:
Freq is: 332596 - connected for 680s, operating at 160MHz
Это все, что я тестировал, но 330 кГц немного лучше, чем сбой на 7 кГц, лол!
edit: я обнаружил, что теперь он выходит из строя ровно через 1200 секунд (20 минут), повторяясь.
Я все еще выясняю почему, но считаю, что это какой-то сторожевой таймер.
Да, возможно, но ESP8266 имеет только одно ядро и один набор периферийных устройств. Wi-Fi использует время, прерывания и даже периферийное устройство АЦП, а может быть, и больше.
Вот почему все, что имеет решающее значение для времени или требует много времени, - это боль, чтобы правильно работать на ESP8266. Конечно, это зависит от того, что вы пытаетесь сделать, а также от того, можете ли вы выгрузить то, что хотите, на периферийное устройство, которое Wi-Fi не использует, или если отключение Wi-Fi является опцией во время частей вашего кода.
Как правило, для таких приложений, как ваши, я бы получил ESP32 или Arduino Nano 33 IoT или любое другое решение, которое имеет ядро для обработки Wi-Fi и ядро для использования без ограничений. Это делает развитие более приятным занятием.
Если по какой-то причине вы обязаны использовать ESP8266, вам нужно будет более точно определить, какова ваша конечная цель; возможно, можно найти обходной путь.
можно также использовать 2-й ESP8266 с отключенным Wi-Fi, они дешевы и без Wi-Fi, очень быстрые и отзывчивые., @dandavis
Честно говоря, я думаю, что ESP8266 - плохой выбор для большинства вещей, кроме Wi-Fi. ШИМ шелушится, он не просыпается от сна при внешнем прерывании и относительно высоком энергопотреблении по сравнению, например, с STM32 или AVR. Единственное, для чего он действительно хорош, - это Wi-Fi и большая флэш-память. Да, это может быть вариант в некоторых обстоятельствах, но два не вписываются в приложение, которое я планирую прямо сейчас., @localhost
@localhost fair nuf, мне больше всего нравится стоимость и процессор / оперативная память. Tbf, эти проблемы лучше без Wi-Fi; стабильный ШИМ, меньшая мощность, быстрая перезагрузка., @dandavis
- ESP8266 не подключается к Wi-Fi
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Можно ли отключить WiFi на ESP8266?
- Как отключить или остановить точку доступа в ESP8266?
- ESP8266 — действительно ли у него по умолчанию плохой радиус действия Wi-Fi?
- Как подключить ESP8266 с помощью адаптера ESP-01 к Arduino Uno?
- ESP8266 на Wi-Fi без пароля, возможно?
- ESP8266 Аналоговое чтение мешает Wi-Fi?
Он все еще падает, если вы уменьшите частоту CLKPin с 6667 Гц до чего-то более низкого? Причина, по которой я спрашиваю, заключается в том, что я не уверен, какова максимальная частота прерываний ESP8266, но вы можете превысить ее. Ошибка - это "сброс wdt", который означает, что вы сделали что-то, чтобы предотвратить очистку сторожевого таймера, и поэтому он произвел сброс., @jwh20
Если вы хотите получить разницу во времени последнего сброса счетчика и фактическое значение millis (), то
nextPrint + = 1000;
- это нонсенс. ИспользуйтеnextPrint = millis() + 1000;
, если вам нужно захватить ClkCount за интервал в секунду. Я почти уверен, что именно в этом причина низких значений в самом начале. В дополнение к тому, что сказал @jwh20: я не уверен, что причиной является Сторожевой пес, я думаю, что другая ошибка (возможно, вызванная библиотекой WIFI) разбила ESP, а затем Сторожевой пес выполнил свою работу и выполнил сброс. Но это предположение, jwh20 может быть прав, так что попробуйте то, что он / она написал., @Peter Paul KieferТолько что протестировал, и он оставался подключенным на частоте 5 кГц в течение 15 минут, когда я прекратил тестирование. К сожалению, я не уверен, что это будет достаточно быстро для моего приложения. Я все еще хотел бы знать, могу ли я что-нибудь сделать, чтобы сохранить Wi-Fi подключенным. Я действительно не возражаю против отсутствующих данных, но мне нужен Wi-Fi, чтобы оставаться на связи. Я надеялся, что "yield()` сработает., @localhost
@PeterPaulKiefer Я не особо задумывался о получении точных данных для этого теста, я просто проверял, будут ли прерывания работать и оставаться подключенными к Wi-Fi, так что код таймера - это просто первое, что пришло мне в голову., @localhost
То, что я подозреваю, но никогда не пробовал это сам на ESP8266, заключается в том, что вы прерываете так часто, что Wi-Fi не может работать должным образом, и он отключается. Я не уверен, что вы можете сделать то, что пытаетесь сделать с 8266. Вы смотрели на ESP32? Они имеют двухъядерный процессор, так что вы можете обрабатывать Wi-Fi на одном процессоре и обрабатывать прерывания на другом., @jwh20
Вы всегда можете попробовать запустить свой процессор на частоте 160 МГц (это есть в настройках платы, если у вас есть мини-плата Wemos D1)., @StarCat
@jwh20 Я согласен, но это разочаровывает. Я протестировал ESP32, и он отлично работал до 10 кГц, что все, что я тестировал, но я надеялся получить пользу от некоторых из этих ESP8266, которые у меня валяются!, @localhost
@jwh20 Я нашел решение, см. Мой ответ., @localhost