Не могу вылечить ватчдог на "голой" атмеге328р с внутр тактированием 8 МГц (РЕШЕНО)

Тема в разделе "Микроконтроллеры AVR", создана пользователем b707, 27 янв 2018.

  1. b707

    b707 Гуру

    фактически уже провел...
    Вчера. как уже писал - вытащил чип из Уно, прошил на 8 МГц, запустил тест - ватчдог не работает.
    Вставил чип обратно в Уно, перешил снова на 16 МГц с кварцем - а ВАТЧДОГ ВСЕ РАВНО НЕ ЗАРАБОТАЛ.
    Скетчи грузятся и запускаются без проблем, сериал-монитор отвечает.

    Какие в Уно до того были фьюзы и какой бут - к сожалению не знаю, плата была в штатном конфиге , я ее до того не перешивал.

    В отличии от Уно - с этим же бутом - на Нано ватчдог работает. Нано уже перешил несколько штук, все было нормально.
     
  2. SergeiL

    SergeiL Гик

    Да точно в FUSE SUT=10 проблема. Watchdog не выключен, а тут задержка в 65мс перед стартом.

    На уно и нано все без задержки (там резонатор и SUT=00 - low_fuses=0xFF)

    Попробуйте поставить low_fuses=0xС2.
     
    b707 нравится это.
  3. b707

    b707 Гуру

    интересная мысль, спасибо!
    Попробовать смогу часа через 2...
     
  4. AlexU

    AlexU Гуру

    Это CKSEL = 1111 и SUT = 11, т.е. задержка минимум 65 ms.
     
  5. SergeiL

    SergeiL Гик

    Согласен, programmed/unprogrammed сбили.
     
  6. b707

    b707 Гуру

    частичная победа - ватчдог заработал на некоторых конфигах. Правда, вопросов пока больше, чем ответов.
    Для того, чтобы контроллер не уходил в бесконечный ресет - оказалось достаточно добавить обнуление регистра MCUSR в setup. Решение найдено по подсказке пользователя wdrakula c ардуино.ру

    рабочий код такой
    Код (C++):
    #include <avr/wdt.h>
    int led =7;

    void setup()
    {
       MCUSR = 0;
       wdt_disable();
     
       pinMode(led,OUTPUT);
       digitalWrite(led,HIGH);
       delay(16000);
       wdt_enable (WDTO_1S);
    }
    void loop()
    {
        //wdt_reset();
        digitalWrite(led, ! digitalRead(led));
     
        delay(1000);
     
      }
    Странно то, что именно таким образом отключается ватчдог в исходном коде оптибута, поэтому оптибут должен был решить проблему. У меня складывается впечатление, что я каким-то образом ошибочно конфигурирую МК для работы без бутлоадера - поэтому-то все попытки прошить разные оптибуты не приносят результата.
     
  7. SergeiL

    SergeiL Гик

    А поменять фьюзы пробовали? Не помогло?
    Просто пытаюсь понять разницу, между Original UNO, и AtMega328 на 8 МHz internal.
     
  8. b707

    b707 Гуру

    Нет, не пробовал. Честно говоря, я уже слегка запутался в самых разных конфигах.
    Сорри, не могли бы вы уточнить, что именно на что поменять.
     
  9. b707

    b707 Гуру

    а, все понял.
    Перешил на 8 МГц с low_fuses=0xС2
    Резултат - в бесконечный бут не уходит, но после рестарта виснет
     
  10. b707

    b707 Гуру

    SergeiL. в своих поисках по инету наткнулся на информацию, что значение startup time (SUT) не влияет на отсчет таймера ватчдога, так как ватчдог стартует уже ПОСЛЕ этой задержки:

    The startup time is not relevant. The AVR is already in reset. That's what the startup time means. RESET is asserted as long as mandated by the startup time, after which RESET is deasserted, the core starts to execute instructions, and the watchdog timer starts to count. So you can use the longest startup time if you like. The AVR will still have 16 ms before a WDT reset kicks in. At 1 MHz, that's 16,000 cycles. At 8 MHz, it's 128,000 cycles. As noted, init3() will run almost immediately (way less than 100 cycles).
     
    SergeiL нравится это.
  11. AlexU

    AlexU Гуру

    Если бы повнимательней читали ответы, то данное решение нашли бы ещё в понедельник.
    Для того, чтобы контроллер стартовал с бутлоадера, должны быть выполнены следующие условия:
    1. фьюз BOOTRST запрограммирован, т.е. равен 0;
    2. задан размер секции бутлоадера -- фьюзы BOOTSZ0 и BOOTSZ1;
    3. стартовый адрес кода бутлоадера должен соответствовать размеру секции бутлоадера;
    Исходя из Вашего сообщения, фьюзы следующие:
    Смотрим на high_fuses и видим, что BOOTRST прошит -- при старте/рестарте контроллера будет запускаться код бутлоадера; размер секции бутлоадера 512 байт значит стартовый адрес должен быть 0x7E00.
    Далее надо проверить HEX файл бутлоадера, который зашивается в контроллер. Первая строчка файла должна быть вида:
    :107E0000112484B714BE81FFF0D085E080938100F7
    Первая цифра '10' размер данных в строке, вторая '7E00' -- адрес куда данные прошивать. Остальные цифери могут отличаться.
    По этой строчке можно убедится, что бутлоадер будет прошиваться в нужное место в памяти.
    И конечно же нужно быть уверенным, что бутлоадер, который зашиваете, делает то, что нужно. Я бы собрал бутлоадер из исходников (благо они есть в свободном доступе), а не пользовался непонятными конструкторами.
     
    b707 и SergeiL нравится это.
  12. SergeiL

    SergeiL Гик

    Искал, но не видел этого! Полезно!
     
  13. b707

    b707 Гуру

    Я читаю ваши ответы внимательно и видел ваше замечание про Watchdog System Reset Flag (WDRF). Если помните - даже отвечал вам на него. Это замечание правильное, с чем я сразу и согласился. Почему я не пошел этим путем еще в понедельник - я тоже обьяснил еще тогда. Я не считал необходимым вставлять этот код непосредственно в свою программу. так как, по идее, этот код уже есть в оптибуте и должен выполнятся бутлоадером.
    Собственно, потому я и пишу. что победа - "частичная". Найден вариант решения, восстановивший работу с ватчдогом, однако вопрос о том, почему не отрабатывает бутлоадер - остался.
    Фьюзы вы видите сами, стартовый адрес в HEX файле оптибута проверил - '7E00' - совпадает с настройками фьюзов. Остается самому собрать оптибут из исходников.

    Спасибо Вам за помощь! Еще раз повторюсь - я внимательно читаю все ответы и благодарен вам за них.
     
  14. parovoZZ

    parovoZZ Гик

    А зачем тебе бутлоадер, если не работаешь с usart? Открываешь даташит на 328 камень в разделе wdt и изучаешь. Я с wdt разобрался за пару часов. 5 строчек кода всего и сброс регистра где-то в цикле.
    Не работает ресет??? Если нога ресет не залочена, то ресет работает всегда. В твоём случае сразу после ресета ты уходишь в зависший цикл по велению загрузчика ( в мк есть регистр, который отслеживает по сбросу питания был перезагружен мк или по ресету. По большому счету, загрузчик можно и самому написать. В сети полно информации. И конфигуратор в нем все, что душа пожелает. Будьте свободны в своих желаниях!
     
  15. b707

    b707 Гуру

    parovoZZ спасибо и Вам :)
    Вообще-то, все. что вы написали - уже есть в теме.

    я за 20 минут разобрался - кто больше? :)
     
  16. parovoZZ

    parovoZZ Гик

    Первое сообщение с субботы вроде как. Если это 20 минут по вашему - тогда молодец!
     
  17. AlexU

    AlexU Гуру

    В общем провел эксперимент: взял голый камень ATmega328p (благо есть запас), зашил фьюзы E: FF, H: DE, L: E2 (фьзы дефолтные для 328p, убрал только делитель на 8, сказал, что стартовать надо с бутсекции и установил размер секции бута в 512 байт), зашил optiboot (правда собирать не стал, взял официальный готовый optiboot_atmega328.hex). Всё работает как надо. Если зашить только прошивку без бутлоадера (на тех же фьзах), то светодиод начинает "колбасить" -- постоянный ресет.
    Скетч чуток другой (два светодиода -- один показывает работу setup(), другой -- loop()), но на работу WD это ни как не влияет:
    Код (C++):
    void setup()
    {
      // wdt_disable(); не надо, за меня это сделает optiboot
      pinMode(A0, OUTPUT);
      pinMode(A1, OUTPUT);
      digitalWrite(A0, HIGH);
      delay(1000);
      wdt_enable (WDTO_1S);
      digitalWrite(A0, LOW);
    }

    void loop()
    {
      digitalWrite(A1, !digitalRead(A1));
      delay(200);
    }
    С прошитым optiboot светодиод 'A0' светит своё время, потом 'A1' успевает три раза моргнуть, далее рестарт по WD и начинается всё по новой. Без бутлоадера -- первая итерация отрабатывает как положено, а после перезагрузки светодиод 'A0' начинает часто моргать (до loop() дело не доходит).

    Если у Вас проблема решена частично, то похоже что-то не так шьёте.

    PS: а нужен ли Вам вообще бутлоадер в "голом" микроконтроллере?
     
    SergeiL нравится это.
  18. b707

    b707 Гуру

    AlexU - спасибо за тест.
    На основе моих и ваших тестов картина, в принципе, уже вырисовывается вполне ясно. Причина моих проблем - у меня не шьется бутлоадер (или шьется, но потом не работает). Бесконечный цикл ватчдога - лишь следствие этого.

    В данном проекте - нет.
    Но проблему с загрузчиком надо добить - как и из познавательного интереса, так и чисто в практическом плане - потом-то понадобится. Я вообще очень многое узнал за время, пока решаю эту проблему.
     
  19. AlexU

    AlexU Гуру

    Тогда встаёт вопрос -- как шьёте и что содержит HEX, который зашивается в контроллер?
    Есть несколько способов:
    1. с помощью бутлоадера шьётся HEX, который содержит только пользовательскую программу; в этом случае стирается не вся память -- бутлоадер остаётся на месте;
    2. через ISP интерфейс:
      1. шьётся HEX, который содержит пользовательскую программу и код бутлоадера (всё в одном файле); стирается вся память и за один раз зашивается и программа, и бут;
      2. шьются два HEX -- один программа, второй бут; стирается вся память, потом прошивается один HEX и без стирания шьётся второй (порядок обработки HEX-файлов может быть разным);
      3. шьётся HEX, который содержит только пользовательскую программу; стирается вся память и после перепрошивки в контроллере остаётся только пользовательская программа.
    Судя по этому:
    если прошивается, то должен работать.
     
    SergeiL и b707 нравится это.
  20. b707

    b707 Гуру

    Шью так:
    1. Прошиваю Ардуино Нано скетчем "Arduino ISP"
    2. Подсоединяю к испытуемому МК по схеме, как в заголовке скетча "Arduino ISP" (см 2 сообщение темы)
    3. В ИДЕ выбираю плату "атмега 328 на бредборде 8 МГц внутренний такт" , секция boards.txt для этой платы - в заголовке темы. Программатор - " Arduino as ISP"
    4. Выбираю правильный USB-порт, нажимаю "Прошить загрузчик"

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

    5. далее, ничего не отключая - выбираю "Скетч - Записать через программатор" - и пишу скетч. Скетч тоже прошивается без ошибок.