ESP32 и внешние прерывания

Рандомное имя
Offline
Зарегистрирован: 03.10.2022

Приветствую. К doit esp32 devkit v1 подключены SD карта и DS3231. Используется библиотека ESPAsyncWebServer. Секундный импульс от часов формирует прерывание на 36 пине esp по восходящему фронту. При работе wifi от одного импульса прерывание срабатывает несколько раз. Когда wifi не запускаю, работает всё нормально, на 1 импульс 1 прерывание. На других пинах ситуация похожая. И при чтении с флешки почти каждый раз вылетает. В прерывании идет подсчет количества импульсов. Так же не должно работать?

negavoid2
negavoid2 аватар
Offline
Зарегистрирован: 06.05.2020

Esp32 и Esp8266 используют прерывания для обеспечения работы WiFi, поэтому при одновременной работе с вайфаем/бт и прерываниями есть нюансы.

rkit
Offline
Зарегистрирован: 23.11.2016

На какой хер тебе в esp32 внешние секундные импульсы? Навешал над антенной соплей со слабой подтяжкой, вот и срабатывает.

Рандомное имя
Offline
Зарегистрирован: 03.10.2022

Зачем - это другой вопрос. Чтобы не опрашивать часы 10 раз в секунду. Соплей нет, подтяжки ставил, осциллографом замерял.

rkit
Offline
Зарегистрирован: 23.11.2016

У тебя есть РЧ-осциллограф, стоящий миниум три миллиона, но ты делаешь вот эту бесполезную хрень с часами? Охотно верю.

rkit
Offline
Зарегистрирован: 23.11.2016

В esp32 есть свои часы. Встроенные. Не страдай дурью.

Рандомное имя
Offline
Зарегистрирован: 03.10.2022

Я художник, я так вижу. Дело же не в способе реализации и не в самих часах, а в неадекватном поведении прерывания. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Рандомное имя пишет:

Я художник, я так вижу.


Ох уж эти экспрессионисты )))

а на другом пине? к примеру 25 или 26

SAB
Offline
Зарегистрирован: 27.12.2016

Покажи реально как подключены часики и флешка, короче схему полностью. Подтяни пин прерывания к земле килоомником. Возьми пин, который не работает как сенсор, к примеру GPIO2. Уведи внешние устройства подальше от антенны. 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Здравствуйте уважаемые коллеги.

чтотто на старуху поруха :(

чтобы не плодить темы задам вопрос тут.

тоже esp, из текста программы видно куда я привязал кнопки.

хочу получить счет- инкремент на единицу при каждом нажатии и отпускании кнопки.

получаю инкремент на два. то есть единица прибавляется и на нажатие и на отпускание.

чудеса да и только :) подскажите где косячу плз.


чтобы не рисовать, а то постить тут картинку очень неудобно,  расскажу схему :)
кнопка припаяна между пином  и землей.
параллельно кнопке керамика 1 мкФ, параллельно кнопке выход 817 оптрона.
кнопка для отладки, потом через оптрон будут приходить внешние импульсы от датчиков Холла.
пин подтянут к плюсу 4.7 кОм. 

#include <Ticker.h>

Ticker timer_debounce;

const byte stream_counter_pin = 14;     // D5  
const byte feed_counter_pin   = 12;     // D6  

volatile uint16_t    feed_counter       = 0;         
volatile boolean     feed_counter_flag  = false;     

volatile boolean     stream_counter_flag   = false;  
volatile uint16_t    stream_counter      = 0;


void ICACHE_RAM_ATTR is_feed ()
{
if (!feed_counter_flag){
  ++feed_counter;
  feed_counter_flag   = true;
}
}

void ICACHE_RAM_ATTR is_stream ()
{
if (!stream_counter_flag){
  ++stream_counter;
  stream_counter_flag = true;
}
}

void debounce(){
    feed_counter_flag = false;
    stream_counter_flag = false;
}


void setup() {
  pinMode(stream_counter_pin,      INPUT_PULLUP); digitalWrite(stream_counter_pin, 1);
  pinMode(feed_counter_pin,        INPUT_PULLUP); digitalWrite(feed_counter_pin, 1);
  attachInterrupt ( digitalPinToInterrupt (stream_counter_pin), is_stream, FALLING);
  attachInterrupt ( digitalPinToInterrupt (feed_counter_pin),   is_feed,   FALLING);

  Serial.begin(115200);
  delay(1000);
  Serial.print("\n-----------------------------------------------------------------------------------------------------------");
  Serial.print("\nStart esp8266");

  timer_debounce.attach_ms  (150, debounce);
}

