Jump to content

    

dontsov

Участник
  • Content Count

    132
  • Joined

  • Last visited

Community Reputation

0 Обычный

About dontsov

  • Rank
    Частый гость

Recent Profile Visitors

1929 profile views
  1. @Сергей Борщ спасибо! Я вчера поучаствовал в долгой дискуссии в которой объяснили (и я понял и признал) насколько у меня «французский с Нижегородским» в коде.. ахах Буду рефакторить. Вообще, если начать понимать, что написал, можно убрать половину кода. Мда. Я до сих пор удивлен, насколько мало находится примеров с watchdog. И те без комментариев. Вот думаю насколько целесообразно переписать с нуля на регистрах всё.
  2. @Сергей Борщ @jcxz У меня прерывание после sleep... Других нет.
  3. А как это сделать?
  4. Хм… атомарного не уверен… а где это можно узнать? да, uint32_t здорово увеличивают память
  5. Да, в последней версии сделали uint32_t его! https://github.com/dontsovcmc/waterius/tree/dev
  6. @slanted wdt_enable в setup убрал. Посмотри, пожалуйста: https://github.com/dontsovcmc/waterius/tree/dev
  7. Все таки зависает прошивка. Не понятно отчего. Да, она не перезагружается по watchdog аварийно. Тему продолжил тут:
  8. Я попробовал имитировать задержку в коде, чтобы сработал 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 }
  9. @slanted последняя версия пока не зависала. но и предыдущая на столе 3 месяца назад не висла.. https://github.com/dontsovcmc/waterius/commit/612b8c626a5d018d566dfa210f00ac661e73affe#diff-9f275c81ac6d42b2d0a1caa9dee157db9fa36a1193217286fb083b66fb933914
  10. Мы там как то лихо потискали регистры прерываний , поэтому думаю дело в софте.
  11. @Vasily_ спасибо! я ищу специалиста, который найдёт зависания. @slanted :( , значит нужно перетрассировать схему ещё. а помехи могут привести к зависанию?
  12. @Vasily_ вы меня пугаете :) да, питание теперь шире. Фото не обновил на сайте(. @mcuprog хм разве? В разработке ПО всегда быстрее найти ошибку и исправить, чем переписывать с нуля и нанести новых ошибок. Разве с embedded не так же? @slanted ага. Только замыкать счетчики надо асинхронно с опросом по i2c. Для пущей реалистичности. Хотя если у меня на вторые сутки зависал код лёжа на столе…
  13. Мне нужна надежная прошивка, а моделированием или стендом это будет достигаться не важно :). Железо вышлю.
  14. Аудит или доработка (при необходимости) прошивки attiny Требуется проверить прошивку attiny. Требования: надежность работы, отсутствие зависаний, аварийная перезагрузка. Хочется понимать, сколько ресурсов она потребляет, стек, есть ли слабые места. Какой стоит собрать стенд для тестирования прошивки? framework: ATTinyCore watchdog для подсчёта импульсов i2c для общения с внешним миром. Оплачиваемо. Возможна работа по договору.
  15. Спасибо огромное за помощь! Сутки работают.. Кажется нужно сделать стенд, регулярно дрючащий attiny в кнопку и входы, чтобы проверять такие ситуации =(