Официальный сайт компании Arduino по адресу arduino.cc
Программный Reset
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Втр, 17/04/2012 - 21:48
Возможен ли программный ресет. По задумки 2 мк общаются друг с другом. После всех манипуляций мк№1 записывает данные во внешнюю память и посылает сообщение мк№2 о том что связь прекращается и о том чтобы мк№2 сосчитал данные со внешней память. Всё общение проходит нормально. Но когда мк№2 начинает считывать данные с памяти то он зависает. Прочём при старте обоих мк они удачно считывают с памяти всё содержимое.
ООО спасибо!!!! Работает!!! Скажи пожалуйста откуда ты узнал про это? Я весь инет перерыл прежде чем написать суда! Может есть место где всё более детально описано про arduino? (кроме оф сайта)
Кстати да, если не трудно - объясните эту магию :)
Для людей не испорченных глубоким знанием C, что вообще происходит в этом коде?
На самом деле ето не настоящий резет а просто перевод стека в начало програмного кода (в нулевой адрес). Тоесть программа начинает исполнятся с самого начала, при етом не влияя на установки МК на момент исполнения. Например: Если у вас на момент исполнения был установлен какой то порт в "1" и в начале программы его значение не возвращается в "поумолчанию = 0" то после так званой "програмной перезагрузки" порт так и останеться с "1".
Если попроще то вот для визуальной демонстрации:
если ничего не слать в порт то результатом будет двойное мигание светодиодом после продолжытельной паузы.
если же послать чтото, то перед перезагрузкой выход 13 установится в "1" и светодиод будет гореть даже после перезагрузки и до момента его го выключения (11й ряд).
Поетому используя даную функцию необходимо быть внимательным и заведомо устанавливать нужные значения.
Ну а если нужен самый настоящий резет то (наверно, в теории, хотя сам не пробовал) програмно прижымать пин Reset к земле другим пином.
весь инет перерыл прежде чем написать суда! Может есть место где всё более детально описано про arduino? (кроме оф сайта)
Кстати уже в сотый раз убедился что от правильно поставленого вопроса зависит возможность получения правильного ответа. Если погуглить "arduino reset function" то почти сразу наткнетесь на тоже и еще + несколько вариантов.
А я вот досихпор не могу правильно сформулировать вопрос дядюшке гуглю насчет следующего arduino.ru/forum/programmirovanie/udalenie-proshyvki-programnym-putem
А я вот досихпор не могу правильно сформулировать вопрос дядюшке гуглю насчет следующего arduino.ru/forum/programmirovanie/udalenie-proshyvki-programnym-putem
avr write flash memory или
writing или
program memory
Наконец
"avr flash запись" в Яндексе - и DiHalt вам популярно объяснит, как записать что-нибудь поверх существующей программы.
Ну а если нужен самый настоящий резет то (наверно, в теории, хотя сам не пробовал) програмно прижымать пин Reset к земле другим пином.
ATMEL не советует делать это, поскольку метод не дает стабильных результатов.
подача сигнала на reset-ногу приводит к запуску цикла инициализации, НО - первым делом производится инициализация всех I/O-выводов в качестве входов. Низкий уровень на RESET при этом естественным образом пропадает - слишком рано для полноценной отработки процесса инициализации.
watchdog - для AVR это магическое слово (а по совместительству еще и таймер), позволяющее автоматически перезапустить МК в случае зависания программы (ну или целенаправленно - если возникает такое желание).
Однако, при "полноценном" ресете необходимо помнить, что он запустит и бутлоадер, который, в свою очередь, в определенных условиях может решить, что настал момент для перезаписи программы, и ...
step962, у меня возникли некоторые вопросы, разЪясните, пожалуйста:
1. Для чего сначала отключаем затем включаем watchdog?
2. По-умолчанию данный таймер отключен?
3. Играет ли какую-нибудь роль, что происходит в теле цикла? наприер:
pin в течении 15 мс меняется, произойдет сброс?
1. Возможно необязательно. Без wdt_disable не проверял. Но, поскольку ватчдог имеет три режима работы, могу предположить, что для корректного переключения этих режимов требуется отключение таймера на время проведения работ.
2. Соответствующие разделы в даташите (10.8-10.9 для ATmega328) не слишком большие. Недвусмысленного ответа на этот вопрос я там, однако, не нашел. Но в описании регистра WDTCSR сказано, что бит WDIE, ведающий разрешением прерывания от сторожевого таймера, по умолчанию сброшен. То есть, по крайней мере прерывание (а это два режима из трех возможных) замаскировано по умолчанию. Для бита WDE, который разрешает системный ресет, в качестве значения по умолчанию указан х. Видимо, тут требуется также и значения каких-то фьюзов учитывать. Но для программ, сгенерированных из-под Arduino IDE, можно сказать, что таймер по умолчанию отключен, т.к. не нужно его сбрасывать.
3. Роль играет только своевременное выполнение инструкции сброса сторожевого таймера (макрос "wdt_reset()"). Если таковая не вызывается в течение времени, на которое настроен сторожевой таймер (от 15 мс до 8 с), то происходит сброс системы или генерация прерывания или прерывание+сброс системы - в зависимости от режима, в котором работает таймер. Так что
pin в течении 15 мс меняется, произойдет сброс?
pin в течении 15 мс меняется, произойдет сброс.
Кто-нибудь разоборался со сторожевым таймером? Может, кто-нибудь поделится готовым скетчем?
У меня следующая проблема: есть ардуина с датчиком и беспроводным модулем (эдакий беспроводной датчик). Система работает некоторое время (случайная величина, обычно несколько часов работает нормально, но потом вешается). Нажатие на кнопку RESET - полностью нормализует работу до следующего "зависона".
Как понимаю, сторожевой таймер - это "то, что доктор прописал". Логику действий понимаю так:
1. Деактивируем сторожевой таймер (в функции setup)
2. задаем значение сторожевому таймеру (setup) - даем значение времени, несколько большее длительности основного цикла.
3. активируем сторожевой таймер (setup)
4. сбрасываем сторожевой таймер (уже в функции loop)
соответственно, если программный сброс сторожевого таймера не произошел (из-за "зависания") - сторожевой таймер ребутнет контроллер и все пойдет заново.
P.S. прошу поправить, если неправильно понял и помогите с кодом (наверняка уже кто-то писал подобное)...
Немного не так.
По умолчанию он выключен. Когда мы его "активируем" (в setup) он начинает тикать, и увеличивать свой внутрений регистр. Когда он "переполнится" - происходит ресет (или вызывается указанная вами функция, как сконфигурите). Поэтому нужно его регулярно "обнолять". Где-нибудь в loop(). Говорить ему "все хорошо, скетч работает". С какой скоростью он "тикает" - зависет от тактовой частоты и пред-делителей.
Вообщем сериал Lost смотрели? Помните там мужичек сидель годами в бункере и каждые несколько часов нажимал кнопку что-бы мир не возрвался? Сбрасывал таймер. Вот у нас тоже самое. "бомба" - это сторожевой таймер, мужичек - наш скетч. Разница только в том, что кнопку "начать отсчет заново" мы можем нажать когда хотим, а он мог только в последний момент :)
Конкретно как его конфигурировать (какие порты, какие биты за что отвечают) - читать даташит.
Ну или, как всегда, пытаться найти библиотеку где это уже сделали за нас.#include <avr/wdt.h> Читать можно тут http://tushev.org/articles/electronics/48-arduino-and-watchdog-timer
Вообщем скетч должен выглядеть примерно так:
ОСТОРОЖНО! ОН МОЖЕТ ПОЛОМАТЬ ЗАЛИВКУ НОВЫХ СКЕТЧЕЙ. Заблокировать вашу дуину. Дочитайте до конца.
К сожалению, арудино бутлоадеры имеют "большие проблемы" с этой собакой. При ресете она не деактивируется. Поэтому ее нужно побыстрому запретить в самом начале setup(). И рекомендуют ставить "отсчет" не меньше двух секунд, что-бы бутлоадер успел отработать до "очередной сработки" и скетч начал выполнятся. Иначе мы получаем бесконечный ребут и незвозможность заливать скетчи.
С этим имели проблему старые бутлоадеры, потом это "починили", а в свежих версиях arduino mega, как говорят в комментах (и мой опыт) - опять "поломали". Он начинает тикать "очень быстро" и даже не успевает дойти до setup()
Лечится через вырубание питания и зажатия ресета, подруб питания и отпускание ресета в момент заливки.
Но, естественно толку "в таком виде" - от него нет. Использовать - нельзя (по крайней мере на моей mega1280). Вроде есть фиксы бутлоадера для этого, но пока он мне не настолько нужен что-бы лезть в перешивку бутлоадера.
Так что "используйте преведенный скетч" на свой страх и риск. Лично у меня получается выводить плату из бесконечного ребута "легко", но гарантировать что так будет и на вашей плате - я не могу. Впрочем может у вас вообще не будет этого лока.
Спасибо за подробное описание (сам думал о том же, но половину "оставил за скобками"). Пример заработал, НО.
"Большие проблемы" с собакой подкралиь теперь с другой стороны. Скетч выполняется (я рисковый ;)), но как только "собака" должна сработать - она это делает неправильно. Ардуина останавливается и начинает диким образом моргать светодиодом на 13 ноге...
Беглое гугление дало вот такую ссылочку: http://forum.amperka.ru/threads/%D0%A1%D1%82%D0%BE%D1%80%D0%BE%D0%B6%D0%B5%D0%B2%D0%BE%D0%B9-%D1%82%D0%B0%D0%B9%D0%BC%D0%B5%D1%80-watchdog-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D0%B2-%D0%90%D1%80%D0%B4%D1%83%D0%B8%D0%BD%D0%BE.64/
Похоже, придется-таки обновить бутлоадер.. видимо, так: http://freeduino.ru/arduino/isp.html (и использовать именно ISP, так как ни на одной моей плате нет контактов, выведенных с FD232RL в виде разъема, а подпаяться к корпусу - на такую тонкую работу я еще не готов;))
P.S. попробовал пример на плате NANO - и заработало.. жаль, что сторожок нужен на "большой" плате...
"Большие проблемы" с собакой подкралиь теперь с другой стороны. Скетч выполняется (я рисковый ;)), но как только "собака" должна сработать - она это делает неправильно. Ардуина останавливается и начинает диким образом моргать светодиодом на 13 ноге...
Такэто же не "с другой стороны", а именно с той про которую я говорил. Быстрое мигание светика - это внешнее проявление постоянного ресета. Сама собака срабатывает как надо (так как она в железе, от софта не зависит), только вот "заткнуть ее" бутлоадер не умеет и она гавкает без остановки.
Лечить либо уфиксаным бутлоадером, либо альтернативным от энтузиастов (optiboot и т.п.). Из описания "как заливать", я где-то видел типа закинули в папку, выбрали плату, нажали burn bootloader. Без упоминания про необходимость ISP (сам удивился). Хотя может и проглядел.
Но даже если ISP внешний обязателен. Вас-то это не должно остановить. Раз у вас есть Nano. Льете в нее скетч ArduinoISP - и имеете программатор. Соеденяете ее 5-тью поровдками с мегой и шеьете ее как хотите. Вначале можете попробовать залить в мегу, с помощью наны обычный скетч. Если получится - дальше можно как угодно без страха с бутлоадерами игратся - под рукой есть программатор, которым можено все "перешить назад" :)
Хм... так расписал, что задумался, а не собрать ли мне на макетке минимальную дуинку, именно "под программатор". Когда собака станет "жизненно необходимой" - наверное так и сделаю.
да платок уже большой набор (сидуины, фридуины и т.п.), но вот у всех "полноформатных" - бутлоадер везде убогий.
а вот две NANO (одна ардуина, вторая кардуино) - обе со сторожем работают нормально.
Как организовать из одной платы ISCP - понятно (6 проводков и один разъемчик - все есть и сделать можно за 2 минуты). Вот дальше пока затыки:
1. вроде как надо у платы, которая будет программатором надо убрать автоматический сброс (сделать могу, вопрос - надо ли)?
2. вроде как есть возможность шить прямо из среды ардуино (что нужно? залить скетч ArduinoISP в "программатор"? а дальше? как проверить, что работает? подключить "прошиваемую плату" и попробовать в нее блинк залить? нажимаем обычные кнопки в среде ардуино или какие-то более сложные манипуляции?
3. пока было не надо - попадались упоминания fuse-битов.. что-то в среде ардуино я их вообще нигде не вижу...
4. еще есть упоминание программирования из консоли (или с помощью дополнительного GUI к консольному прошивальщику)...
в общем, вопросов пока сильно больше, чем понимания...
Информации много, но она разрозненная и пока не попалась простая пошаговая инструкция (хотя вроде процедура должна быть действительно простая).
1. вроде как надо у платы, которая будет программатором надо убрать автоматический сброс (сделать могу, вопрос - надо ли)?
Нет. Не нужно.
2. вроде как есть возможность шить прямо из среды ардуино (что нужно? залить скетч ArduinoISP в "программатор"? а дальше? как проверить, что работает? подключить "прошиваемую плату" и попробовать в нее блинк залить? нажимаем обычные кнопки в среде ардуино или какие-то более сложные манипуляции?
Да я уже несколько раз описывал это тут. Например вот: http://arduino.ru/forum/obshchii/programmirovanie-atmega8-s-pomoshchyu-arduino-nano
Сообщения #18, #20
как проверить, что работает? подключить "прошиваемую плату" и попробовать в нее блинк залить?
Да. Я именно так и делал.
3. пока было не надо - попадались упоминания fuse-битов.. что-то в среде ардуино я их вообще нигде не вижу...
По ссылки выше их увидите... но я не морочился. Скопировал их с существующего описания платы.
4. еще есть упоминание программирования из консоли (или с помощью дополнительного GUI к консольному прошивальщику)...
Ну да.. вообщем-то вся ардуиноIDE - обертка над консолями. Над компилятором и avrdude (для заливки). Если включить расширенный режим лога, то внизу можно даже будет увидеть, как и с какими параметрами IDE вызывает все эти консоли. Но мне оно "не нуно было". Работал прямо из IDE.
Информации много, но она разрозненная и пока не попалась простая пошаговая инструкция (хотя вроде процедура должна быть действительно простая).
Да. Уже несколько месяцев собираюсь выписать это в свой бложик (надоело все время отвечать на 10 ток вопросов с вариациями). Да все руки не доходят.
>> void(* resetFunc) (void) = 0; // Reset MC function
resetFunc(); //вызов <<
Интересно.
Я как то тоже интернеты копал по програмному ресету , но так ничего и не нашел.
Пришлось делеть железнай сброс , релюшка , транзюк и кондер на базе транзюка.
Для статистики.
Ардуино нано v3. Куплена в китае.
Собака не работает. Не зависимо от установленного времени начинает дрыгать светодиодом и не хочет принимать скетчи. Перепрошивка не помогает.
Пришлось исправить boards.txt
После прошилось и заработала заливка скетчей и самое главное - заработала и собака.
Кому еще актуален вопрос на mega 2560 пофиксенный бутлоадер есть в дистрибутивах (не знаю начиная с какого, но в arduino-1.0 точно есть) по адресу \arduino~\hardware\arduino\bootloaders\stk500boot_v2_mega2560.hex
Еще раз для фиксации сабжа
... насколько я понимаю, проблема watchDog существует из-за неоднозначностей в некоторых бутлоадерах х-дуин. Исправляется заливкой альтернативных бутлоадеров.
Если для прошивки атмеги на дуиновской, макетной, или иной плате применяется ПРОГРАММАТОР , в бутлоадере нет необходимости, он работает ТОЛЬКО с размещенными на дуиновских платах программаторами от USB, построенными на атмегах типа 8U что то, или 16 U что то. Таким образом при заливке по ISP с программатором watchDog работает без заморочек.
ТАК ЛИ ЭТО ?
Еще раз для фиксации сабжа
... насколько я понимаю, проблема watchDog существует из-за неоднозначностей в некоторых бутлоадерах х-дуин. Исправляется заливкой альтернативных бутлоадеров.
Если для прошивки атмеги на дуиновской, макетной, или иной плате применяется ПРОГРАММАТОР , в бутлоадере нет необходимости, он работает ТОЛЬКО с размещенными на дуиновских платах программаторами от USB, построенными на атмегах типа 8U что то, или 16 U что то. Таким образом при заливке по ISP с программатором watchDog работает без заморочек.
ТАК ЛИ ЭТО ?
если проблемы в лоадере, то "да" - энто так: нет лоадера - нет проблем.(Всегда ваш,КО)
Вот еще в копилку программный сброс:
Доброго времени суток!
Мучал Про Мини... что то не получилось заставить работать адекватно собаку......
Вопрос может глупый, а можно ли вообще снести загрузчик и как это сделать? А то что то не смог адекватную инфу нарыть по этому вопросу.
Скетчи писать через программатор по SPI......
Подключи по SPI и прошей скетч. Лодер сам улетучится.
Однако.......
И так шью через SPI, значит и лоудера там не долждно быть.... тады почему собака не робит.... странно.....
если собаке поставить очень короткое время - то она не позволит и процу запуститься.
Качни себе Khazama AVR Programmer
Он работает с UsbASP. С мопощью него можно стереть чип и выставить фьюзы.
Но у меня ардуино иде после загрузки через программатор, уже не давал через загрузчик грузить. Значит стер.
На худой конец avrdude. -E стирает чип, одновременно снимает лок биты.
Ну где то вычитал что собака включается в начале по умолчанию на 15 мс и пофиг сколько ты в программе поставил, и вроде как лоудер не успевает за это время отрабоать, вот и глюк...
У меня задержка 8 сек стоит.... но проц встает колом... ресетом не перезагружается, только снятием питания.
программатор у меня из ардуины сделан, с залитым примером SPI.
Ардуиновый не пойдет для казамы.
Собака включается только если бит собакин стоит. В конфигураторе плат ардуино этот бит снят (не задан).
Я понял что это лодер ставит слишком короткий сброс.
Тоже маялся с ардуино ПРО, потом залил в него optiboot и стало офигенно
В оптибут вроде нет под ПРО 5в 16МГц прошивки.........
МОжет я чего криво делаю.......
А оптибуб, какой именно хекс заливался? КОторый заработал
Как так?
atmega328_pro16: TARGET = atmega328_pro_16MHz
atmega328_pro16: MCU_TARGET = atmega328p
atmega328_pro16: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
atmega328_pro16: AVR_FREQ = 16000000L
atmega328_pro16: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
atmega328_pro16: $(PROGRAM)_atmega328_pro_16MHz.hex
atmega328_pro16: $(PROGRAM)_atmega328_pro_16MHz.lst
atmega328_pro16_isp: atmega328_pro16
atmega328_pro16_isp: TARGET = atmega328_pro_16MHz
atmega328_pro16_isp: MCU_TARGET = atmega328p
# 512 byte boot, SPIEN
atmega328_pro16_isp: HFUSE = DE
# Low power xtal (16MHz) 16KCK/14CK+65ms
atmega328_pro16_isp: LFUSE = FF
# 2.7V brownout
atmega328_pro16_isp: EFUSE = 05
atmega328_pro16_isp: isp
Добавь это в makefile и перекопмилируй.
Подключи по SPI и прошей скетч. Лодер сам улетучится.
Не улетучится. Ардуино IDE не даст создать файл который не влезет во флеш минус размер загпузчика.
И всё равно, согласно фьюзам, будет стартовать именно с загрузчика.
Выход - отключить этот старт прошив программатором BOOTRST в "1"
Кстати сам загрузчик (если не затереть его большим кодом или не сделать ChipErase) прекрасно сохранится) и может быть снова включен через BOOTRST в "0"
Casper.... %)
Я не настолько крут в закулисьях.....
У меня такое ощущение что мы не много на разных языках говорим.
Приведенное табой вставить в файл по адресу?
C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\atmega\Makefile
???
Не могу врубиться где тут ссылка на оптибут..... и что перекомпилировать? Скетч?.... %)
Я себя почему то ощущаю одной из героинь Крыловской басни....
КОгда загрузчик прописываешь, Ардуина смотрит тип платы, который в инструментах/плата выбран?
Или она его опросом камня определяет?
Да. это makefile
Данный файл описывает как компилировать загрузчик.
Перекомпилировать загрузчики. Omake.bat
Он создаст заного hex загрузчиков. Потом придется загрузить заного загрузчик программатором и вуаля.
В принципе, дома могу взять и выложить готовый загрузчик. Ну чтобы не геморроиться.
Загрузчик прописан в boards.txt
вот пример
atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex
То есть может быть понадобится сделать еще и блок для платы.
Во, нашел в архивах.
https://dl.dropboxusercontent.com/u/91780549/3/bootloader.hex
Не PRO конечно, но под 328 камень TQFP на 16 мгц.
...........
В принципе, дома могу взять и выложить готовый загрузчик. Ну чтобы не геморроиться.
Буду премного благодарен..
так то вроде как вдуплился, че к чему, но почему то бат файл не запускается......
там вот эта хрень - ..\..\..\tools\avr\utils\bin\make OS=windows ENV=arduino %*
Честно - не помню как сам запускал. Тоже тыкался тыкался. НО в конце концов получилось.
Но можешь использовать выложенный файл. На 16 мгц работает без проблем. 115200 загрузка. По большому счету ему пофигу камень. Что ДИП, что TQFP. Его задача принять байт и адрес его во флешке и туда засунуть. Только и всего. Ах да, EEPROM не программирует :(
Вгрузил... чуда не произошло....
Либо сделал что не так, либо дело не в этом...
в BOARDS.txt
myduino.name=Moja plata na atmega328
myduino.upload.protocol=arduino
myduino.upload.maximum_size=32256
myduino.upload.speed=115200
myduino.bootloader.low_fuses=0xff
myduino.bootloader.high_fuses=0xde
myduino.bootloader.extended_fuses=0x05
myduino.bootloader.path=atmega
myduino.bootloader.file=bootloader.hex
myduino.bootloader.unlock_bits=0x3F
myduino.bootloader.lock_bits=0x0F
myduino.build.mcu=atmega328p
myduino.build.f_cpu=16000000L
myduino.build.core=arduino
myduino.build.variant=standard
файл bootloader.hex положи в ARDUINO\hardware\arduino\bootloaders\atmega\
Перезапусти среду ардуино и выбери новую плату.
Сервис / записать загрузчик.
ВСЕ.
как то бы вообще бы снести этот загрузчик..........
ооо чета выдавать начал...
в boards.txt
Сопоставь размеры области загрузчика и фьюзы.
myduino.upload.maximum_size=32256
myduino.bootloader.low_fuses=0xff
myduino.bootloader.high_fuses=0xde
myduino.bootloader.extended_fuses=0x05
pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF
За объем памяти отведенной под переменные, я так понимаю.
это не я писал, это уже было, я просто файл хекс подменил.
В общем покурил я на выходных про фьюзы......
выставил фьюзы как у тебя, с твоим хексом......... не фига......
вот так вот....
Странно. По сути то же, что и у меня, а у меня работает.
ммм.. а загрузчик с такими параметрами зашивали?
Уверен, вы знаете (и помните), что фьюзы при обычной заливке скетча в плату не меняются. Через среду ардуино они заливаются только в момент заливки загрузчика.
Кстати, фьюзы можно поправить через "дудку" или ее графическую оболочку (например avrdude-GUI).
avrdude -pm328p -cusbasp -Pusb -Ulock:w:0x3F:m -Uefuse:w:0x05:m -Uhfuse:w:0xde:m -Ulfuse:w:0xff:m
avrdude -pm328p -cusbasp -Pusb -Uflash:w:bootloader.hex:i
avrdude -pm328p -cusbasp -Pusb -Ulock:w:0x0C:m
Вот так у меня моя программа подготавливает плату.
То есть все фьюзы также. Файл тот же. Проблем нет.
Попробуйте дудкой зашить. только вместо -cusbasp пишите -carduinoisp
ммм.. а загрузчик с такими параметрами зашивали?
Уверен, вы знаете (и помните), что фьюзы при обычной заливке скетча в плату не меняются. Через среду ардуино они заливаются только в момент заливки загрузчика.
Кстати, фьюзы можно поправить через "дудку" или ее графическую оболочку (например avrdude-GUI).
Да, все манипуляции через создать загрузчика.
ЧТо то он нецензурна выражается на ардуино ай си пи, говорит нет такого программатора...... куда чего дописать?