Перезагрузка arduino на программном уровне

Перезагрузка Ардуино программно командой

Для того, чтобы перезагрузить Arduino не нажимая кнопку Reset, существует три варианта — все способы мы рассмотрим в этом обзоре. Перезагрузку Arduino требуется выполнять при зависании микроконтроллера или при работе с nRF24L01+ радио модулем, например, когда трансивер теряет связь и перестает работать. Перезагрузить радиопередатчики сложно, а вот перезагрузить Ардуино не составит проблем.

Для этого занятия потребуется:

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • резистор на 1 кОм;
  • макетная плата;
  • провода «папа-папа».

Программная перезагрузка Ардуино (soft reset)

Программная перезагрузка — это на самом деле не настоящий сброс программы, а просто переход в начало кода (в нулевой адрес). То есть код начинает исполнятся с самого начала, не влияя на установки Ардуино на момент soft reset. Например, если на момент перезагрузки микроконтроллера был установлен сигнал «HIGH» на каком-то выходе, то значение не вернется по умолчанию в «LOW», а так и останется «HIGH».

Перезагрузка Ардуино из программы (softReset)

Пояснения к коду:

  1. функция asm volatile(«jmp 0x00»); перезапускает программу с начала, но не сбрасывает порты, команду можно использовать в любом месте кода;
  2. в нашем примере перезагрузка из программы происходит каждые 10 секунд.

Чтобы использовать сторожевой таймер (watchdog), необходимо включить файл avr/wdt.h, а затем вызвать функцию wdt_enable(). Сторожевой таймер — это встроенный таймер (до 8 секунд), который можно запустить или сбрасывать в начальное состояние программным способом. Как только таймер «дотикает» до нуля, контроллер подает сигнал сброса и устройство уходит в hard перезагрузку.

Перезагрузка Ардуино при зависании (Watchdog)

Пояснения к коду:

  1. чтобы не происходило перезагрузки микроконтроллера, следует снять комментарий с команды wdt_reset();, тогда счетчик будет запускаться заново — в противном случае каждые 4 секунды будет происходить перезагрузка Ардуино.

Аппаратная перезагрузка Ардуино (hard reset)

Аппаратная перезагрузка возвращает все настройки платы по-умолчанию, т.е. все переменные возвращаются к исходному значению, а все задействованные порты отключаются и устанавливаются заново. Т.е. hard reset — это самая настоящая перезагрузка, которая происходит при нажатии на кнопку RESET. Но эту перезагрузку также можно вызвать из кода, подав низкий сигнал на порт Reset Ардуино.

Как перезагрузить Arduino на программном уровне

Пояснения к коду:

  1. важно установить высокий уровень сигнала на 12 пине в самом начале программы, иначе будет происходить сброс;
  2. в примере перезагрузка Ардуино из кода происходит каждые 10 секунд.

Заключение. Мы рассмотрели, как перезагрузить Ардуино на программном уровне на примере трех вариантов. Не забывайте, что используя аппаратную перезагрузку необходимо быть внимательным и устанавливать нужные значения до перезагрузки микроконтроллера. Ну а если нужен самый настоящий reset микроконтроллера, то используйте аппаратную перезагрузку Ардуино (hard reset).

Источник

Arduino.ru

Программный Reset

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Возможен ли программный ресет. По задумки 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 или

«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 смотрели? Помните там мужичек сидель годами в бункере и каждые несколько часов нажимал кнопку что-бы мир не возрвался? Сбрасывал таймер. Вот у нас тоже самое. «бомба» — это сторожевой таймер, мужичек — наш скетч. Разница только в том, что кнопку «начать отсчет заново» мы можем нажать когда хотим, а он мог только в последний момент :)

Конкретно как его конфигурировать (какие порты, какие биты за что отвечают) — читать даташит.

Вообщем скетч должен выглядеть примерно так:

ОСТОРОЖНО! ОН МОЖЕТ ПОЛОМАТЬ ЗАЛИВКУ НОВЫХ СКЕТЧЕЙ. Заблокировать вашу дуину. Дочитайте до конца.

К сожалению, арудино бутлоадеры имеют «большие проблемы» с этой собакой. При ресете она не деактивируется. Поэтому ее нужно побыстрому запретить в самом начале setup(). И рекомендуют ставить «отсчет» не меньше двух секунд, что-бы бутлоадер успел отработать до «очередной сработки» и скетч начал выполнятся. Иначе мы получаем бесконечный ребут и незвозможность заливать скетчи.

С этим имели проблему старые бутлоадеры, потом это «починили», а в свежих версиях arduino mega, как говорят в комментах (и мой опыт) — опять «поломали». Он начинает тикать «очень быстро» и даже не успевает дойти до setup()

Лечится через вырубание питания и зажатия ресета, подруб питания и отпускание ресета в момент заливки.

Но, естественно толку «в таком виде» — от него нет. Использовать — нельзя (по крайней мере на моей mega1280). Вроде есть фиксы бутлоадера для этого, но пока он мне не настолько нужен что-бы лезть в перешивку бутлоадера.

Так что «используйте преведенный скетч» на свой страх и риск. Лично у меня получается выводить плату из бесконечного ребута «легко», но гарантировать что так будет и на вашей плате — я не могу. Впрочем может у вас вообще не будет этого лока.

Источник

How can I «reset» an Arduino board?

I’ve uploaded a sketch to an Arduino Uno whose loop is something like this:

So, now, I can’t upload anything anymore, because the IDE says «port already in use».

Is there a way to «reset» the Arduino without another programmer?

Nothing else is using the serial port, and everything went just fine until I uploaded the previous sketch.

I’ve found some interesting things:

21 Answers 21

Try the following:

  1. Prepare the basic empty program (empty setup, loop, etc.)
  2. Compile it.
  3. Reset the Arduino using the hardware button on the chip
  4. Press Ctrl + U to upload your code.
  5. If unsuccessful — got to 3.

There is a delay before the boot loader starts the programs, just work on your timing. It worked for me when a bug in my Arduino’s code was executing a soft reset every 500 ms.

I had the same problem on two Arduinos (one Uno, and one Modern Device Freeduino/USB Host board) and the window between reset and the beginning of serial port usage was so small that it was impossible to upload.

I finally fixed the problem by purchasing another Arduino Uno and building an ISP cable per these instructions, and using it to flash the Bare Bones app from the examples into each inaccessible board, using Arduino IDE version 0023, following these instructions to change preferences.txt. (Be sure to save the original file before editing it so you can replace it after you’ve rescued your Arduino.)

It took one quick upload to fix each board. Such a fast fix after so much grief. You might not want to purchase another Arduino, but consider these benefits:

  • You can overwrite the bootloader on your Arduino to gain more space.
  • Once the bootloader is overwritten, the board will boot faster.
  • Supposedly you can program raw AVRs for special projects, but I have not tried this: Google for ArduinoISP
  • It will quickly fix Arduinos that you block in the future.
  • You can now safely experiment to find ways to prevent serial port usage from locking up the device in the future.

Источник

Adblock
detector