Jump to content
    

dontsov

Участник
  • Posts

    137
  • Joined

  • Last visited

Everything posted by dontsov


  1. Добрый день всем! Ищу программиста для доработки open source прошивки Ватериуса. С увеличением количества электронных счетчиков тепла, газа, появился запрос сделать поддержку коротких импульсов (4мс). Т.е. нужна поддержка прерываний в прошивке. Электрическую схему менять не хочется. Задача: 1. Добавить прерывания как отдельную функцию в имеющуюся прошивку (это возможно?). Чтобы attiny прочитав настройку понимала, по прерываниями работать или просыпаться периодически. *Требуется ли изменение электрической схемы Ватериуса? Можно ли обойтись текущей? Дорабатывать вебсервер ESP не требуется, но если можете, то ок.
  2. Какая то страшная переписка здесь. Есть куча готовых плат с антеннами для LoRa — подключаете датчики и скидывайте на базовую станцию (они тоже готовые есть). Опишите подробнее задачу — объем данных, расстояния, тогда комментарии будут релевантнее.
  3. Есть OpenSource прошивка ESP8266 на базе Arduino Framework + WiFiManager: https://github.com/dontsovcmc/waterius Задача 1: Требуется обновить Arduino Framework и WiFiManager, проверить на нескольких роутерах. Кинем в сообщество для тестирования. WiFiManager пришлось чуть доработать - добавил 1 вызов и другой код страниц. Надо будет перенести изменения, ничего сложного. Задача 2*: Проверить проблему с ошибкой подключения к 1% роутеров. Есть роутер Sercomm rv6699 к которому не подключается, могу выслать почтой. Другие роутеры: - Sercomm rv6699 - Innbox e70 - TP-Link AX5400 Иногда лечится установкой статического ip в ESP, иногда нет. Версия фреймворка достаточно старая, возможно стабильность уже улучшили. Тестировать можно на NodeMCU. Аналогичным образом не подключалась к данному роутеру какая то из прошивок ESPEasy, а старая ESPEasy stable подключалась. Гипотезы: - Ошибка вылечится обновлением версий; - WiFiManager некорректно использует WiFiClient; - WiFiClient необходимо донастроить, может вынести параметр в интерфейс; - Ошибка в WiFiClient (Однажды я уже исправлял в нём ошибку. Будет и у вас commit.=)) Оплачиваемо по этапам. Бюджет на первую задачу 10к. Торг.
  4. Оpensource проекту Ватериус требуется программист C++. Нужен опыт работы с ESP8266. Задача писать лог ESP8266 в LittleFS, чтобы можно было загрузить из вебинтерфейса при возникновении ошибок: https://github.com/dontsovcmc/waterius/issues/203 Оплату предлагайте. (Если сотрудничество удастся, есть ещё несколько задач на рефакторинг).
  5. @Сергей Борщ спасибо! Я вчера поучаствовал в долгой дискуссии в которой объяснили (и я понял и признал) насколько у меня «французский с Нижегородским» в коде.. ахах Буду рефакторить. Вообще, если начать понимать, что написал, можно убрать половину кода. Мда. Я до сих пор удивлен, насколько мало находится примеров с watchdog. И те без комментариев. Вот думаю насколько целесообразно переписать с нуля на регистрах всё.
  6. @Сергей Борщ @jcxz У меня прерывание после sleep... Других нет.
  7. А как это сделать?
  8. Хм… атомарного не уверен… а где это можно узнать? да, uint32_t здорово увеличивают память
  9. Да, в последней версии сделали uint32_t его! https://github.com/dontsovcmc/waterius/tree/dev
  10. @slanted wdt_enable в setup убрал. Посмотри, пожалуйста: https://github.com/dontsovcmc/waterius/tree/dev
  11. Все таки зависает прошивка. Не понятно отчего. Да, она не перезагружается по watchdog аварийно. Тему продолжил тут:
  12. Я попробовал имитировать задержку в коде, чтобы сработал watchdog на перезагрузку - он срабатывает, но плата уходит в зависание. Кажется потому что не выставлял MCUSR = 0. @slanted: Вот такой код корректно перезагружает если wdt_reset не наступит за 250мс: volatile uint32_t wdt_count; ISR( WDT_vect ) { ++wdt_count; WDTCR |= _BV(WDIE); } void setup() { noInterrupts(); info.service = MCUSR; // причина перезагрузки MCUSR = 0; // без этого не работает после перезагрузки по watchdog wdt_disable(); // а нужно ли тут, если у меня код быстро дойдёт до инициализации watchdog? interrupts(); set_sleep_mode( SLEEP_MODE_PWR_DOWN ); // достаточно же 1 раз сделать? wakeup_period = WAKEUP_PERIOD_DEFAULT; ..... } void loop() { power_all_disable(); //NoInterrupts не нужно? т.к. в wdt_enable есть ассемблерная команда cli wdt_enable(WDTO_250MS); interrupts(); wdt_count = 0; while ((wdt_count < wakeup_period) && !button.pressed()) { counting(); WDTCR |= _BV(WDIE); //пока не понял, обязательно ли здесь или можно после wdt_enable раз в WDT_vect есть. без этого не работает. sleep_mode(); } power_all_enable(); // Далее: я не отключаю watchdog, для надежности. wdt_reset() вызывается в button.wait_release() где я могу долго ждать пока пользователь отпустит кнопку. ... //взаимоотношения с ESP }
  13. @slanted последняя версия пока не зависала. но и предыдущая на столе 3 месяца назад не висла.. https://github.com/dontsovcmc/waterius/commit/612b8c626a5d018d566dfa210f00ac661e73affe#diff-9f275c81ac6d42b2d0a1caa9dee157db9fa36a1193217286fb083b66fb933914
  14. Мы там как то лихо потискали регистры прерываний , поэтому думаю дело в софте.
  15. @Vasily_ спасибо! я ищу специалиста, который найдёт зависания. @slanted :( , значит нужно перетрассировать схему ещё. а помехи могут привести к зависанию?
  16. @Vasily_ вы меня пугаете :) да, питание теперь шире. Фото не обновил на сайте(. @mcuprog хм разве? В разработке ПО всегда быстрее найти ошибку и исправить, чем переписывать с нуля и нанести новых ошибок. Разве с embedded не так же? @slanted ага. Только замыкать счетчики надо асинхронно с опросом по i2c. Для пущей реалистичности. Хотя если у меня на вторые сутки зависал код лёжа на столе…
  17. Мне нужна надежная прошивка, а моделированием или стендом это будет достигаться не важно :). Железо вышлю.
  18. Аудит или доработка (при необходимости) прошивки attiny Требуется проверить прошивку attiny. Требования: надежность работы, отсутствие зависаний, аварийная перезагрузка. Хочется понимать, сколько ресурсов она потребляет, стек, есть ли слабые места. Какой стоит собрать стенд для тестирования прошивки? framework: ATTinyCore watchdog для подсчёта импульсов i2c для общения с внешним миром. Оплачиваемо. Возможна работа по договору.
  19. Спасибо огромное за помощь! Сутки работают.. Кажется нужно сделать стенд, регулярно дрючащий attiny в кнопку и входы, чтобы проверять такие ситуации =(
  20. Огромное спасибо!! За wdt_count тоже - люблю когда behavior defined! Корректно, я понял вас? volatile uint16_t wdt_count; ISR( WDT_vect ) { ++wdt_count; } void setup() { noInterrupts(); info.service = MCUSR; wdt_disable(); interrupts(); .... } void loop() { power_all_disable(); // Отключаем все лишнее: ADC, Timer 0 and 1, serial interface set_sleep_mode( SLEEP_MODE_PWR_DOWN ); // Режим сна noInterrupts(); wdt_enable(WDTO_250MS); interrupts(); // Цикл опроса входов // Выход по прошествию wakeup_period_min минут или по нажатию кнопки // ONE_MINUTE = 240 для 250мс for (uint16_t i = 0; i < ONE_MINUTE && !button.pressed(); ++i) { wdt_count = 0; while (wdt_count < info.wakeup_period_min) { noInterrupts(); if (button.pressed()) { // Пользователь нажал кнопку interrupts(); break; } else { counting(); //Опрос входов. Тут т.к. https://github.com/dontsovcmc/waterius/issues/76 wdt_reset(); WDTCR |= _BV(WDIE); interrupts(); sleep_mode(); } } } wdt_disable(); power_all_enable(); ...пробуждаемся и общаемся по i2с... }
  21. А почему не использовать готовые функции? Я их сам редко в примерах вижу - обычно все напрямую с битами работают.. Поставил работать этот вариант, 8ч полет нормальный: ISR( WDT_vect ) { wdt_count--; WDTCR |= _BV( WDIE ); } void setup() { noInterrupts(); info.service = MCUSR; //причина перезагрузки wdt_disable(); interrupts(); ... работа с EEPROM } void loop() { power_all_disable(); set_sleep_mode( SLEEP_MODE_PWR_DOWN ); noInterrupts(); wdt_enable(WDTO_250MS); WDTCR |= _BV(WDIE); interrupts(); .... LOOP wdt_count wdt_disable(); power_all_enable(); .... }
  22. Его хочется просто инициализировать для пробуждения каждые 250мс. А если так делать? wdt_enable(WDTO_250MS); WDTCR |= _BV(WDIE); interrupts(); По выходу из цикла опроса раз в сутки я делаю wdt_disable();
  23. Гипотеза, что проблема в том что я не поднимаю WDE: WDTCR = bit( WDCE ) | bit( WDE );
  24. Кажется я делаю что-то не то при сбросе watchdog.. но вопрос, почему тогда эта ошибка возникла только сейчас? (кстати я апгрейднул attinycore с 1.2.0 до 1.5.2...) сейчас откатил и поставил на тест.
×
×
  • Create New...