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: 22739

Responder esta

Respostas a este tópico

Valeu pela explicação Alian, sua contribuição foi importante.

Por nada amigo, se precisar de alguma coisa pode contar comigo, ficarei muito feliz em ajudar.

tem a biblioteca ?

Boa noite.

Você se refere a biblioteca do WatchDog?

Se for basta apenas dar um include, não é necessário adicionar biblioteca.

Ex: 

void setup() {

pinMode(12, OUTPUT); //use um LEd no pino 12
wdt_enable(WDTO_4S); //Função que ativa e altera o Watchdog com tempo de 4 segundos

}


void loop()
{
digitalWrite(12, HIGH);
delay(1000);
digitalWrite(12, LOW);
delay(1000);
wdt_reset(); //diz que esta tudo ok, caso não seja chamado em 4 segundos o watchdog reseta o sistema
}

eu pirando tentando encontrar a biblioteca. valeu

Na época também fiquei assim, procurava e não achava nada.

Todo "INCLUDE" que conter "AVR" não precisa de biblioteca, ja é nativo do compilador.

como nosso cado da biblioteca para watchdog: "include <avr/wdt.h>"

Mais uma questão amigo. Você já viu a biblioteca TimerOne ? estava fazendo o DogTimer por ele parcialmente deu certo vou testar novamente amanha com modificações qualquer coisa eu envio o codigo. A questão é nesse WDT não tem uma condição tipo caso não seja resetado faça isso ...um exemplo

 #include <TimerOne.h>

void setup() {

Timer1.initialize(5000000);   // contador até 5 segundos
Timer1.Start(); // inicia contador
Timer1.attachInterrupt(PARAR); // se o contador estourar ele para o robô

{
void loop() {

FRENTE(){
blablabla...
Timer1.Restat(); // da um restart no contador se frente for pressionado !
}
}

// não sei se está correto !

vou postar meu projeto assim que apresentar meu TCC ! =D

Já trabalhei com timer também, o WDT (watch dog timer) é apenas uma segurança.

Ele funciona assim: Se seu programa entrar em um loop infinito ou travar por algum motivo o wdt reseta o sistema.

Já o timer não faz isso, a função dele é outra, é um contador bem preciso.

Aqui mesmo no fórum temos mais detalhes sobre os timers: http://labdegaragem.com/profiles/blogs/tutorial-executando-fun-es-e...

Olá pessoal, como em arduino o negocio é pratico,  criei um sketch comentado linha a linha que explica a tecnica do watchdog, agradecimentos inclusos no codigo he he he

/*
PROGRAMA DE EXPLICAÇÃO DA FUNÇÃO WATCHDOG
FINALIDADE:  Fazer com que o arduino reset caso o arduino trave em algum local entrando em algum loop infinito.
FUNCIONAMENTO:  Esse programa simula um travamento,  primeiramente ele acende um led que esta no void setup e é ativado apenas uma vez na inicialização do arduino, dai ele cria um loop normal
sendo que a cada volta ele acrescenta um valor a uma variavel que é apresentada na serial,  apos um numero de voltas programados (no nosso caso 20) ele entra em um laço que simula um travamento
não passando pelo reset do watchdog, mas executando uma segunda função para a serial,  como resultado apos 4 segundos o arduino é reiniciado.

AGRADECIMENTOS: A toda turma que faz parte do lab de garagem em especial Alian Vargas e ao Fabio henrique que expuseram essa tecnica maravilhosa de forma tão competente

*/




#include <avr/wdt.h>  // inclui a função watchdog, biblioteca já consta dentro do sistema do arduino

int led = 3;  // indica um pino para led que servirá de referencia visual
int soma = 0;  // cria variavel para demonstracão de tempo de funcionamento ok
int temporeset = 0;  // cria variavel para informar em quanto tempo o watchdog funcionara

void setup() {   
  Serial.begin(9600);    // inicia a serial
  pinMode(led, OUTPUT);    // indica o pino como saida
   digitalWrite(led, HIGH);   // liga o led dentro do setup
  delay(1000);               // aguarda um segundo aceso
  digitalWrite(led, LOW);    // desliga o led
 
  wdt_enable(WDTO_4S);  // habilita o watchdog
}

void loop() {
  soma++;  // soma mais um a variavel soma
  Serial.println(soma);   // imprime na serial o valor de soma
  delay(500);  //  aguarda meio segundo
 
  wdt_reset();  //  reseta o watchdog,  ou seja se o programa travar e o pointer não ativar esse reset em 4 segundos o watchdog sera ativado
 
 while(soma >= 20){  //  cria uma condição de loop para que o pointer não passe pela funcao reset
   temporeset++;    // soma mais um a variavel tempo de reset
   Serial.print("tempo reset: ");   // imprime texto indicativo
   Serial.println(temporeset);     //  imprime o valor da variavel tempo de reset
   delay(1000);   //    aguarda um segundo
 }
 }

Adicione esta linha de código:  

#include <avr/wdt.h>

wdt_enable(WDTO_30MS); while(1) {}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço