Не могу вылечить ватчдог на "голой" атмеге328р с внутр тактированием 8 МГц
- Войдите на сайт для отправки комментариев
Вроде и голый контроллер прошиваю не впервые, и загрузчик для "лечения" ватчдога приходилось менять - все было без проблем. Но ватчдог на "голом" МК запускаю первый раз. И ничего не выходит.
Выставляю фьюзы (рассчитаны по калькулятору для 8MHz internal), беру оптибут загрузчик, прошиваю в Ардуино ИДЕ через Arduino ISP - все прошивается без проблем. По диагностике avrdude видно, что фьюзы шьются правильные, файл буллоадера берется тот, что нужно. Заливаю тестовый скетч - тоже без ошибок. Так как у контроллера нет обвязки USART, то подключил к МК OLED дисплей и смотрю вывод на нем. После включения ватчдога плата наглухо виснет. На РЕСЕТ не реагирует, только на отключение питания.
Прошерстил гугль - конкретно моего случая нет, у всех после замены бутлоадера на оптибут ватчдог работает. Оптибутовских загрузчиков попробовал 3 шт разных -
1) из гитхабовского релиза оптибута файл optiboot_atmega328_pro_8MHz.hex
2) из проекта MiniCore = файл optiboot_flash_atmega328p_UART0_38400_8000000L.hex
3) и даже в одном месте вычитал, что можно брать бутлоадер и под 16МГЦ - взял стандартный оптибут optiboot_atmega328.hex
После прошивки любого из этих бутов никаких изменений в поведении контроллера не происходит - точно так же без проблем перешивается и так же виснет при запуске вотчдога.
Честно говоря. я в тупике. Больше идей нет. Такое впечатление, что не вижу чего-то прямо перед носом. Может кто что подскажет?
Для справки -
Фьюзы и параметры бутлоадера можно посмотреть в файле boards.txt:
############################################################## atmega328bb.name=ATmega328 on BB (8 MHz internal optiboot) atmega328bb.upload.tool=avrdude atmega328bb.upload.protocol=arduino atmega328bb.upload.maximum_size=32256 atmega328bb.upload.speed=57600 atmega328bb.bootloader.tool=avrdude atmega328bb.bootloader.low_fuses=0xE2 atmega328bb.bootloader.high_fuses=0xDE atmega328bb.bootloader.extended_fuses=0x05 atmega328bb.bootloader.file=optiboot/optiboot_atmega328_pro_8MHz.hex atmega328bb.bootloader.unlock_bits=0x3F atmega328bb.bootloader.lock_bits=0x0F atmega328bb.build.board=ATMEGA328BB atmega328bb.build.mcu=atmega328p atmega328bb.build.f_cpu=8000000L atmega328bb.build.core=arduino:arduino atmega328bb.build.variant=arduino:standard
Тестовый скетч
#include <avr/wdt.h> #include "oled.h" void setup() { wdt_disable(); LEDPIN_Init(); LED_Init(); LED_P8x16Str(23,0,"wait"); delay(16000); wdt_enable (WDTO_8S); } void loop() { //wdt_reset(); LED_P8x16Str(23,0,"wdt on"); delay(1000); }
Провел еще один тест - подключил к одному из пинов МК светодиод. Была мысль, что при ресете от ватчдога просто не стартует LED-экран, а все остальное - работает. Это уже просто от безисходности
Снова мимо. При первом старте платы светик загорается, гаснет при срабатывании ватчдога и больше не зажигается. То есть дело не в том, что просто не зажигается экран - плата реально зависает...
Попробуй поменять время собаке на меньшее.
Попробуй поменять время собаке на меньшее.
Попробовал 1сек - без разницы.
Упростил тест до предела, чтобы эксперимент был максимально чистым:
1. Взял новую (еще ни разу не шитую) атмегу328р
2. Собрал на макетке классическую обвязку
3. Прошил оптибутовский загрузчик с фьзами 0xE2 0xDE 0x05
4. подключил к 7 пину светодиод
5. 3алил мега-простой скетч
Итог - при включении светик горит 16сек, потом начинает мигать. После срабатывания ватчдога - мигает часто-часто - то есть типичный случай бесконечного ресета.
Этот же самый бутлоадер в Нано - работает!!! ватчдог ресетится как положено.
Вывод - налицо несовместимость оптибута с атмегой328 с внутренним клоком 8МГц. Если это так = давно бы куча других ардуинщиков столкнулась бы с этим. Вопрос - почему я не вижу в гугле десятков подобных жалоб?
Варианты:
А) - я идиот. Уже готов согласится, при условии, что кто0нибудь обьяснит, в чем именно.
Б) - мне попалась бракованая партия контроллеров. Не исключено. Проверить просто - нужна другая папртия. Может кто-нибудь не пожалеет получаса, повторит перечисленные выше пп 1-5 и напишет свой результат?
В) - предлагайте свои варианты
С субботы на воскресенье всегда так. Все нормальные спят.
А по делу-я сча попробую проверить( пивко псле копоратива эсли позволит). Как ты сказал- "это где-то под носом"У мну была ппрблм с ватчдогом с мегой32. Но насколько могу вспомнить- проблема в Мега32.(Ватч от 2 ух сек и ниже только работал)
Вывод - налицо несовместимость оптибута с атмегой328 с внутренним клоком 8МГц. Если это так = давно бы куча других ардуинщиков столкнулась бы с этим. Вопрос - почему я не вижу в гугле десятков подобных жалоб?
Однозначно работает, ректификатор на нем пару лет пашет. Сам оптибут есть, а вот секцию с фузами потерял когда комп переустанавливал. Т.к. шил первый раз брал все с сайта. Поищи, это у Жеки_ТМ было, он ссылку где то на ЯД давал.
В) - предлагайте свои варианты
[/quote]
Собака настроена на 1сек и delay 1сек + обрабока пина => времени срабоки собаки
Почему закоментирован сброс собаки.
Собака настроена на 1сек и delay 1сек + обрабока пина => времени срабоки собаки.
интервал собаки можно взять любой - ничего не меняется. Первоначально стояло 8сек, это я уже по совету Штирлица уменьшил.
потому что! :) это вы не проснулись еще...
Народ, вынужден поднять ветку, так как очень нужно решение
Прошу тех, у кого есть под рукой атмега328 в DIP-корпусе - попробовать залить мой скетч и написать о результате.
Попробуй отсюда, на 168 проминьку недавно делал, как раз для собаки, нормально пашет.
Попробуй отсюда, на 168 проминьку недавно делал, как раз для собаки, нормально пашет.
да. спасибо, уже сам нашел эту ветку и прочитал все страницы. Вечером попробую.
Попробуй отсюда, на 168 проминьку недавно делал, как раз для собаки, нормально пашет.
сгенерил бутлоадер по ссылке, прошил - результат тот же.
Все больше прихожу к выводу. что причина во мне - не замечаю чего-то очевидного.
Может все ж-таки кто-то потратит 20 минут времени и попробует повторить мои тесты ?
У меня где-то есть 168-я в DIP, но она уже стояла в ардуине...
сорри, что поздно заметил!!!! Это лечится ОЧЕНЬ просто и об этом написано в документации:
Functions
Detailed Description
This header file declares the interface to some inline macros handling the watchdog timer present in many AVR devices. In order to prevent the watchdog timer configuration from being accidentally altered by a crashing application, a special timed sequence is required in order to change it. The macros within this header file handle the required sequence automatically before changing any value. Interrupts will be disabled during the manipulation.
Note that for newer devices (ATmega88 and newer, effectively any AVR that has the option to also generate interrupts), the watchdog timer remains active even after a system reset (except a power-on condition), using the fastest prescaler value (approximately 15 ms). It is therefore required to turn off the watchdog early during program startup, the datasheet recommends a sequence like the following:
Saving the value of MCUSR in
mcusr_mirror
is only needed if the application later wants to examine the reset source, but in particular, clearing the watchdog reset flag before disabling the watchdog is required, according to the datasheet.==========================
вот пример кода, который я ТОЬКО ЧТО проверил на голом 328 в ДИП корпусе.
Вот видео, снял и кинул на Ютуб
Вот код:
wdrakula, спасибо огромное, вечером проверю. Думаю, что заработает :)
О необходимости этого кода я уже читал во многих местах. Но он, в принципе, должен быть встроен в оптибут - собственно, потому замена штатного бута на оптибут и "лечит" ватчдог. Поэтому я не добавлял этот код в скетч, рассчитывая. что оптибут справится сам.
wdrakula, спасибо огромное, вечером проверю. Думаю, что заработает :)
О необходимости этого кода я уже читал во многих местах. Но он, в принципе, должен быть встроен в оптибут - собственно, потому замена штатного бута на оптибут и "лечит" ватчдог. Поэтому я не добавлял этот код в скетч, рассчитывая. что оптибут справится сам.
Перед тем, как писать, я проверил не только с оптибутом, но и вообще без бутлоадера. С разными фьюзами (и E2 DA и C2 DB - если понимаете, о чем я ).
Нет - работает ТОЛЬКО так.
Я всегда проверяю свои рекомендации (и софтовые и электронные) перед постингом, даже если ответ кажется очевидным.
Сперва я проверил вообще без бута, и добавив "wdr" в main() в ядре. Казалось, что это очевидное решение, что еще хотеть? Ан нет, однако, ответ написан выше ;) ;) ;)
wdrakula,, твой код тоже не работает.
Зато если поместить сброс регистра ватчдога MCUSR в сетап - работает.
Рабочий код получился таким:
Может ерунду предположу - но похоже на то, что при рестарте контроллера исполнение начинается прямо со скетча - без запуска бутлоадера и без пре-инит функций.
wdrakula,, твой код тоже не работает.
Выложен код и видео. Остальное - чушь какая-то.
Выложен код и видео. Остальное - чушь какая-то.
Влад, погоди
Я не сказал, что твой код неверный. Просто на моей атмеге он не работает. Возможно, я там уже слишком намудрил с конфигами...
Сижу. читаю апноуты и даташиты, разбираюсь. Пока нашел только указание, что работоспособность этого решения зависит от опций компилятора.
на чистую ИДЕ поставь ЭТУ надстройку для бредбоард.
Сперва перезапускаешь ИДЕ и вызываешь "Записать загрузчик".
Потом компилируешь и загружаешь программу.
Больше НИЧЕГО не делаешь.
---------------------------
Я написал, что проверил много вариантов. В том числе и ВООБЩЕ без загрузчика.
Я делал вообще отдельное ядро с отдельными библиотеками, чтобы скетч грузился по кнопке, а не через "Загрузить через программатор", для "голого" 328, без бута.
Решение с кодом в .init3 - самое простое и правильное. Работает с дефолтным бутлоадером и дефолтными фьюзами.
Твоя идея про загрузку - не соответствует даташиту, если у тебя хоть что-то и как-то запустилось без кода в секции .init3, то значит этот код есть в загрузчике, что маловероятно, так как в оптибуте его нет. Может его добавили во что-то еще? Иначе никак... честное пионерское! ;)
Ради спортивного интереса, можешь указать свою надстройку для голого контроллера и версию среды - посмотрю на ней. Только Виндоус ставить не стану, даже для проверки ;) - это "глубокая личная непереносимость", у меня есть древняя ХР на виртуалке - этого для меня вполне хватает, если приползает что-то виндовое.
на чистую ИДЕ поставь ЭТУ надстройку для бредбоард.
Сперва перезапускаешь ИДЕ и вызываешь "Записать загрузчик".
Потом компилируешь и загружаешь программу.
Больше НИЧЕГО не делаешь.
Ну я так и делаю. Моя настройка для голого контроллера есть в первом сообщении ветки (первый спойлер) - она практически идентична твоей. Версия ИДЕ 1,8,3 Win7 x64
Попробуй отсюда, на 168 проминьку недавно делал, как раз для собаки, нормально пашет.
сгенерил бутлоадер по ссылке, прошил - результат тот же.
Все больше прихожу к выводу. что причина во мне - не замечаю чего-то очевидного.
Может все ж-таки кто-то потратит 20 минут времени и попробует повторить мои тесты ?
У меня еще хужее, начал тратить 20 минут и уперся в стену. Сформировал HEX, секцию подготовил, залил через IDE Ar..ISP, все нормально влилось. А от когда попытался залить блинк через преобразователь на ch340: "Нет синхронизации", если вставить в Ардуину (RT232), аналогично. (((( У Вас нормально с этим загрузчиком скетчи заливались?
Вчера уже надоело, сегодня вернусь, фузы проверю и со скоростью поиграюсь. Для 168 на 16мГц все сразу взлетело. Загадка природы.((((
У меня еще хужее, начал тратить 20 минут и уперся в стену. Сформировал HEX, секцию подготовил, залил через IDE Ar..ISP, все нормально влилось. А от когда попытался залить блинк через преобразователь на ch340: "Нет синхронизации", если вставить в Ардуину (RT232), аналогично. (((( У Вас нормально с этим загрузчиком скетчи заливались?
Сорри, что втянул :)
Я заливаю скетчи через SPI - точно так же как загрузчик. После заливки загрузчика ничего не отсоединяете, можно вообще сразу же, как залился загрузчик - жмете "Скетч - Загрузить через программатор".
А через загрузчик я на голом контроллере не пробовал - везде написано, что без кварца UART может не работать.
на чистую ИДЕ поставь ЭТУ надстройку для бредбоард.
Сперва перезапускаешь ИДЕ и вызываешь "Записать загрузчик".
Потом компилируешь и загружаешь программу.
Больше НИЧЕГО не делаешь.
Ну я так и делаю. Моя настройка для голого контроллера есть в первом сообщении ветки (первый спойлер) - она практически идентична твоей. Версия ИДЕ 1,8,3 Win7 x64
Я еще переделывал platform.txt
без него не работает, вот он:
Сорри, что втянул :)
Я заливаю скетчи через SPI - точно так же как загрузчик. После заливки загрузчика ничего не отсоединяете, можно вообще сразу же, как залился загрузчик - жмете "Скетч - Загрузить через программатор".
А через загрузчик я на голом контроллере не пробовал - везде написано, что без кварца UART может не работать.
Та чеж сорри то? Самому интересно стало, да возможно грабли миновал (плату разведешь и будешь репу чесать). Если через SPI, то нахрена тогда и загрузчик нужен.
Если через SPI, то нахрена тогда и загрузчик нужен.
ну я ж не только по SPI гружу...
Тут уже тоже не только практический вопрос, но и просто интересно - почему загрузчик не работает?
А он, похоже, таки не работает... судя по результатам твоих и моих тестов.
Я еще переделывал platform.txt
А что именно переделывал, не помнишь?
Я еще переделывал platform.txt
А что именно переделывал, не помнишь?
конечно помню!
-flto отключай или добавь
__attribute__((used))
к описанию функции, что тебе проще. Сорри, все проверил, а этого тебе не рассказал. У меня -flto всегда отключено.
(это Линк Тайм Оптимизация, если знаешь... штука странная и не полезная)
Мдя, вести с полей. После загрузки первый цикл отрабатывает, а потом вечный ребут.((((
Други, если добьете, манул для лохов вроде меня, плиз, а то я уже давно потерялся.((((
Пля....
" 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."
и на это я потратил 5 дней :))))
ПОЗОР
Мдя, вести с полей. После загрузки первый цикл отрабатывает, а потом вечный ребут.((((
Други, если добьете, манул для лохов вроде меня, плиз, а то я уже давно потерялся.((((
Я потерялся в ваших вопросах: у тебя что не работает? Если Вочдог, то вот такой код должен работать на любом камне: (обрати внимание на атрибут "used")
Мдя, вести с полей. После загрузки первый цикл отрабатывает, а потом вечный ребут.((((
bwn. так и должно быть, если ты загрузил скетч по SPI. Оказывается, при этом удаляется бутлоадер... (см предыдущее сообщение).
Способ "вылечить" ватчдог в этом случае - от wdrakula в сообщении 13. Или мой код чуть дальше.
Ну а я оптибут нашел, который с USB-UART дружит. Тот на который ссыль давал не синхронизируется.
Что по SPI загрузчик трет, знал, тока с собаком не смог это связать.))))
Всем спасибо за науку.
Ну а я оптибут нашел, который с USB-UART дружит. Тот на который ссыль давал не синхронизируется.
а ссылку можно - какой синхронизируется, а какой нет.
Ссыля нет, он у меня на диске валялся, Жека_ТМ давал. Если надо могу хекс скинуть.
Ссыля нет, он у меня на диске валялся, Жека_ТМ давал. Если надо могу хекс скинуть.
Хекс - это ж текстовой формат, выложи как код под спойлер
ОК.
Загрузочная:
ну понятно, в этом скорость UART задана 38400, а в том, что генерится по ссылке - 115200. Я нашел старую ветку обсуждения того генератора - там автору многие указывали. что 115200 для 8МГц без кварца - это слишком быстро. Он, вроде, согласился, но так и не поправил.
Спасибо!
wdrakula, код из сообщения №30 - РАБОТАЕТ (тот, который с атрибутом _used_)
Ну и вообще - полная победа! Проверил все варианты прошивки - и с бутлоадером, и без - все отлично работает!
Спасибо, мужики, огромное!!
Вот. С трудом нашел эту старую тему.
Выдалась пара часов на фоне чистки "снегопада века", починки китайского снегоочистителя, постоянной работы н\генератора, так как провода рвутся и электричество уходит! И ведь самогонка сама не выгоняется. Все сложно (с), короче.
====================================================================
Поправил бутлоадер, не "опти", а классику - она правда лучше. Теперь он раболтает на "голом" 328 на внутр. 8 МГц.
1. Makefile
настраивать можно скорость компорта и время ожидания перед закачкой (то время, за которое нужно успеть нажать ресет) - настраивается в "попугаях" то есть в количестве циклов ожидания. сейчас стоит F_CPU >> 2, что равно 8млн/4=2млн циклов... ну где-то пара секунд.
avr-gcc и все эти вещи, предполагаются на путях - или пишите полные пути в мейкфайле. У меня Линух и стоит все для АВР. На Винде можно все настроить - есть полные тулчейны, или пропишите путь к тому, что идет с АрдуиноИДЕ.
2. Сам бутлоадер. Там пара мест моих правок - ЛЕД не на той ноге. Мои места помечены //WLAD. Чужие комментарии я частично стер частично оставил - мне они нахер не сдались, может кому-то полезны будут. ЕЩЕ РАЗ: "Мопед не мой" - в том смысле, что код не мой, а стандартный из ИДЕ, я причесал чуть чуть.
НАЗЫВАТЬ ЕГО НАДО: ATmegaBOOT_328only.c И ТОЛЬКО ТАК. Ну или меняйте название в мейкфайле.
3. ну и boards.txt к ним до кучи.
Скорость компорта тут и в мейкфайле должна совпадать.
=======================================
все это проверено в условиях:
Бутлоадер грузился через Нано с ArduinoISP из 1.8.5.
В качестве USB-UART использовалась Мега с закороченным на GND Ресетом.
В качестве тестового скетча был использован скетч из этой темы выше, мой вариант теста Вочдога. Только вывод был в Сериал, а не на дисплей.
Откомпилированный именно этот код, для тех, кого компилятор "не встает" на сборку бутлоадера ;) ;) ;)!!!.
В продолжение темы бутлоадеров с работоспособным вотчдогом.
Прикупил ПроМини с 168P и кварцом 8 мгц (3,3в). Заливал загрузчик из пакета оптибута: optiboot_pro_8MHz.hex. (USBASP)
Пробовал залить из "Конструктор Bootloader`а" с конфигурацией 168 / 8.
В обеих случаях потом не могу загрузить сектч через uart.
Using Port : COM3
Using Programmer : arduino
Overriding Baud Rate : 57600
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xec
скорость порта менял от 9600 до 115200. результат тот же.
Фюзы - E:FC, H:DD, L:C6
Что делаю не так и где взять рабочий бутлоадер на 8мгц (маленький и с вотчдогом)
так через UART или через USBASP ? - это как бы принципиально разные вещи
бутлоадер через USBASP, потом уже скетч пытался через UART.
я брал отсюда: http://homes-smart.ru/index.php/oborudovanie/arduino/avr-zagruzchik
я брал отсюда: http://homes-smart.ru/index.php/oborudovanie/arduino/avr-zagruzchik
Брал и там тоже. Не работает. Если у вас работает, расскажите подробнее какая у вас конфигурация, какие фьюзы и на какой скорости заливаете скетчи, с помощью этого загрузчика. Вполне вероятно, я что-то сделал не так...
Как то так все работает, на 115200 шьется. Понятно, что верхний файлик переименовываешь в a168_8MHz_ff_de_4.hex и кладешь в паgку optiboot. в boards.txt добавляешь, что ниже. Далее перезагружаешь IDE, в списке видишь свою плату, Далее с помощью USBASP загрузить загрузчик, чтобы правильно прописались фьюзы. И пользуешься через UART.
То что у меня 168P роли не играет? просто скорректировать 168 на 168Р в board.txt?
Несколько человек уже отписывались, что через USBASP не могут нормально бутлоадер прописать. Уж не знаю в чем дело, толи дешевые USBASP глячат, то ли в ИДЕ какие несовместимости.
Ардуиной через SPI скетчем "Ардуино-ИСП" записывается надежнее.
А коллективный разум уже решил что цеплять к входу ресет программируемой ProMini ?
А то я встречал от "ничего" до "электролит 47-100мкф"...
Я прошивал голый 328р на собственной плате через АрдуиноИСП, ресет посоединял напрямую к 10 пину программатора, без резисторов и кондеров.