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

Responder esta

Respostas a este tópico

da uma olhada no datasheet do micro que você está usando.Uma pergunta: com o arduino tem como usar linguagem assembler dentro dele? Se der, deve ter algum registrador com esta função ou outro meio.

Então...

1) reset físico com transistor: um engenheiro da Atmel morre de infarte cada vez que alguém faz isso.

2) via código direto, não parece ter como. Mesmo uma instrução em assembler do tipo JUMP, como: asm volatile ("jmp 0x0000"); não cumpriria seu papel (não reinicia a memoria, apenas a execução).

Pelo jeito, o negocio é "hackear" o bootloader e mexer nas funções relacionadas ao watchdog.


Umas referencias pra iniciar a pesquisa:

http://www.ladyada.net/library/arduino/bootloader.html
http://arduino.cc/forum/index.php/topic,41921.0.html



"1) reset físico com transistor: um engenheiro da Atmel morre de infarte cada vez que alguém faz isso."

 

Rí muito aqui...

 

Mas porque ??? Não é possível "transviar" uma porta para aquele pino de Reset ao lado do de 3,3Volts???

O que ocorre se colocar um resistor e um BC (transistor) lá? E "mandar" o pino 13 dar um "empurrão"??? Não funciona?

A forma correta de resetar o AVR é usando o watchDog, ligando um pino do proprio arduino não garante que o tempo minimo em LOW do pino fará um reset pleno...

Para usar o Watchdog deve-se incluir o header no começo do sketch:

 

#include <avr/wdt.h>

Quando se trabalha com o watchdog, uma vez ativado, e não zerado, ele fará o reset 

mas voltará ativado, causando loop infinito... deve-se desativa-lo no começo do sketch(1° linha do setup)

wdt_disable();//desabilita o watchdog

No ponto do programa que quiser resetar o AVR inclua as linhas:

wdt_enable(WDTO_2S); ativa o watchdog para resetar em 2 segundos.

while(1); entra em loop até resetar...

referência:avrlibc

existem tempos menores e maiores para o watchdog estourar:

15 ms, 30 ms, 60 ms, 120 ms, 250 ms, 500 ms, 1 seg, seg, 4 seg, 8 seg

Cara eu estava com um grande problema em um projeto e seu texto resolveu tudo... Vlw muito!

Aproveitando o espaço gostaria de saber se esta função pode vir a danificar o microcontrolador?

Digamos que ele fique resetando por varias vezes ate que o problema seja sanado, isso pode danifica-lo?

Obrigada pelo seu post, me ajudou a dar continuidade ao meu TCC. Mais uma vez muito obrigada.

Testei o código e realmente funciona!

onde baixo a biblioteca do WDT ? já procurei não encontrei

Sensacional, essa sua resposta para o problema do reset foi util demais.

Muito obrigado.

Excelente dica,  sei que o post é antigo, mas meu codigo estava esquisito, dando loop infinito igual você citou, coloquei o wdt_disable();//desabilita o watchdog no SETUP, resolveu que uma beleza.

gostei mais ainda de saber que eu posso escolher quando código vai entrar em reset com o wdt, resolveu todos meus problemas.

Segundo o pessoal da Atmel, não é interessante o reset usando um pino de I/O pois durante o reset os pinos digitais vão para um modo hi-z (high-impedance). Ou seja, não permaneceriam em HIGH o tempo necessário para se ter um reset COMPLETO, reinicializando toda a memoria, registradores, flags, etc, etc... Em outras palavras, pode até reiniciar a execução do programa, mas vai ficar lixo lá.

Uma solução é usar um 555 e usar esse "empurrão" que você falou só como um gatilho. Depois de acionada a contagem do timer*, o circuito que se vire em manter o estado de reset.

Sobre o 555: http://www.doctronics.co.uk/555.htm#monostable

*lembrando que o 555 inicia a contagem em "LOW".

 

E o pino... é impressão minha ou por default (creio que alguma configuração do bootloader) o pino13 sempre "pisca" durante o reset (creio que pra sincronismo de clock do ISP, deve ser possível desabilitar no bootloader)? Tem que cuidar na escolha do pino pra não ter um looping infinito aí.

"É vero". Eu disse o 13 só como um exemplo, mas se ele piscar...põe tudo em loop.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço