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

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

  1. b707

    b707 Гуру

    Похоже, ответ найден:

    When you use Arduino as ISP (or any other ISP programmer) to program an AVR microcontroller, it takes out the bootloader. There is only one instruction available via ISP programming to erase flash, and that is the chip erase command, which wipes the whole flash (and the lockbits - this is part of their code security model ), including the bootloader section.

    So - if you did "upload using programmer", that'll wipe out the bootloader on the target.

    Сейчас на работе, вечером приду, проверю. Но думаю, что эта цитата отвечает на все вопросы. При прошивке скетча по SPI стирается бутлоадер! - блин, и на это я потратил 5 дней :)

    Хотя было полезно.

    ЗЫ Снова спасибо AlexU - это ваши вопросы про способ загрузки навели меня на эту мысль. Далее "правильный" запрос в гугле - и первая же ссылка выдалу эту цитату с arduino.cc
     
    SergeiL нравится это.
  2. AlexU

    AlexU Гуру

    Наибольший интерес вызывает 5-ый пункт. Хорошо бы посмотреть на лог (желательно подробный) -- какие HEX-файлы шьются и их содержимое.
     
  3. b707

    b707 Гуру

    Компилируется вот этот скетч и шьется:
    Код (C++):
    #include <avr/wdt.h>
    int led =7;

    void setup()
    {
       wdt_disable();
       pinMode(led,OUTPUT);
       digitalWrite(led,HIGH);
       delay(16000);
       wdt_enable (WDTO_1S);
    }
    void loop()
    {
        //wdt_reset();
        digitalWrite(led, ! digitalRead(led));
        delay(1000);
    }
    Лог могу скопировать.

    Но мне кажется. что моя последняя цитата - про то, что прошивка программатором стирает загрузчик - вроде уже обьяснила все. разве нет?
     
  4. AlexU

    AlexU Гуру

    Да, объяснила. Сообщение на форуме одновременно выложили (бывает такое) и я сообщение с объяснением увидел после.

    Вроде как Arduino IDE при компиляции формирует два файла HEX -- один только с прошивкой, второй прошивка + бут. Можно подсмотреть команду в логе которой шьёт Arduino IDE и подменить параметр, который отвечает за выбор файла HEX, на тот, который содержит прошивку с бутом.

    PS: вроде как можно сделать следующее: меню -> Скетч -> Экспорт бинарного файла (создаст два hex в папке скетча) дялее меню -> Скетч -> Показать папку скетча (там увидите два hex). У одного из них имя будет типа with_bootloader.
     
  5. parovoZZ

    parovoZZ Гик

    Канеш затирается))))
     
  6. parovoZZ

    parovoZZ Гик

    Если загрузчик зашит, то что мешает через uart залить прошивку?
     
  7. b707

    b707 Гуру

    а нафига переподключать UART. если только что заливался загрузчик - и значит все подсоединео для заливки по SPI ? - вот по такой логике я МК и прошивал - сначала загрузчик, потом скетч.
     
  8. b707

    b707 Гуру

    сейчас хорошо ехидничать - ты б раньше это сказал, цены б не было :)
    Вообще сильно сомневаюсь, что ты это знал до прочтения моего сообщения :)
     
  9. parovoZZ

    parovoZZ Гик

    Ж
    Оптибут умеет по spi??? Ну заливай через spi. Зачем тогда внутрисхемное используешь? Внутрисхемной никакие загрузчики не нужны.
     
  10. parovoZZ

    parovoZZ Гик

    Пару лет назад создавал ветку с тем же вопросом, когда на атмел студио переезжал. Или на ардуино ру. Также ардуинщики плавали по теме. Потом кто-то из сишников растолковал.
     
  11. b707

    b707 Гуру

    Итак, подводим итоги.
    Задача полностью решена, ватчдог работает во всех моих платах и контроллерах. Причиной проблем с ватчдогом на "голом" МК было незнание того факта, что прошивка скетчей через программатор стирает загрузчик.

    Краткие выводы:

    Чтобы обеспечить правильную работу ватчдога на платах АВР, начиная с атмега8 и далее - есть два пути:

    1. Записать на плату загрузчик семейства оптибут и в дальнейшем обновлять скетчи только по UART - способ описан в сотне мест в интернете.

    2. Внести изменения непосредственно в свой скетч по рекомендации мануала avrlibc , добавив в начало код, дезактивирующий таймер ватчдога:

    Код (C++):
    #include <stdint.h>
    #include <avr/wdt.h>
    uint8_t mcusr_mirror __attribute__ ((section (".noinit")));
    void get_mcusr(void) \
      __attribute__((naked)) \
      __attribute__((used)) \
      __attribute__((section(".init3")));
    void get_mcusr(void)
    {
      mcusr_mirror = MCUSR;
      MCUSR = 0;
      wdt_disable();
    }
     
    ( Note: код доработан для использования с Ардуино ИДЕ пользователем wdrakula с форума arduino.ru )

    Огромное спасибо всем, кто участвовал в дискуссии!
     
    Последнее редактирование: 1 фев 2018
    ImrDuke и DetSimen нравится это.