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

Аппаратное прерывание вызывает перезагрузку ESP8266

msg31

New member
Доброе время суток, коллеги.
Решил написать стабилизированный регулятор мощности с управлением через Web - интерфейс на ESP8266 и столкнулся с двумя проблемами:
1) Крайне медленно работает AnalogRead(). За один полу-период сетевого напряжения удается считать примерно 25 значений. Для более-менее правильного расчете TrueRMS приходится брать 10 полупериодов. Ну это ладно, проблема нерешаемая, поскольку АЦП у ESP8266 программный и поэтому по-определению не может быть быстрым.
2) Если повесить прерывание на какой-либо порт, то вызов этого прерывания довольно быстро приводит к перезагрузке ESP с ошибкой (скрин ошибки прилагаю)

Вопрос: Может есть какие-нибудь особенности использования внешних аппаратных прерываний, которые я не знаю.
В прерывании практически ничего не делается. Если убрать источник прерывания (отсоединить детектор нуля), то все работает корректно.
Код:
void flCrossZeroSet()
{
   delayMicroseconds(50);
   flCrossZero=1;
   zPS++;
  if (StateVolts==1 )
   {
        CntPeriod++;
        if (CntPeriod>10) StateVolts=2;// Если был расчет тока (напряжения), то ставим признак его окончания
   }
  
  if (StateVolts==0)
  {
      index_input=0;
      StateVolts=1;
      CntPeriod=0;
      SqNaprT=0;
      zPS=0;
  }
 
  if (StateVolts==4)
  {
       StateVolts=0;
 
  } 
  
}
 

Вложения

Последнее редактирование:

nikolz

Well-known member
1) Как уже много раз сказано на форуме, АЦП работает без проблем на скоростях до 200 кгц
Т е для 50 Гц это до ... отсчетов.
2) А какие особенности использования прерываний Вы знаете?
Огласите Весь список пожалуйста.
 

msg31

New member
1) Вероятно это справедливо не для среды Arduino IDE, там я просто вызываю функцию AnalogRead()
Если подскажете, как добиться такой скорости, буду благодарен.
2) С крешем ESP8266 в общем-то понял что компонента ESP8266WebServer совместно с использованием аппаратного прерывания вызывает такой эффект.
В общем-то если надо нормально программировать, придется отказываться от среды Ардуино и использовать, вероятно SDK или еще какую среду, какую - еще не разобрался.
 

pvvx

Активный участник сообщества
Если подскажете, как добиться такой скорости, буду благодарен.
В моей Web-свалке идет снятие замеров ADC по прерываниям(!) и передача в UDP до 196 кГц... АрДурина и есть дурина.
Большую скорость не позволяет развить CPU - загрузка прерываниями на 196 кГц и передача по UDP. А так ADC работает и выше..
 

msg31

New member
АрДурина и есть дурина.
Так-то оно так, но все-таки она доступна многим для повторения. И я делал на ней хорошие работающие и востребованные проекты, для возможности повторения широким кругом пользователей даже специально перевел код с CodeVision AVR (кстати его тоже многие хают) на Ардуино.
pvvx,
Подскажите, есть на этом ресурсе ссылка что качать и как ставить, чтобы не на "Дурине" программировать. Для Ардуины есть, другого что-то не нашел. В инете есть много всяких ссылок и рекомендаций, но не уверен что они 100% рабочие.
 

pvvx

Активный участник сообщества
Подскажите, есть на этом ресурсе ссылка что качать и как ставить, чтобы не на "Дурине" программировать. Для Ардуины есть, другого что-то не нашел. В инете есть много всяких ссылок и рекомендаций, но не уверен что они 100% рабочие.
Ну рабочее это становится когда сделано под реальный проект, а у нас тут просто тусовки на тему общих вариантов... Но вот Ардуино хотя создано в основном для работы с аппаратурой, особенно внутренней у модулей, но это дело совершенно не выполняет или делает очень не оптимально, т.к. стало просто брендом для вечерних поделок школьников. В итоге она превратилась в демку с неуклюжими проектами для школьников.
Ну а про ADC вот не-так давно наспамили:
высокоскоростной ввод аналоговых данных
А работающий ввод в Web-свалке. Свалка - т.к. это просто куча примеров, что можно реализовать на ESP8266 и росла с целями, чтобы другие типа портироващиков Ардуиншиков не сидели, а делали. Иначе до-сих пор бы не было даже приличного Web сервера... Типа прецедента, чтобы было неповадно :) Так что прецедент есть и Дуринам придется как-то это решать у себя. Но ещё мало времени прошло...
 

nikolz

Well-known member
Чтобы качать UDK для начала надо знать, что такое UDK и с чем его едят.
.
"...А у людей она слыхала,
Что это зло еще не так большой руки:
Лишь стоит завести Очки.
Очков с полдюжины себе она достала;
Вертит Очками так и сяк:
То к темю их прижмет, то их на хвост нанижет,
То их понюхает, то их полижет;
Очки не действуют никак.
"Тьфу пропасть! — говорит она, — и тот дурак,
Кто слушает людских всех врак:"
 

pvvx

Активный участник сообщества
Что-то не понял, не надо UDK качать, наврали что ли?
UDK - это пакет транслятора СИ и C++. Отличие от входящего в Дурину - имеет примеры и рассчитан на работу в СИ/С++ c SDK, без отупевающей пользователей оболочки Дурины, а в Eclipse...
 

pvvx

