é possível dar Auto Reset em Arduino?

576 views
Skip to first unread message

Alexandre Vecchio

unread,
Aug 25, 2013, 10:15:31 PM8/25/13
to hacker...@googlegroups.com
Olá pessoal,

É possível dar um auto reset em um arduino caso ele trave? Por algumas vezes durante um certo processo o arduino que eu estou usando para receber dados por um nRF24L01 "trava". Para de receber os dados e congela. Não consegui descobrir o porquê. Curiosamente trava quando faço alterações no outro arduino que está transmitindo os dados e mudo o valor de uma das variáveis do pacote transmitido. 

O que eu gostaria é que o arduino receptor desse um auto reboot em caso de qualquer problema. Ou em caso de não recebimento de pacotes por algum tempo. 

Obrigado.

Fabio Luiz

unread,
Aug 25, 2013, 10:38:35 PM8/25/13
to hacker...@googlegroups.com


--
.--. .- .-. .- .--. --- ... - .- .-. . ... -.-. .-. . ...- .- .--. .- .-. .- .... .- -.-. -.- . .-. ... .--. .- -.-. . ... .--. .- - --. --- --- --. .-.. . --. .-. --- ..- .--. ... -.. --- - -.-. --- --
Regras da Lista: http://garoa.net.br/wiki/Lista:LeiaAntesDeClicarNoSend
Para mais informações sobre o Garoa Hacker Clube acesse http://garoa.net.br
Maiores opções sobre o Google Groups, visite: http://groups.google.com/group/hackerspacesp
.--. .- .-. .- -- .- .. ... .. -. ..-. --- .-. -- .- . ... .- -.-. . ... ... . --- .-- .. -.- ..
Epoch 0 <=> Fundação: 1298244863 s ~ 2.408064*10^52 tP (tempos de Planck)
 

Rodrigo Magalhães

unread,
Aug 25, 2013, 11:32:27 PM8/25/13
to hacker...@googlegroups.com

Ale, um watchdog timer seria útil para o caso de travamento fora do seu controle, mas parece que seu código está com algum problema. Vc poderia usar alguns Serial.print(), piscar leds ou alguma outra técnica pra tentar ver o fluxo de execução do seu código e corrigir o eventual problema.

--

Alexandre Vecchio

unread,
Aug 25, 2013, 11:34:29 PM8/25/13
to hacker...@googlegroups.com
Opa... Então isso é o Watchdog...

Pelo que li no primeiro post, o cara colocou outro MC para fazer o watchdog. O problema é que aí é um WD que age independente de problemas. Posso estar no meio de um processo e ele derruba o MC principal. Fiquei pensando em monitorar alguma porta para ver se o estado dela muda quando o MC trava. Então poderia colocar o attiny agindo em função do estado desta porta... 

Existe alguma solução com capacitores ou coisa do gênero? Pensando que se uma porta trava no estado que ela está eo poderia monitorar uma porta com pwm. Se ela parar de alternar há algo errado. A teoria me parece boa, mas não faço a menor ideia de como implementar uma coisa assim. hehehe. Será que rola?

Abraços.



From: mal...@gmail.com
Date: Sun, 25 Aug 2013 23:38:35 -0300
Subject: Re: [GaroaHC] é possível dar Auto Reset em Arduino?
To: hacker...@googlegroups.com

Alexandre Vecchio

unread,
Aug 25, 2013, 11:41:15 PM8/25/13
to hacker...@googlegroups.com
Oi Rodrigo, 
Eu estava monitorando o recebimento de pacotes pela serial. Aí congelava o recebimento. A matriz de leds que eu uso, que se comunica por SPI, também travava. Como era madrugada, nem tive a ideia de colocar um simples led piscando no sistema para ver se ainda continuava vivo. Aí meu modelo mental já começa a inventar soluções mirabolantes. hehehe

Vou colocar um led piscando para controlar o funcionamento do MC. Obrigado pela ideia.

