Boa noite. Pesquisei na internet e no LdG e não achei nada sobre reset interno para Arduino, apenas achei reset físico utilizando transistor. Os PICs possuem uma função reset_cpu() que reseta o PIC via comando, é muito estranho o Arduino não ter um também. Se alguém souber que existe um para nosso querido arduino postem aqui. Atenciosamente. 

Camilo Jr.

Blog: http://roboticlabview.blogspot.com.br/

Exibições: 22741

Responder esta

Respostas a este tópico

Pessoal, aproveitando o comentário sobre o pino 13, tenho uma dúvida, no meu Arduino, além de piscar durante o Reset, o LED do pino 13 fica acesso durante a execução de qualquer programa. Se eu setá-lo como OUTPUT, e colocá-lo em nivel LOW ele apaga, então não me atrapalha em nada, só queria saber se é normal?

 

Obrigado

Tenho um projeto que é essencial a estabilidade. Então pensei em acrescentar o watchdog.

Eu tenho que baixar alguma biblioteca para usar no uno ou 2009?

Onde encontro?

Ai é só acrescentar as linhas que já citaram não é?

Você pode utiliza a linha de comando abaixo:

asm volatile ("  jmp 0");

Já foi testado por nós e utilizamos essa linha quando precisamos resetar o programa .

Fonte: http://arduino.cc/forum/index.php/topic,49581.0.html

testei e parece que esta função está resolvendo meu problema principalmente com o cartão SD que constantemente parava de funcionar.

(ja tentei um monte de recurso, como desligar e ligar os pinos 4 e 10 de acordo com o uso do ethernet ou SD, melhorou mas não consegui passar de 3 dias rodando)

Minha pergunta é se este método pode causar algum tipo de Fadiga eletrônica ao ser repetido constantemente, no caso a cada 3h.

Boa noite, você tem a biblioteca para trabalhar com Watch Dog?

Testei a sugestão do Lab de Garagem e Calle_o

e funcionou no teste de reset apenas do Arduino, sem incluir periféricos.

Arquivo anexado:

Anexos

Boa tarde, comigo também funcionou bem, testei outro método que é semelhante.


#include <avr/wdt.h>

void setup ()
{
  Serial.begin (115200);
  
  unsigned long tempo = micros();
  Serial.println("----------------------");
  Serial.print("Reiniciou em: ");
  Serial.print(tempo);
  Serial.println(" Micro segundos.");
  Serial.println("----------------------");
  
  Serial.println();
  
  wdt_enable (WDTO_1S);  //reseta após 1 segundo, if no "pat the dog" received
 }  // end of setup

void loop ()
{
  Serial.println(".........................");
  Serial.println ("Inicio do loop ...");
  Serial.println(".........................");
  Serial.println();
  
  wdt_reset ();  // me de mais um segundo para algo (pat the dog)
  while (true) ; // oops, de volta ao loop
}  // fim do loop

Muito bom esse post, estou em um projeto que tenho que trabalhar com memória eepron e lcd, agora estou implementando o watch dog para evitar transbordamento de memória.

Obrigado por partilhar

É possível executar o reset através do próprio pino Reset do Arduino, ligar um resistor de 100 ohm entre o pino de saída 12 ao pino RESET do Arduino e executar o código listado abaixo:

Cabe ressaltar que o código é para uso didático apenas.

// Posted by gabriellalevine: http://www.instructables.com/id/two-ways-to-reset-arduino-in-software/
// Modified by Milton Vilela

int xy=0;
int resetPin = 12;

void setup() {
digitalWrite(resetPin, HIGH);
delay(200);
pinMode(resetPin, OUTPUT);
Serial.begin(9600);//initializa porta serial
Serial.println("Programa reiniciado");//
delay(200);
}

void loop() {
  xy++;
  Serial.print("xy = ");
  Serial.println(xy);
  delay(300);
  if(xy >= 30)
  {
    digitalWrite(resetPin, LOW);
    Serial.println("linha nunca executada");
  }
}

Complementando:

Após fazer a primeira gravação, devido ao tempo necessário para gravação de novos programas ou do mesmo programa no arduino, o resistor entre o pino 12 e o pino RESET do Arduino deve ser retirado para evitar que durante a gragação de programas a ativação do reset cause erro de gravação!

Exemplo legal, é uma outra alternativa mas creio que o reset via software seja melhor, você continua com seu pino 12 livre e não terá problemas com a vida útil do resistor ou problemas de contato.

Olá Camilo,

Só é necessário retirar o resistor no código que apresentei acima.

Se o reset for chamado de outra forma, por uma opção de menu, botão, etc, então não há necessidade de retirar.

Parece que esse reset é idêntico ao reset manual! Se alguém mais entendido puder dar uma ajuda, será muito bom.

Até +

Milton Vilela

Esse reset está funcionando da seguinte forma, o atmega (CI do arduino) quando tem seu pino 1 colocado em nível baixo (0V) ele é resetado e só volta a ligar quando seu pino 1 volta a nível alto (aproximadamente 5V).

No seu Sketch você inicia ele em nível alto e quando você entra no if e seu comando " digitalWrite(resetPin, LOW);" é executado, o pino 12 é colocado em nível baixo (0V) e através de um resistor de baixo valor (100ohms) chega ao pino 1 e o sistema é reiniciado, o sistema carrega logo voltando ao nível alto e assim por diante.

A placa do arduino possui um resistor pull-up mantendo o pino 1 o tempo todo em nível alto, se você conecta um fio com 0V o nível cai e não ocorre um curto pq há um resistor entre o 5 e o 0V (resistor pull-up).

O reset do arduino (apertando o botão da placa) funciona exatamente assim: você aperta o botão e ele envia 0V ao pino 1.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço