terça-feira, setembro 27, 2011

O Auto-Reset do Arduino

Enquanto não consigo colocar para funcionar o USBtinyISP, fiz algumas experiências no uso do Arduino como um programador de microcontroladores AVR. A principal dificuldades encontrada está em contornar a característica de "auto-reset" do Arduino, o apresento aqui.

O Que é o Auto-Reset do Arduino

O auto-reset é um reset automático do microcontrolador do AVR quando uma conexão serial é estabelecida. Ele foi introduzido no Arduino Diecimila, estando presente inclusive nos modelos Uno e Duemilanove e em alguns modelos seriais RS-232.

Quando uma conexão serial é estabelecida, o sinal DTR da interface RS232 (ou o equivalente na interface serial simulada na USB) é acionado; o hardware do Arduino (ou o firmware do ATMega8U2 usado para implementar a USB) força o reset do microcontrolador para zero neste momento.






Qual o Efeito do Auto-Reset


O auto-reset é como um reset normal (conexão da alimentação ou pressionamento do botão de Reset): o programa em execução é interrompido, o microcontrolador é colocado em um estado inicial, com todos os registradores de I/O sendo colocados em sua programação inicial e o processamento sendo executado no endereço de reset.

No caso do Arduino, um reset faz com que o bootloader seja acionado. O bootloader irá aguardar um comando do PC. Se este comando não for recebido dentro de um certo tempo, o bootloader passará o controle para a aplicação.

Porque Existe o Auto-Reset

Quando estamos desenvolvendo programas no Arduino, temos normalmente o seguinte ciclo: escrevemos ou alteramos o código fonte, mandamos compilar e carregar no Arduino, observamos o funcionamento e voltamos a escrever ou alterar o fonte. É portanto, necessário interromper frequentemente a aplicação e devolver o controle para o bootloader para carregar uma nova versão.

Nos primeiros Arduinos, era preciso apertar o botão de Reset antes de carregar uma aplicação. Com o auto-reset, basta disparar a carga no PC, que o reset é gerado "auto-magicamente".

Porque o Auto-Reset Pode Atrapalhar

O auto-reset atrapalha quando a aplicação comunica via serial com o PC. Quando o PC conectar, o microcontrolador será ressetado e o controle passará primeiro pelo bootloader. Enquanto o bootloader estiver ativo, o PC não conseguirá falar com a aplicação.

Um exemplo prático é quando a aplicação está simulando um programador AVR e a aplicação no PC é o AVRDUDE. Neste caso o auto-reset poderá fazer com que o AVRDUDE não receba a resposta dos comandos e ache que o programador não está conectado corretamente.

Como desligar o Auto-Reset

O ideal seria o Arduino ter um jumper para ligar ou desligar o auto-reset. Infelizmente, nenhum modelo atual tem esta facilidade. O UNO e o Duemilanove possuem duas ilhas interligadas por uma fina trilha; cortando a trilha o auto-reset é desligado. Para ligá-lo novamente é preciso reconectar as duas ilhas. Infelizmente não dá para soldar dois pinos e usar um jumper normal.

A solução é apelar para alguns truques. No caso do Duemilanove, um resistor de 120 ohms conectando o sinal Reset à alimentação (5V) impede o funcionamento do auto-reset. Já no UNO é necessário colocar um capacitor de 10 uF entre o sinal de reset e o terra. Fiz testes com estas duas soluções e elas funcionaram de forma totalmente confiável.

Uma referência mais completa sobre a desativação do auto-reset pode ser encontrada no Arduino playground.




8 comentários:

Unknown disse...

Gostaria de lhe dar os parabéns sobre o assunto discutido nesse post.
Comecei agora a estudar o Arduino e o auto-reset foi um problema que encontrei para que um sistema que estou desenvolvendo funcionasse 100%.
Já tinha lido vários sites sobre o assunto, mas o seu foi o mais completo.
Parabéns pelo trabalho.

Ronaldo Araujo

Pedro Rodrigues disse...

Olá,
Eu tenho um arduino Uno e recentemente reparei que durante a execução do programa, o arduino após um tempo aleatório faz auto reset, o que me incomoda bastante para o projeto que estou a desenvolver. Gostava de saber se o problema é similar ao descrito acima. E se a solução será colocar um condensador de 10pF entre o reset e a ground.

Aguardo pela resposta,
Pedro

Daniel Quadros disse...

Pedro, o auto-reset que eu me refiro ocorre quando o PC se conecta ao Arduino. Veja se o reset continua ocorrendo quando o Arduino não está conectado ao PC (alimente pelo outro conector). Se o reset não ocorrer com o Arduino desconectado, provavelmente tem algum software no seu PC que está acessando a porta serial. Se o reset ocorrer com o Arduino conectado o problema é outro. Uma possibilidade é você estar "puxando" corrente demais do Arduino. Outra é o seu programa estar acidentalmente ligando o watchdog, para investigar isto veja se o problema ocorre com um programa mais simples (por exemplo, altere o Blink para dar uma piscada longa em setup() para você perceber quando ressetar).

Anônimo disse...

Muito bom tópico, por favor me confirma se entendi direito.O auto reset acontece quando do inicio da comunicação entre o PC e a serial/USB do Arduíno, mas só acontece quando o PC inicia a comunicação e não acontece quando o Arduíno inicia comunicação.É isto mesmo ? Obrigado pelo altruísmo de fazer o site , pessoas como você que compartilham o conhecimento são a razão da humanidade evoluir.

Daniel Quadros disse...

Para ocorrer a comunicação, independente de quem iniciou, a porta serial tem que ser aberta no PC. Neste momento ocorre o reset.

CONEXÃO INFORMÁTICA disse...

capacitor pode ser de 47 uf ? ainda to começando eletronica.

CONEXÃO INFORMÁTICA disse...

e o terra no casa seria GND ?

Daniel Quadros disse...

Sim terra é o GND. Tenho a impressão que 47uF é um valor alto demais, mas não testei.