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?

, 👍2

Обсуждение

Он все еще падает, если вы уменьшите частоту 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


2 ответа


Лучший ответ:

1

Я нашел решение на другом форуме.

Вам нужно добавить атрибут ICACHE_RAM_ATTR к прерыванию, чтобы оно оставалось в кэше.

void ICACHE_RAM_ATTR CLK_ISR() {
  ClkCount++;
}

Теперь:

Freq is: 332596 - connected for 680s, operating at 160MHz

Это все, что я тестировал, но 330 кГц немного лучше, чем сбой на 7 кГц, лол!

edit: я обнаружил, что теперь он выходит из строя ровно через 1200 секунд (20 минут), повторяясь.

Я все еще выясняю почему, но считаю, что это какой-то сторожевой таймер.

,

1

Да, возможно, но 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