Простой способ сделать RESET из программы + один провод.
- Войдите на сайт для отправки комментариев
Пт, 21/06/2013 - 15:19
Может кому пригодится...
1. Соединяем проводом любой цифровой пин с пином Reset.
2. Запускаем скетч и убеждаемся, что оно работает. Проверял на своих Arduino Nano, работает.
int led = 13; //pin 13 as OUTPUT LED pin int resetPin = 6; // the setup routine runs once when you press reset: void setup() { digitalWrite(resetPin, HIGH); delay(200); // initialize the digital pin as an output. pinMode(led, OUTPUT); pinMode(resetPin, OUTPUT); Serial.begin(9600);//initialize Serial Port Serial.println(""); Serial.println(""); Serial.println("Start after reset");//print reset to know the program has been reset and the setup function happened delay(200); } // the loop routine runs over and over again forever: void loop() { delay(10); digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) Serial.println("on"); delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW Serial.println("off"); delay(1000); // wait for a second Serial.println("on"); delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW Serial.println("off"); delay(1000); // wait for a second Serial.println("Now resetting"); delay(10); digitalWrite(resetPin, LOW); }
Источник : http://www.instructables.com/id/two-ways-to-reset-arduino-in-software/
а смысл?)
класический способ заресетить AVR - вызвать срабатывание watchdog
вполне вероятно нужно будет перепрошить бутлоадер на тот, который не конфликтует с собакой
но зато никакие пины тратить не нужно
Пин потратить, наверное, все же проще.
дело вкуса, сама необходимость ресетить под вопросом - не знаю задач при которых это нужно. Точнее не знаю задач при которых ардуину нужно ресетить из состояния когда она не зависла. В вашем варианте она может себя заресетить только если не зависла
ну и ради искусства мне видится правильнее использовать по максимуму те механихмы которые заложены в МК. Использовать пин - это городить свое поверх того, что сделал атмел
не в плане критики)) для изучения МК - почему бы и нет.
Watchdog + перепрошивка бутлодера, конечно же, наилучший вариант.
Дело в том, что у меня периодически хитрым образом зависает связка из Ардуино, УЗ датчика, радиомодуля и проч.
Возникла мысль раз в сутки ресетить это дело и понаблюдать, поможет ли.
Если виснит сама ардуина, то как она сможет себя перезагрузить?
Если виснет сама Ардуина, то она не сможет себя перезагрузить, и мы, смею надеяться, оба это понимаем.
Речь идет о случае, когда [возможный] источник траблов - подключенные к Ардуине устройства и ресет несет чисто профилактическую функцию.
Если виснет сама Ардуина, то она не сможет себя перезагрузить, и мы, смею надеяться, оба это понимаем.
Речь идет о случае, когда [возможный] источник траблов - подключенные к Ардуине устройства и ресет несет чисто профилактическую функцию.
если виснет переферия, то ресет ардуины врядли чем-то поможет (разве что чудным образом перехапуск портов скажется благотворно)
я потому и спрашивал про зависания, значит все-таки есть повод подумать о watchdog?
Еще можно ресетить вот так:
Только resetFunc() в лупе вызывать по ифу (какое либо событие, либо по таймеру или с использованием RTC)
1. Соединям проводом любой цифровой пин с пином Reset.
Это надо в FAQ, в раздел - "Как делать нельзя!".
Думаю, догадыватесь почему.
Сам бы я не стал соединять выходы МК с его же ресетом, но если честно не понимаю почему это может быть запрещено
"I've used this technique before just to see if it worked and it seemed useful. One comment though is that i would recommend using a resistor in there. Sending a high signal straight to the Reset pin could cause a short circuit and fry your chip. Not sure what would work better though, a pull up resistor from the reset pin to high, and allowing the "resetPin" to pull it low, or just placing a resistor between the two points."
Наверное, стоит ставить резистор.
Для самого МК по барабану что у него на RESET подключен другой пин. Если не програмировать специальный режим (типа RSTDISBL или DWEN) reset работает только на вход и ни с чем не закоротит. Парень который написал английскую фразу не вникал в детали
Другое дело, что reset используется при програмировании и либо подключен к внешнему програматору через ISP либо подключен в случае ардуины к схеме согласования с USB. Вот тут как раз и может быть проблема. Например на UNO R3 reset подключен к atmega16u2 через конденсатор (http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf), значит никакого замыкания не произойдет. На какой-то другое плате может и "закоротить" - два выходы в противофазе могут привести к выходу чего-то из строя
причем тут это. так делать нельзя, т.к. неопределена физика процесса. Вы ставите ноль в порт, который настроен на выход и при старте заводите туда единицу. Так вот, когда выводим ноль, при снижении до определенного уровня - МК начинает уходить в сброс. При этом этот же управляющий пин автоматически становиться ВХОДОМ без подтяжки, всё, нуля нет... и нет единицы... точнее она начинает появляться от внешнего резистора. Т.е. выход из сброса... при каких напругах там это всё происходит можно замерить, но не факт, что процедура сброса пройдет до конца... если у человека работает такой не правильный вариант, то лучше все равно так не делать, не факт что он сработает где-то далеко в тысячный раз... и вас не вспомнят тихим словом. )))
причем тут это. так делать нельзя, т.к. неопределена физика процесса.
по мне все понятно - в даташите поцедура рестарта расписана, специально сейчас перечитывал. МК уходит в ресет если на ресет пин подать ноль "достаточной длительности, в противном случае перезапуск не гарантирован" - так написано в даташите.
Физика простая - МК сам себе выставляет ноль и сбросит пин выставивший ноль только если произогла процедура ресет, т.е. при такой логике МК гарантировано получает ресет импульс достаточной длительности.
нет здесь ничего неправильного. Я повторюсь - просто не вижу практического применения такому подходу
так нет же. выставляя ноль на ресет, просто регистры портов обнуляются т.к. линия одна, но этодалеко не вся процедура ресета.
Я не понимаю о чем вы пишите. Можете сослаться на раздел даташита в котором вы увидели проблему?
какая проблема? у меня нема проблем. Вы же сами написали, что
"если на ресет пин подать ноль "достаточной длительности, в противном случае перезапуск не гарантирован" - так написано в даташите."
ну так вот сами и скажите, время после установки нуля в порт и установка портов в начальное положение достаточное?
я сколько мк мучаю, везде для таких целей применяют схему аля "формирователь импульса"... думаете зря?
я сколько мк мучаю, везде для таких целей применяют схему аля "формирователь импульса"... думаете зря?
я понял, нет смысла продолжать. Вы так думаете только потому, что где-то что то читали. Не нужны современным МК никакие специальные схемы с формирователем импульса, по крайней мере для обычного применения.
Спасибо, пригодится.
Я так понимаю это требуется тогда, когда ардуинка без присмотра годами работает.
В этом случае, чтобы например избежать переполнения таймера или перезапустить зависшие железяки желательна программная перезагрузка
Спасибо, пригодится.
для этих целей придуман watchdog, вот его и надо использовать
В этом случае, чтобы например избежать переполнения таймера или перезапустить зависшие железяки желательна программная перезагрузка
Переполнения таймера вряд ли стоит бояться (он сбросится в нуль [?]), а вот перезапускаются ли в этом случае зависшие железяки - для меня это остается под вопросом.
У меня на релейном модуле есть одно незадействованное реле, есть мысль пустить питание через его НЗ контакты и периодически программно срабатывать реле, вызывая перезагрузку всех-всех.
На таймер обычно много чего завязано в виде отсчета времени.
Т.е. либо нужно везде в коде делать контроль обнуления таймера, либо перегружать периодически
Если этого не сделать, то запросто пауза может неприлично затянуться :-)
Хороший способ на первый взгляд. жестковато, зато надежно
а зачем пин использовать, если можно в программе просто прыгнуть на 0 адрес, где вектор сброса?
а зачем пин использовать, если можно в программе просто прыгнуть на 0 адрес, где вектор сброса?
Судя по описанию из даташита это не одно и тоже
к ардуино мега 2560 подключен модуль НС-05. установлен коннект с другим блютуз устройством. идет интенсивный прием данных. нужно разорвать коннект. программно не получается. из-за занятости приемом информации команда AT+DISC не отрабатывается. даже после ресета ардуино путем нажатия кнопки ресет НС-05 остается в состоянии коннекта. нужно только выключать питание ардуино.
можно ли решить эту проблему программно?
Отключай питание у HC-05, зачем ардуину-то ресетить?
отключение питания только у нс-05 ни к чему не приводит. модуль остается в состоянии коннекта.
Невероятный случай - работа электронной схемы без питания.
отключение питания только у нс-05 ни к чему не приводит. модуль остается в состоянии коннекта.
УУУ! Шайтан!
отключение питания только у нс-05 ни к чему не приводит. модуль остается в состоянии коннекта.
исходное состояние - миндфлекс гарнитура с блютуз модулем и ардуино мега с блютуз модулем.
светодиоды на обоих модулях часто мигают.
модуль ардуины инициирует и устанавливает коннект с модулем гарнитуры и начинает принимать данные от гарнитуры. оба светодиода мигают так - две коротких вспышки и примерно пару секунд пауза.
отключаю модуль при ардуино. модуль при гарнитуре начинает часто мигать как в свободном не связанном ни с кем состоянии.
подключаю модуль к ардуино - характер мигания светодиода такой - длительный период свечения и длительная пауза. частого мигания как при свободном не связанном состоянии нет. скетч вроде как перегрузился но экран белый. работать все начинает только после переподачи питания на ардуино.
а если отключить гарнитуру то диод при ардуине начинает мигать часто. т.е коннект потерян и модуль свободен и перезагрузка программы проходит нормально.