Простой способ сделать RESET из программы + один провод.

Araris
Offline
Зарегистрирован: 09.11.2012

Может кому пригодится...

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/

 

axill
Offline
Зарегистрирован: 05.09.2011

а смысл?)

класический способ заресетить AVR - вызвать срабатывание watchdog

вполне вероятно нужно будет перепрошить бутлоадер на тот, который не конфликтует с собакой

но зато никакие пины тратить не нужно

Araris
Offline
Зарегистрирован: 09.11.2012

Пин потратить, наверное, все же проще.

axill
Offline
Зарегистрирован: 05.09.2011

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

ну и ради искусства мне видится правильнее использовать по максимуму те механихмы которые заложены в МК. Использовать пин - это городить свое поверх того, что сделал атмел

не в плане критики)) для изучения МК - почему бы и нет.

Araris
Offline
Зарегистрирован: 09.11.2012

Watchdog + перепрошивка бутлодера, конечно же, наилучший вариант.

Araris
Offline
Зарегистрирован: 09.11.2012

Дело в том, что у меня периодически хитрым образом зависает связка из Ардуино, УЗ датчика, радиомодуля и проч.

Возникла мысль раз в сутки ресетить это дело и понаблюдать, поможет ли.

Tmin10
Tmin10 аватар
Offline
Зарегистрирован: 18.04.2013

Если виснит сама ардуина, то как она сможет себя перезагрузить?

Araris
Offline
Зарегистрирован: 09.11.2012

Если виснет сама Ардуина, то она не сможет себя перезагрузить, и мы, смею надеяться, оба это понимаем.

Речь идет о случае, когда [возможный] источник траблов - подключенные к Ардуине устройства и ресет несет чисто профилактическую функцию.

axill
Offline
Зарегистрирован: 05.09.2011

Araris пишет:

Если виснет сама Ардуина, то она не сможет себя перезагрузить, и мы, смею надеяться, оба это понимаем.

Речь идет о случае, когда [возможный] источник траблов - подключенные к Ардуине устройства и ресет несет чисто профилактическую функцию.

если виснет переферия, то ресет ардуины врядли чем-то поможет (разве что чудным образом перехапуск портов скажется благотворно)

я потому и спрашивал про зависания, значит все-таки есть повод подумать о watchdog?

Samodelkin
Offline
Зарегистрирован: 07.06.2012

Еще можно ресетить вот так:

void(* resetFunc) (void) = 0
void setup()  {....}
void loop(){
resetFunc();}

Только resetFunc() в лупе вызывать по ифу (какое либо событие, либо по таймеру или с использованием RTC)

__Alexander
Offline
Зарегистрирован: 24.10.2012

Araris пишет:

1. Соединям проводом любой цифровой пин с пином Reset.

Это надо в FAQ, в раздел - "Как делать нельзя!".

Думаю, догадыватесь почему.

axill
Offline
Зарегистрирован: 05.09.2011

Сам бы я не стал соединять выходы МК с его же ресетом, но если честно не понимаю почему это может быть запрещено

Araris
Offline
Зарегистрирован: 09.11.2012

"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."

Наверное, стоит ставить резистор.

axill
Offline
Зарегистрирован: 05.09.2011

Для самого МК по барабану что у него на RESET подключен другой пин. Если не програмировать специальный режим (типа RSTDISBL или DWEN) reset работает только на вход и ни с чем не закоротит. Парень который написал английскую фразу не вникал в детали

Другое дело, что reset используется при програмировании и либо подключен к внешнему програматору через ISP либо подключен в случае ардуины к схеме согласования с USB. Вот тут как раз и может быть проблема. Например на UNO R3 reset подключен к atmega16u2 через конденсатор (http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf), значит никакого замыкания не произойдет. На какой-то другое плате может и "закоротить" - два выходы в противофазе могут привести к выходу чего-то из строя

__Alexander
Offline
Зарегистрирован: 24.10.2012

причем тут это. так делать нельзя, т.к. неопределена физика процесса. Вы ставите ноль в порт, который настроен на выход и при старте заводите туда единицу. Так вот, когда выводим ноль, при снижении до определенного уровня - МК начинает уходить в сброс. При этом этот же управляющий пин автоматически становиться ВХОДОМ без подтяжки, всё, нуля нет... и нет единицы... точнее она начинает появляться от внешнего резистора. Т.е. выход из сброса... при каких напругах там это всё происходит можно замерить, но не факт, что процедура сброса пройдет до конца... если у человека работает такой не правильный вариант, то лучше все равно так не делать, не факт что он сработает где-то далеко в тысячный раз... и вас не вспомнят тихим словом. )))  

axill
Offline
Зарегистрирован: 05.09.2011

__Alexander пишет:

причем тут это. так делать нельзя, т.к. неопределена физика процесса.

по мне все понятно - в даташите поцедура рестарта расписана, специально сейчас перечитывал. МК уходит в ресет если на ресет пин подать ноль "достаточной длительности, в противном случае перезапуск не гарантирован" - так написано в даташите.

Физика простая - МК сам себе выставляет ноль и сбросит пин выставивший ноль только если произогла процедура ресет, т.е. при такой логике МК гарантировано получает ресет импульс достаточной длительности.

нет здесь ничего неправильного. Я повторюсь - просто не вижу практического применения такому подходу

__Alexander
Offline
Зарегистрирован: 24.10.2012

так нет же. выставляя ноль на ресет, просто регистры портов обнуляются т.к. линия одна, но этодалеко не вся процедура ресета. 

axill
Offline
Зарегистрирован: 05.09.2011

