Bom dia, antigamente eu fazia reset via software através do comando
asm volatile ("jmp 0");
Pelo que entendi o comando realiza um jump para o endereço 0, comentaram que esse comando nao limpa bem o arduino para resetar, mas nunca tive problema em usá-lo.
Pesquisando encontrei esse código abaixo com uma outra função que também reseta, void(* resetFunc) (void) = 0, gostaria de saber o por que de não pode declarar a função no fim do código como sempre faço, nesse caso ela tem que ser declarado no início.
int led = 13;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
Serial.begin(9600);//initialize the serial port
}
void(* resetFunc) (void) = 0; //declare reset function @ address 0
// the loop routine runs over and over again forever:
void loop() {
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("resetting");
resetFunc(); //call reset
delay(100);
Serial.println("never happens");
}
Pelo que sei isso é um bug do compilador que acontece com certas funções.
Nunca vi solução para isso.
Se quiser testar na nova IDE beta e nos dizer o resultado aqui.
Seria por pouco conhecimento meu sobre o assunto! Pesquisei o termo watchdog, pelo que entendi, é um sistema utilizado nas máquinas para resetar o software caso haja algum problema no sistema.
Quando pesquisei sobre reset no arduino encontrei essa referencia que acredito ser o reset utilizando watchdog
wtd_enable(WDTO_4S);
Há alguma diferença entre resetar pelo watchdog e pela função que postei no início do tópico?
felipejose8:
Há alguma diferença entre resetar pelo watchdog e pela função que postei no início do tópico
Ola,
Sim, o jmp 0 ou void(* resetFunc) (void) = 0; simplesmente instrue a cpu a pular para o endereço 0. Ou seja e um desvio incondicional, como o comando goto do basic (ou equivalente em outras linguagens). Normalmente se evita fazer esse tipo de desvio, já que, pode colocar a CPU em uma condição desconhecida (travar).
Já o watchdog e um reset por hardware, exceto pela logica do pino de entrada, e o mesmo que usar o pino de reset.
O watchdog e um temporizador que quando zerado, dispara o reset. Esse temporizador precisar ser periodicamente reiniciado para evitar que chegue a zero.
wtd_enable(WDTO_4S);
Configura o timer para 4 segundos, ou seja, dispara um reset se em 4 segundos se o contador não for atualizado.
Para atualizar o contador do watchdog se usa periodicamente o comando wdt_reset();.
referencia: Arduino Project Hub