Программная перезагрузка не работает!

Тема в разделе "Arduino & Shields", создана пользователем Vovka, 15 фев 2019.

  1. Vovka

    Vovka Гик

    Необходимо программно перезагрузить Pro Mini.
    Пробовал
    Код (C++):
    asm volatile ("jmp 0");
    - зависает!
    Подскажите, что может "вешать" Ардуину?
    Читал о возможности перезагрузки через вачдог, но там загрузчик предлагают перепрошивать - крайне не желательно
     
  2. parovoZZ

    parovoZZ Гуру

    Выкидывай загрузчик. Ну или смени его на тот, который при перезагрузке по вачдогу передает управление основной программе.
     
    Andrey12 нравится это.
  3. Самое простое решение - дергать за ресет (хоть его и не рекомендуют). И не забыть пин, который дергать будет, в сетапе сразу поднять.
    Вот тут подробно с картинками.
     
    Andrey12 нравится это.
  4. Vovka

    Vovka Гик

    Пока не буду - места еще хватает, да и все в процессе отладки, при этом ноги все задействованы - не нужно каждый раз переподключать.
    Значит придется ставить https://github.com/Optiboot/optiboot
    Неее, я в такие "костыли" не играю! ;)
     
  5. Смотрю в сторону оптибута, тока времени свободного пока нет.
    Про-мини у меня вместе с esp-01 работает, по rx/tx общается.
    esp по воздуху обновляется, а для обновления про-мини приходится проводами подключать, отключая на это время esp.
    Положил бы загрузчик на esp, сказал бы про-мини идика на рестарт и обновил бы. Всё никак не соберусь.
     
  6. parovoZZ

    parovoZZ Гуру

    куда поднять? Сразу после ресета все регистры сброшены.
     
  7. @parovoZZ
    Правда ваша даташит раздел 13.2.1 Configuring the Pin, пины как входы и пулл-апы выключены.
     
  8. AlexU

    AlexU Гуру

    Одного перехода на нулевой адрес мало. Т.к. все регистры остануться в тех состояниях, которые были на момент перехода, за исключением регистра SREG и стека (SPH, SPL).
    Поэтому смотрите по коду, что может подвесить контроллер...
     
    arkadyf нравится это.
  9. AlexU

    AlexU Гуру

    Забыл добавить фразу -- "если был аппаратный сброс".
     
    arkadyf нравится это.
  10. parovoZZ

    parovoZZ Гуру

    Ну переход на начало программы я не считаю ресетом.
     
    Andrey12 нравится это.
  11. Vovka

    Vovka Гик

    А при аппаратном сбросе разве не стартует с нулевого адреса? Просто я так глубоко еще не копал...
     
  12. AlexU

    AlexU Гуру

    Открою для тебя страшную тайну -- есть сброс аппаратный (hardware reset), а есть программный (soft reset). Так вот в некоторых процессорах программный сброс -- это переход на нулевой адрес. И, если правильно организовать инициализацию микроконтроллера при старте программы (т.е. позаботиться о настройке всех регистров, даже не используемых), то программная перезагрузка будет работать корректно.
     
    arkadyf и Andrey12 нравится это.
  13. AlexU

    AlexU Гуру

    Стартует.
    Контроллеры AVR (и некоторые другие) стартуют с нулевого адреса. И в контроллерах AVR нулевой адрес это обработчик прерывания RESET, который производит определённую настройку контроллера и запуск основной программы. Но все эти опреации делаются, если собираете программу на C/C++. Если на ассемблере, то все операции по инициализации контроллера лежат на плечах программиста.
     
    arkadyf и Andrey12 нравится это.
  14. AlexU

    AlexU Гуру

    Но есть одно "НО" -- при аппаратном сбросе все регистры сбрасываются в "дефолтное" значение, а при программном нет. Точнее некоторые инициализируются (см. пост выше), но остальные остаются без изменений.
     
    arkadyf и Andrey12 нравится это.
  15. b707

    b707 Гуру

    по-моему, ватчдог - самый простой способ
    Перешить загрузчик - меньше минуты
     
    DetSimen и Andrey12 нравится это.
  16. parovoZZ

    parovoZZ Гуру

    Ну я ж говорил про адрес начала программы, а не нулевой.
     
  17. Vovka

    Vovka Гик

    Пол дня промучился пока прошивку в USBasp залил через UNO.
    Добавил в IDE OptiBoot. Выбрал плату "Arduino Pro or Pro Mini" и МК ATmega328P.
    По идее меню "Инструменты"->"Записать загрузчик" должен записаться OptiBoot? Записалось секунд за 5 без ошибок.
    А как узнать, какой загрузчик прошит?
     
  18. parovoZZ

    parovoZZ Гуру

    скачать его, вычислить хеш. Сравнить с хешом предполагаемого загрузчика. Либо сравнить вчистую хексы.