Активный участник сообщества
Скачал, поставил, работает, прошивается. Осталось найти примеры работы с внешними аппаратными прерываниями и АЦП.
Примеры с АЦП пока только в Web-свалке - https://github.com/pvvx/esp8266web/blob/master/app/driver/wdrv.c
https://github.com/pvvx/esp8266web/blob/master/app/driver/adc.c
Но у меня используются нестандартные (отличные от принятого в китай-SDK) описания регистров ESP8266 и сам SDK собран из кусков китай-SDK с заменой частей на свои. :)
А прерывания по GPIO пинам - это совсем просто и есть везде... Даже в Web-свалке при инициализации через прерывание по пину определяется сигнал сброса настроек https://github.com/pvvx/esp8266web/blob/master/app/web/web_iohw.c#L92 на выводе RX (разбирается что за время 25 ms уровень на пине не изменился, чтобы отличить от RX сигналов передачи...).
 
Последнее редактирование:

msg31

New member
Но у меня используются нестандартные (отличные от принятого в китай-SDK) описания регистров ESP8266 и сам SDK собран из кусков китай-SDK с заменой частей на свои.
То есть в UDK этот пример работать не будет?
протестировал пока в UDK стандартную функцию чтения АЦП system_adc_read(), скорость такая же, как в Ардуино, что объяснимо, поскольку покопавшись в исходниках ардуино нашел там вызов этой же самой функции в analogRead.
 

nicelight

Member
А прерывания по GPIO пинам - это совсем просто и есть везде... Даже в Web-свалке при инициализации через прерывание по пину определяется сигнал сброса настроек https://github.com/pvvx/esp8266web/blob/master/app/web/web_iohw.c#L92 на выводе RX (разбирается что за время 25 ms уровень на пине не изменился, чтобы отличить от RX сигналов передачи...).
Уважаемый программист Виктор. Хотелось бы очень развиться до вашего уровня в кодинге на сях. Я электронщик, но как программист, к сожалению не имею времени развиваться. Познания в кодинге на уровне Дурины. с удовольствием бы углубился в изучение Си, было бы время. Знаний не хватает даже корректно собрать воедино куски кода с вашей свалки. Если кто-либо готов меня лаконично и в короткие сроки обучить за денежку, стукните в личку.
К Вам предложение, в какую денежку вы оцените свой интеллектуальный труд по правке стандартных дуриновских либ, либо написание своей, ардуино иде адаптированной , чтобы можно было пользоваться прерываниями для таких некомпетентных "быдлокодеров" как я? Готов на предоплату, если сойдемся на разумной цене.
 

al.kl

New member
А работающий ввод в Web-свалке. Свалка - т.к. это просто куча примеров, что можно реализовать на ESP8266
Часто вижу и не только от Вас ссылку на эту тему, называемую "Свалкой". Но сколько раз туда не заходил, никаких ни примеров ни кодов я там не видел.
Может я на столько туп, хз... Но не думаю.
Пытался её почитать, дошёл наверное максимум до 5-ой страницы - толку ноль.
 

Artur1985

New member
Часто вижу и не только от Вас ссылку на эту тему, называемую "Свалкой". Но сколько раз туда не заходил, никаких ни примеров ни кодов я там не видел.
Может я на столько туп, хз... Но не думаю.
Пытался её почитать, дошёл наверное максимум до 5-ой страницы - толку ноль.
Наверно речь об этом - https://github.com/pvvx/esp8266web.

UPD. Много комментариев на русском, что приятно. Как выяснилось, проект очень большой и с ходу, не поймешь, нужно качать и разбираться.
 
Последнее редактирование:

tretyakov_sa

Moderator
Команда форума
В моей Web-свалке идет снятие замеров ADC по прерываниям(!) и передача в UDP до 196 кГц... АрДурина и есть дурина.
Большую скорость не позволяет развить CPU - загрузка прерываниями на 196 кГц и передача по UDP. А так ADC работает и выше..
Подскажите сылку где искать.
 

pvvx

Активный участник сообщества
Подскажите сылку где искать.
Ссылку чего?
Драйвер передачи по UDP вот https://github.com/pvvx/esp8266web/blob/master/app/driver/wdrv.c
Управляется по UDP и через WEB.
Инициализация ADC до 3000000 sps тут https://github.com/pvvx/esp8266web/blob/master/app/driver/adc.c#L19
А так прошиваете прошивку TCP2UART из https://github.com/pvvx/esp8266web/releases
и на прошитом Web, на странице Debug -> UDP Wave Port и там всё указано как управлять...
Расчеты для разных делителей у ADC тут http://esp8266.ru/forum/attachments/sar_tab_bufx-gif.1192/ http://esp8266.ru/forum/threads/vysokoskorostnoj-vvod-analogovyx-dannyx.857/#post-13356

Примеры приема на 192кГц тут http://esp8266.ru/forum/threads/vysokoskorostnoj-vvod-analogovyx-dannyx.857/page-2#post-13598
ещё тут http://esp8266.ru/forum/threads/raz...o-webservera-na-esp8266.56/page-55#post-13135

Или вам нужны примеры аппаратных прерываний? Они работают на приеме-передаче UART или изменения состояния выводов или на втором таймере. Минимальный период для циклически выполняемых аппаратных прерываний, например для аппаратного таймера, указан давно - до 3..5 us. Меньше - переполнение стека. Для NMI так-же, но время нахождения в NMI процедуре должно быть менее 1 us - иначе падает обслуживание WiFi (оно же NMI - прерывает всё и разрывает какую-то передачу блоков или ещё чего-то у WiFi). Все примеры тоже есть в Web свалке...
Не думаю, что что-либо из перечисленного подойдет для Ардуины. У неё всё тормозное из-за ненужного нагромождения процедур друг на друге и другой подход - написание тестов, а не для работы.
 
Последнее редактирование:
Сверху Снизу