Quinta-feira, Novembro 17, 2011

Passo a Passo: Usando o Arduino UNO para Gravar o Bootloader do Arduino em um ATMega328

Como já mostrei sucintamente, um Arduino pode ser usado como gravador de microcontroladores AVR. Neste post, vamos ver passo a passo como usa uma Arduino UNO para gravar o bootloader do Arduino em um microcontrolador ATMega328 (em uma espécie de reprodução assexuada).



Pré-Requisitos

Você vai precisar de:
  • Um Arduino UNO. Outros modelos podem ser usados com pequenas adaptações.
  • A IDE do Arduino instalada no micro. No caso usei o Arduino 022 rodando sob Windows XP. Outras versões e outros sistemas operacionais podem exigir pequenas adaptações.
  • Comunicação entre o Arduino e o micro funcionando. Se você consegue carregar um sketch no Arduino, está tudo certo.
  • Uma breadboard (também chamada de protoboard ou matriz de contatos) e alguns fios de interconexão. Você pode fazer a montagem de outras formas, mas esta é a mais simples.
  • Um ATMega328. Com pequenas adaptações você pode usar um ATMega168 ou ATMega8.
  • Um cristal de 16MHz e dois capacitores de 22pF. O cristal pode ser de qualquer frequência entre 4 e 20MHz, 16MHz é o valor usado no Arduino. Os capacitores podem ser entre 12 e 27pF. Você pode ainda substituir estes três componentes por um ressonador.
  • Dois resistores de 1K 1/8 ou 1/4W.
  • Um LED (qualquer cor).
  • Um capacitor de 10uF, 16V ou mais.
 Além disso você precisa:

  • Saber qual a serial corresponde à conexão do Arduino. Com a IDE rodando e o Arduino conectado, você pode observar isto no menu Tools / Serial Port.
  • Saber em qual diretório está instalado o software do Arduino. No meu caso, está em "C:\Program Files\arduino-0022", mas provavelmente está em algum outro diretório do seu micro.

Passo 1: Programação do Arduino

Na IDE do Arduino, selecione File | Examples | ArduinoISP e faça o upload para o Arduino. Se tudo estiver certo, você verá a mensagem "Done uploading.".



Se isto não acontecer, você está com algum problema na conexão do Arduino ao IDE. Certifique-se que o modelo do Arduino e a porta serial estão selecionadas corretamente na IDE.

Passo 2: Teste Preliminar

Como primeiro teste, vamos colocar o LED de heartbeat. O LED tem um terminal positivo (normalmente mais comprido) e um negativo (normalmente indicado por uma parte reta no encapsulamento plástico). O terminal positivo será ligado ao pino Digital 9 do Arduino, através de um resistor de 1K. O terminal negativo será ligado ao terra (pino GND do Arduino):

O LED deverá piscar gradualmente, como se fosse um coração batendo:

video


Passo 3: Montagem

Desconecte o cabo USB e complete a montagem na protoboard, conforme a figura abaixo.

Atenção para a polaridade do eletrolítico, o terminal '-' deve estar ligado ao terra e o terminal '+' ao pino de Reset do Arduino.


Passo 4: Teste da Montagem

Abra uma janela de comando e vá para o subdiretório hardware\tools\avr\bin do diretório onde a IDE do Arduino está instalada. Digite o comando

avrdude -p atmega328P -c avrisp -P com4 -b 19200

substituindo COM4 pela porta que corresponde ao Arduino .

Você deve receber mensagens como as abaixo, indicando que o AVRDUDE conseguiu comunicar corretamente com o Arduino e reconheceu o ATmega328. Se o AVTDUDE der alguma mensagem de erro, verifique os passos anteriores.


Passo 5: Programação

Copie o arquivo optiboot_atmega328.hex do subdiretório hardware\arduino\bootloaders\optiboot para o subdiretório hardware\tools\avr\bin:

COPY ..\..\..\arduino\bootloaders\optiboot\optiboot_atmega328.hex

Para gravar o bootloader na Flash, usamos o comando

avrdude -p atmega328P -c avrisp -P com4 -b 19200 -U flash:w:optiboot_atmega328.hex

A gravação é bem rápida mas a verficação demora um pouco; ao final você deve ter algo como:


Agora falta somente acertar os flags:

avrdude -p atmega328P -c avrisp -P com4 -b 19200 -u -U efuse:w:0x05:m -U hfuse:w:0xDA:m -U lfuse:w:0xFF:m -U lock:w:0x0F:m

E pronto, você tem um ATmega328 pronto para ser colocado em um Arduino!

Um comentário sobre os valores dos fuses: na documentação da Atmel, os bits não usados dos fuses são indicados com o valor "1" porém o AVRDUDE usa o valor "0". Se você tentar programar o extended fuse com 0xFD, o AVRDUDE vai dizer que deu erro pois leu 0x05. Portanto é necessário colocar "0" nos bits não usados nos fuses.

4 comentário(s):

Anônimo disse...

Realmente muito interessante essa tua postagem!Parabéns.
Uma pergunta. Você já tentou usar o Arduino como gravador para microcontroladores de outros fabricantes?

Daniel Quadros disse...

Não tentei usar como gravador para outros microcontroladores. Uma busca rápida mostrou alguns poucos projetos do tipo.

Anônimo disse...

Olá Daniel,
Não sei se recebeste meu e-mail. No site do Arduino.cc diz que não é possivel fazer isso no Arduino UNO. Tentei de diversas formas e não consegui gravar. Alguma dica?
Um abraço e parabéns pelo Blog.

Daniel Quadros disse...

O problema com o UNO é o auto-reset, o capacitor no reset deveria resolver isto. Veja o meu post
http://dqsoft.blogspot.com/2011/09/o-auto-reset-do-arduino.html