• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Глюк с прерыванием?

Всем привет!
Делаю на esp8266 + ArduinoIDE счётчик импульсов.
Что может быть проще?...
Импульсы считаются в прерывании и посылаются на сервер.
Заодно беру время на таймсервере.

И вроде всё работает, но заметил, что есть пропуски импульсов. :(
Пропуски появляются если импульсы идут чаще 300мс (0.3с).
Мне нужно, считать импульсы с периодом 60мс. При такой скорости пропадает примерно 10% импульсов.

В какую сторону копать?
 
И всётаки, из-за чего могут быть пропуски?
- Во время работы WiFi прерывания не обрабатываются?
- Глюк в программе?
- Глюк в Arduino IDE?
 
Приятно пообщаться с умными людьми. :)
Искал неделю, а как спросил - сразу нашёл.

Проблема в том, что я записываю данные в EEPROM. Похоже, что во время записи, прерывания не обрабатываются.

код:
EEPROM.put(AdrWrite + A_COUNTER, _counter);
EEPROM.put(AdrWrite + A_TIME, epochTime);
EEPROM.commit();
выполняется целых 100мс.
 

NutsXXXL

New member
@Сергей Тимофеев тут в соседней ветке человек мечтает мегагерцы считать http://esp8266.ru/forum/threads/prjamoj-dostup-k-gpio-registram.1299
чтобы писать в eeprom в фоне надо вообще не использовать библиотечную функцию а по типу самому отдать команду на запись и проверять факт окончания записи когда "удобно" а не просто ждать
более того eeprom в arduiono 8266 это на самом деле кусок флешь памяти
 

pvvx

Активный участник сообщества
Всем привет!
Пропуски появляются если импульсы идут чаще 300мс (0.3с).
Это стирание сектора flash или файловая система spiffs.
Уберите все обращения к записи flash и любые обращения к spiffs.
Мне нужно, считать импульсы с периодом 60мс. При такой скорости пропадает примерно 10% импульсов.

В какую сторону копать?
Писать на СИ на SDK без Arduin.
Про длительности запрета прерываний в SDK на обработку WiFi.
 
Последнее редактирование:

NutsXXXL

New member
@Сергей Тимофеев нет дальше я не в курсе
но
текст библиотечной функции открыт но там используется библиотечная spi_flash_write
а если лезть глубже то видим функцию типа SPIWrite в ROM
надо их всего лишь деассемблировать :)
ну или изучить протокол записи в микросхему flash написать свою процедуру
без while
 

DVZ2010

New member
какой смысл так часто писать во флэш? чем оперативка в рунтайме не устраивает... Никакого EPROM отдельного в модуле нет и пишете вы в результате в SPI память, в которой в т.ч. лежит и сам софт. Реально есть шанс нарваться на помеху и "писануть" не туда, ну или рано или поздно ушатать микросхему памяти, тем более не такие они и надежные. Если очень боитесь потерять показания, а потерять, так понимаю можно только при нештатном рестарте системы (тоесть событии на фоне общего времени работы - низковероятностного), определитесь каким периодом накопления можете пожертвовать - например 10 минут. вот через эти 10 минут и фиксируйте показания, можно еще дополнительно проверить на сколько они отличаются от ранее сохраненных и стоит ли новые фиксить. В любом случае будет переписан сектор - аж 4килобайта.
С сервером как общаетесь? Спросить у него после рестарта последние переданные показания - не вариант?
 
какой смысл так часто писать во флэш? чем оперативка в рунтайме не устраивает... Если очень боитесь потерять показания, а потерять, так понимаю можно только при нештатном рестарте системы (тоесть событии на фоне общего времени работы - низковероятностного
Наверно, Вы правы.
Изначально я хотел сделать супер надёжную и точную систему и рассуждал так:
Максимальная скорость 60000 импульсов/час.
Среднее количество импульсов за одну работу 10000.
Гарантированная точность 0,2% (т.е. при коллизиях точность не хуже 0.2%)
Получаем: 0,2% от 10000 = 20 импульсов
20импульсов / 60000 импульсов/час = 1,2секунды
Вот я и писал во флэш каждую секунду.
Интересно, сколько циклов записи она выдержит. Миллион или 100 миллионов.
Если миллион, то при записи каждую секунду, сдохнет через 11 дней :) , а если 100 миллионов, то через три года. Что тоже мало.

Пожалуй я воспользуюсь советом писать во флэш каждые 10 минут, и успокоюсь на этом.
 

DVZ2010

New member
100 тысяч циклов
W25Q40BVSSIP pdf, W25Q40BVSSIP description, W25Q40BVSSIP datasheets, W25Q40BVSSIP view ::: ALLDATASHEET :::
если ноги свободные есть, можно внешнюю память повесить, как EPROM - ту же 93с46 (spi - миллион перезаписей) или 24схх(I2C - миллион) так и RAM - например вообще RTC ds1307 - помимо часов там еще 56 байт оперативки, зарезервированной часовой батарейкой на несколько лет хода. Вот оперативку точно не "ушатаешь" :)
 

NutsXXXL

New member
@Сергей Тимофеев а я еще подскажу: микросхема FRAM от Cypress (ранее рамтрон)
есть версия с часами и просто память
триллионы циклов записи при этом энергонезависима абсолютно
в любом случае написать свои процедуры без wile все таки придется
 

nikolz

Well-known member
чтобы быстро писать во флеш надо исключить многократную запись в одну и туже ячейку.
Т е если хотите сохранять во флеш то сохраняйте в массиве.
При первом запуске, либо через определенное время ,стирайте массив и начинайте писать сначала этого массива.
Например , выделяете массив в 100 000. для 60мс его хватит на 6000 секунд т е на 1.5 часа.
После этого стираете массив , затратив 100 mc и пишите снова сначала.
 
Сверху Снизу