void loop() {
if (feed_counter_flag){
  Serial.print(" feed_counter   = ");    Serial.println(feed_counter);
}
if (stream_counter_flag){
  Serial.print(" stream_counter = ");    Serial.println(stream_counter);
}
}

 

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

Я правильно понимаю, что инкремент счетчиков возможен не чаще одного раза в 150 микросекунд ? Не маловата задержка ? 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Я живу в реалиях, что это миллисекунды , или нет ?

https://links2004.github.io/Arduino/dd/de3/class_ticker.html
Частота импульсов feed 4-5 гц, stream - 0.1– 0.5 гц

Upper
Offline
Зарегистрирован: 23.06.2020

inspiritus пишет:

чтотто на старуху поруха :(

Тут проруха на прорухе.

Если конденсатор на кнопку ставился для подавления дребезга, то он у вас не работает.

Программный анти дребезг у вас тоже не работает как вы задумывали. В ОСНОВНОМ помогает при нажимании и не помогает при отпускании. При отпускании, если присутствует дребезг, ничто не мешает посчитать первый падающий фронт от дребезга, что вероятно и происходит.

В ОСНОВНОМ помогает при нажимании, т.к. задержка 150 мс асинхронная относительно нажатия. Установленный флаг снимется в интервале от 0 до 150 мс..

inspiritus
Offline
Зарегистрирован: 17.12.2012

Но эффект двойного срабатывания сохраняется и при работе от реальных датчиков через оптрон. 
оптрон 817 - никаких радиочастот. Фронты и срезы чистые, по крайней мере на лучевом осциллографе, да и на цифровом тоже.

чуть позже все же схему нарисую…
откуда?

rkit
Offline
Зарегистрирован: 23.11.2016

А вот всякие отптроны, конденсаторы, и прочую ересь с медленными фронтами к esp32 следует подключать через триггеры шмитта.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Убери конденсатор вообще, а потом ещё поставь на 0.1 мкФ. Напиши результаты.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Угу, в пятницу вернусь из командировки попробую. Заодно подам посчитанные импульсы с наны, и посмотрю как будет. От наны же точно дребезга не будет :)

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

Вообще всякие левые тикеры на esp32 - зло злющее. Все дело в том, что незаметно для вас там работет RTOS, которая, кстати и корячит задержки, может в ней проблема. Я бы каждый проход лупа в волатильную переменную копировал значение миллис. Ну просто потому, что если вы сделаете чтение миллис из прерывания у вас есп32 вылетит с выходом за пределы памяти (не буду тут рассказывать почему). В прерывании фиксируете сработку, отключаете его (прерывание), ну как там - детачинтерупт. В другую волатильную переменную копируете то самое закешированное значение миллиса. В лупе проверяете истечение дебонс интервала, по скопированному значению. Если интервал истек - снова подключаете прерывание. И будет вам счастье.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Погодь! , а аткуда миллис в ртос??? Это где почитать?????????

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

Странный вопрос... Он же под ардуиной пишет. Что мешать быть и миллису и FreeRtos вместе ?

inspiritus
Offline
Зарегистрирован: 17.12.2012

Охота за лишним импульсом

inspiritus
Offline
Зарегистрирован: 17.12.2012

Подключил нану на оба прерывания.

блинкует на 3 секунды через 3 секунды на оптроны.

еспэшка считает импульсы по обоим изменениям сигнала хотя должна только на срез.

нана не может жэ с дребезгм импульсы выдавать?

чертовщина.

убрал емкостя и чертовщина кончилась:)

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

inspiritus пишет:

убрал емкостя и чертовщина кончилась:)

Ну вот то-то и оно, слишком большая емкость (да еще небось и без резистора)...

rkit
Offline
Зарегистрирован: 23.11.2016

rkit пишет:

А вот всякие отптроны, конденсаторы, и прочую ересь с медленными фронтами к esp32 следует подключать через триггеры шмитта.

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Аларчик просто открывался. 
еслиб просто обычная входная цепь с оптороном то все просто бы работало и впрос бы не возник.

но , чтобы отлаживать на даче я вклячил на выход оптрона мембранную кнопку (три штуки)

соответственно оне начали дрыбизжать и я добавил емкостей. И некоторые программные экзорсисы.

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

отсюда вывод : не надо пытаться отладочные примочки интегрировать в рабочие цепи. 
кесарю цезарево а цезарю кесарево :) отладочная модель на нане оказалась удачной, отладка с нею комфортной, лень - зло!

ЗЫ . Триггеры приехали , тоже проверю :)