Не могу вылечить ватчдог на "голой" атмеге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 нравится это.
  12. Seltvik

    Seltvik Нуб

    Вопрос у меня два устройства собранные мной на кристале 328p так вот на одном из них ватчог не пашет так же после выставления флага вроде как работает а на втором даже без загрузчика при прошивке программатором стандартным скетчем ватчдог сбрасывается и работает как надо я там даже флаги никакие не ставил и там загрузчика как я понял нет так как шью то я по SPI такое вообще может быть? и если да почему так?

    И еще вы написали надо использовать данную конструкцию :
    Код (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();
    }
     
    Ее надо до setup вставить типа?
     
  13. b707

    b707 Гуру

    да
    остальных вопросов не понял
     
  14. parovoZZ

    parovoZZ Гуру

    это как выяснил?
    какого флага? У вачдога один флаг - WDIF (не считая WDTRF). Но его установить нельзя. Его можно только сбросить.
     
  15. Seltvik

    Seltvik Нуб

    другой вопрос был в том что у меня два одинаковых кристала в корпусе TQFP так вот один на одном из них ватчдог пашет без всяких отдельных загрузчиков на другом нет. Как такое может быть то? и в тот и втот лью скетчи через программатор ISP
     
  16. Seltvik

    Seltvik Нуб

    я говорил про флаг о котором писали выше MCUSR =0; с ним вроде пашет но какое то время потом повисает) но полную конструкцию еще не пробовал я
     
  17. b707

    b707 Гуру

    имхо, никак.
    Либо кристаллы все-таки разные (например, один дохлый), либо что-то по разному делаете
     
  18. Seltvik

    Seltvik Нуб

    В том то и фиг. Но может все же ISP не затирает загрузчик? просто один из кристалов выпаян с наны другой с про мини) но они одинаковые по маркировке и там и там стандартный скетч на мигание ну как у вас крч. Вот и удивлен. Скажите а данная конструкция будет работать на чипе мега2560?
     
  19. b707

    b707 Гуру

    не могу сказать.
    В сообщении выше - где выложен этот код - есть ссылка на источник и приписка внизу. где я честно признаюсь что автор кода не я.
     
  20. parovoZZ

    parovoZZ Гуру

    Блин, почитал бы учебник что ли какой про AVR. MCUSR - это регистр, а не флаг. Сброс флагов в этом регистре ни на что ровным счетом не влияет. Он только лишь показывает причину старта МК.