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

ESP8266 виснет

Тема в разделе "Общие вопросы по esp8266", создана пользователем Victor, 7 мар 2015.

  1. nikolz

    nikolz Гуру

    Сообщения:
    4.483
    Симпатии:
    443
    можно сделать все для одного
    создать два буфера приема данных
    а потом чередовать адрес буфера приема
     
  2. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    Там 2 пары портов clock и data 2 штангеля работают с разными по длине пакета циклами, по этому код 2 раза написал. Так сколько точно максимум в прерывании сидеть можно?
     
  3. nikolz

    nikolz Гуру

    Сообщения:
    4.483
    Симпатии:
    443
    обычно есть регистр состояния внутри, либо сигнал готовности вне датчика.
    а то как-то не серьезно получается. что-то выплевывают, а когда неизвестно.
     
  4. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    Ну да выплевывает, а esp2866 должна ловить и обрабатывать там не более 2600 бод примерно. Через 100 ms пакет 10ms.
     
  5. nikolz

    nikolz Гуру

    Сообщения:
    4.483
    Симпатии:
    443
    у штангеля какой интерфейс? I2C ? что мастер?
     
  6. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    Там что то похожее на i2c, но вроде свое китайское чудо.
     
  7. nikolz

    nikolz Гуру

    Сообщения:
    4.483
    Симпатии:
    443
    если делаете не игрушку, то лучше написать на СИ и убрать этот loop.
    дайте ссылку на datashеet штангелей посмотрю для интереса.
     
  8. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    Reading Digital Callipers With an Arduino / USB
    Нет даташитов, есть ссылка на пример реализации...
    Но тут мне не нравится что без прерываний, но по ходу прийдется так сделать, что бы выйти из положения.
     
  9. nikolz

    nikolz Гуру

    Сообщения:
    4.483
    Симпатии:
    443
  10. nikolz

    nikolz Гуру

    Сообщения:
    4.483
    Симпатии:
    443
  11. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    @nikolz
    Это все уже пробовал, работает не стабильно. Если в середину пакета попадет будет ерунду показывать. Ладно сейчас поковыряемся.
     
  12. nikolz

    nikolz Гуру

    Сообщения:
    4.483
    Симпатии:
    443
    поделюсь своим алгоритмом решения подобной задачи
    1) делаем колбек который работает по фронтам. Но не на основе обнаружения скачков а на основе High Low.
    2) при обнаружении Low рассчитываем длительность прошедшего интервала.
    По его длительности во-первых обнаруживаем начало данных, а во -вторых обнаруживаем пропуск данных
    При обнаружении начала заталкиваем биты в слово
    -----------------------
    Такой алгоритм не мешает работать wifi.
     
  13. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.470
    Симпатии:
    1.272
    @Maddoc - В прерывании delayMicroseconds(20);
    Скорее всего оно всё и портит. Надо глядеть внутреннюю реализацию Arduino. При входе в прерывание, точнее при вызове процедуры прерывания стандартный диспетчер обработки других событий типа софт-таймерных прерываний и тасков не работает и не допускает некоторых повторных вхождений... А на всяких delay ранее стояли вызовы данного диспетчера..
     
  14. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.470
    Симпатии:
    1.272
    При delayMicroseconds(20); + остальной код в прерывании по пину = гарантированные пропуски Beacon (синхронизации WiFi). Стандартная точность метки в beacon для ширпотребовских устройств WiFi = +-1 us. Любой сдвиг приводит к увеличению потребления спящих устройств, т.к. они просыпаются и включают RF приемник перед приемом фрейма beacon, строго по таймеру. Если он задерживается = приемник ждет и жрет. Если в нем ещё будет сбита метка времени (она в us), то возможна потеря следующей синхронизации и уведомлений приемника о находящихся ему сообщениях у AP и т.д.
    Несколько AP, работающих в одной зоне, синхронизируют и свои beacon. Смещение создает хаос, плохую связь и севший телефон за ночь. :p
     
  15. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    Оставил все как есть 20 us! в прерывании только завернул функцию handleClient(); в свободное от прерываний место и вызываю раз в пол секунды, да страница грузится чуть по дольше, на пол секунды, зато потом на полной скорости по websoket.loop() все данные хорошо идут.
    Код (C):
    1.  
    2. #include <TickerScheduler.h>// Для контроля вызова HTTP.handleClient();
    3. ts.add(1, 500, [&](void *) {
    4.     detachInterrupt(clock_Master);
    5.     HTTP.handleClient();
    6.     attachInterrupt(digitalPinToInterrupt(clock_Master), read_bitM, FALLING);
    7.     }, nullptr, true);
    Рекомендация на данный момент следующая: при работе с
    "ESP8266WebServer.h" и конкретно функцией "HTTP.handleClient()" ИСКЛЮЧИТЬ ВНЕШНИЕ ПРЕРЫВАНИЯ! не использовать "noInterrupts()" перед ней (ESP8266 виснет).
     
  16. Maddoc

    Maddoc Новичок

    Сообщения:
    15
    Симпатии:
    0
    Это конечно все очень не красиво, подумаю над тем как сделать нормально.
     

Поделиться этой страницей