O mais curioso do meu código é que tudo rola tranquilo. O receptor recebe os pacotes (números em contagem regressiva) e exibe as informações na matriz de leds. Aí quando alterava os números de 0 para 130 no transmissor travava o receptor. Totalmente sem nexo. E o pior é que o receptor já havia exibido um pacote de dados "exatamente" igual em outro momento. Vai entender.

Obrigado pelas ideias.


Date: Mon, 26 Aug 2013 00:32:27 -0300

Subject: Re: [GaroaHC] é possível dar Auto Reset em Arduino?

Fabio Luiz

unread,
Aug 25, 2013, 11:41:54 PM8/25/13
to hacker...@googlegroups.com
Na verdade um watchdog timer age da seguinte forma:
Ele espera um tempo pré-determinado e, se nada acontece, reseta tudo.
A função do seu programa é resetar o contador do wdt a cada ciclo (que, obviamente, deve ser menor que o tempo estipulado), se você não resetar o timer significa que algo deu errado, daí reseta o chip.

Alexandre Vecchio

unread,
Aug 25, 2013, 11:49:59 PM8/25/13
to hacker...@googlegroups.com
Ok Fabio. Aí já me parece muito melhor. 

Ficou uma dúvida... o arduino que estou usando tem este recurso do Watchdog (atmega328p). Porém, pelo que entendi, é melhor usar um watchdog externo (como no exemplo) que tenha apenas esta função para "garantir" que o arduino principal seja resetado? Ou o watchdog tem seu funcionamento independente do estado do microcontrolador?


From: mal...@gmail.com
Date: Mon, 26 Aug 2013 00:41:54 -0300

Rodrigo Magalhães

unread,
Aug 26, 2013, 12:00:33 AM8/26/13
to hacker...@googlegroups.com
Ale, o microcontrolador já tem um mecanismo de watchdog embutido. Porém, parece que a documentação do arduino não faz menção a como acessar esse mecanismo. Neste blog (http://tushev.org/articles/arduino/item/46-arduino-and-watchdog-timer) parece que o cara conseguiu usar o mecanismo. 

Basicamente, ele usou um #include <avr/wdt.h>, chamou a função wdt_enable() no setup e, no loop, invocou periodicamente a função wdt_reset() -- lembrando que ela tem que ser invocada em intervalos menores que o configurado com a função wdt_enable().

Mas ainda assim acho interessante você espalhar uns Serial.println() pelo seu código para entender o fluxo de execução dele, parece que há algum problema na lógica. Se for o caso mesmo, um reset por meio do watchdog timer não será a solução mais eficiente.


2013/8/26 Fabio Luiz <mal...@gmail.com>

Fabio Luiz

unread,
Aug 26, 2013, 12:06:01 AM8/26/13
to hacker...@googlegroups.com
o WDT é um recurso de hardware ativado pelos fuse bits na hora da programação. Em teoria ele não tem nada a ver com o seu programa. 
No link que mandei o cara citou:
#include <avr/wdt.h>

void setup() {  
  wdt_enable(WDTO_500MS); // have the wdt reset the chip
  // if 500ms passes without a reset
}

void loop() {   
  wdt_reset(); // reset the wdt
}
Basicamente é isso. DEVE-SE resetar o wdt a cada ciclo e também deve-se setar o tempo de watchdog um 
pouco maior que o ciclo (na pior situação possível). Ex. Se seu ciclo pode demorar até 1s, sete o wdt para 1.5s, 
se demorar mais que isso, é porque travou.

Rafael M. Lopes

unread,
Aug 26, 2013, 12:21:36 AM8/26/13
to hacker...@googlegroups.com
Alexandre, será que não é um problema de memória?
Não entendi muito bem o que você está tentando fazer, mas nada custa verificar se não tem algo inesperado acontecendo que utiliza mais memória do que deveria.
Experimente analisar o uso com o MemoryFree:


2013/8/26 Alexandre Vecchio <aleve...@hotmail.com>
Reply all
Reply to author
Forward
0 new messages