Я не понимаю о чем вы пишите. Можете сослаться на раздел даташита в котором вы увидели проблему?

__Alexander
Offline
Зарегистрирован: 24.10.2012

какая проблема? у меня нема проблем. Вы же сами написали, что 

"если на ресет пин подать ноль "достаточной длительности, в противном случае перезапуск не гарантирован" - так написано в даташите."

ну так вот сами и скажите, время после установки нуля в порт и установка портов в начальное положение достаточное? 

я сколько мк мучаю, везде для таких целей применяют схему аля "формирователь импульса"... думаете зря?

axill
Offline
Зарегистрирован: 05.09.2011

__Alexander пишет:

я сколько мк мучаю, везде для таких целей применяют схему аля "формирователь импульса"... думаете зря?

я понял, нет смысла продолжать. Вы так думаете только потому, что где-то что то читали. Не нужны современным МК никакие специальные схемы с формирователем импульса, по крайней мере для обычного применения.

vlkam
Offline
Зарегистрирован: 17.02.2013

Спасибо, пригодится.

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

axill
Offline
Зарегистрирован: 05.09.2011

vlkam пишет:

Спасибо, пригодится.

для этих целей придуман watchdog, вот его и надо использовать

Araris
Offline
Зарегистрирован: 09.11.2012

vlkam пишет:

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

Переполнения таймера вряд ли стоит бояться (он сбросится в нуль [?]), а вот перезапускаются ли в этом случае зависшие железяки - для меня это остается под вопросом.

У меня на релейном модуле есть одно незадействованное реле, есть мысль пустить питание через его НЗ контакты и периодически программно срабатывать реле, вызывая перезагрузку всех-всех.

vlkam
Offline
Зарегистрирован: 17.02.2013

 

Araris пишет:
Переполнения таймера вряд ли стоит бояться

На таймер обычно много чего завязано в виде отсчета времени.
Т.е. либо нужно везде в коде делать контроль обнуления таймера, либо перегружать периодически
Если этого не сделать, то запросто пауза может неприлично затянуться :-)
 

Araris пишет:
У меня на релейном модуле есть одно незадействованное реле, есть мысль пустить питание через его НЗ контакты и периодически программно срабатывать реле, вызывая перезагрузку всех-всех.

Хороший способ на первый взгляд. жестковато, зато надежно

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

а зачем пин использовать, если можно в программе просто прыгнуть на 0 адрес, где вектор сброса?

axill
Offline
Зарегистрирован: 05.09.2011

Michal пишет:

а зачем пин использовать, если можно в программе просто прыгнуть на 0 адрес, где вектор сброса?

Судя по описанию из даташита это не одно и тоже

maksim
Offline
Зарегистрирован: 12.02.2012
asm volatile ("jmp 0x0000");

 

v7ilnytskyy
Offline
Зарегистрирован: 23.04.2020

к ардуино мега 2560 подключен модуль НС-05. установлен коннект с другим блютуз устройством. идет интенсивный прием данных. нужно разорвать коннект. программно не получается. из-за занятости приемом информации команда AT+DISC не отрабатывается. даже после ресета ардуино путем нажатия кнопки ресет НС-05 остается в состоянии коннекта. нужно только выключать питание ардуино. 

можно ли решить эту проблему программно?

sadman41
Offline
Зарегистрирован: 19.10.2016

Отключай питание у HC-05, зачем ардуину-то ресетить?

v7ilnytskyy
Offline
Зарегистрирован: 23.04.2020

отключение питания только у нс-05 ни к чему не приводит. модуль остается в состоянии коннекта. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Невероятный случай - работа электронной схемы без питания.

svm
Offline
Зарегистрирован: 06.11.2016

v7ilnytskyy пишет:

отключение питания только у нс-05 ни к чему не приводит. модуль остается в состоянии коннекта. 

УУУ! Шайтан!

Feofan
Offline
Зарегистрирован: 28.05.2017

v7ilnytskyy пишет:

отключение питания только у нс-05 ни к чему не приводит. модуль остается в состоянии коннекта. 

Состояние коннекта - что означает? Светодиоды продолжают мигать или нет?

v7ilnytskyy
Offline
Зарегистрирован: 23.04.2020

 

исходное состояние - миндфлекс гарнитура с блютуз модулем и ардуино мега с блютуз модулем.

светодиоды на обоих модулях часто мигают.

модуль ардуины инициирует и устанавливает коннект с модулем гарнитуры и начинает принимать данные от гарнитуры. оба светодиода мигают так - две коротких вспышки и примерно пару секунд пауза.

отключаю модуль при ардуино. модуль при гарнитуре начинает часто мигать как в свободном не связанном ни с кем состоянии.

подключаю модуль к ардуино - характер мигания светодиода такой - длительный период свечения и длительная пауза. частого мигания как при свободном не связанном состоянии нет. скетч вроде как перегрузился но экран белый. работать все начинает только после переподачи питания на ардуино.

а если отключить гарнитуру то диод при ардуине начинает мигать часто. т.е коннект потерян и модуль свободен и перезагрузка программы проходит нормально.

void Reset1() {
  tft.fillScreen(BLACK);
  tft.setCursor(1,1);
  tft.println("Wait for reseting...");
  while(true) {
    if (Serial1.available()) {
      byte bbb = Serial1.read();
    } else {
      digitalWrite(53,HIGH); // на всякий случай еще раз перевод Serial1 в командный режим
      Serial1.println("AT+RESET");
      Serial1.println("AT+DISC");
      Serial1.flush();
      break;
    }
  }
  delay(5000);
  asm("JMP 0");
}
 
не срабатывает AT+DISC