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.




Um comentário:

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