segunda-feira, outubro 03, 2011

Usando um Arduino como Programador AVR

Como já vimos, um programador AVR precisa controlar os sinais Reset, SCK, MISO e MOSI do AVR sob o controle do PC. O Arduino é um hardware bastante apropriado para isto, possuindo uma interface serial com o PC (normalmente via USB) e várias portas de E/S digital. Basta fazer um software apropriado - e este software já foi feito e é distribuído junto da IDE do Arduino. Veremos aqui como utilizá-lo.

Dentro dos exemplos do Arduino temos o ArduinoISP, que implementa um subconjunto dos comandos do programador STK-500. O primeiro passo para usar o Arduino como programador AVR é carregar este sketch no Arduino.



Em seguida é preciso fazer as ligações entre o Arduino e o microcontrolador a gravar. O site do Arduino tem até umas belas figuras de como fazer estas conexões. Não se esqueça de desligar o Arduino antes de fazer as conexões!

Além das conexões indicadas no tutorial, você pode ligar três LEDs para indicar o funcionamento, conforme descrito no Arduino playground (e no fonte do software). O terminal positivo destes LEDs devem ser ligados a determinados pinos do Arduino e o negativo ao terra, através de um resistor (1K parece ser um bom valor). Os pinos a conectar e as funções correspondentes são:
  • Digital 9: o LED fica acendendo e apagando de forma gradual (através de PWM) para indicar que o software do programador está executando (heartbeat).
  • Digital 8: o LED é aceso quando ocorre um erro.
  • Digital 7: o LED é aceso quando o programador está conversando com o microcontrolador sendo programado.
No meu caso eu usei uma shield de prototipação, e coloquei apenas o LED de heartbeat (por falta de espaço):
O programador pronto para programar um ATmega328

Nos testes eu usei o AVRDUDE 5.4 (que veio com a IDE Arduino 022) e o AVRDUDE 5.10 (que veio com o WinAvr), com um Arduino UNO e um Arduino Duemilanove.

O funcionamento foi perfeito selecionando o programador avrisp com velocidade de 19200 e desativando o auto-reset (através de um resistor de 120 ohms entre o reset e +5V no Duemilanove ou através de um capacitor de 10UF entre o reset e o terra no UNO).

Entretanto, observei alguns detalhes curiosos:
  • Para usar a porta COM20 na  versão 5.4 do AVRDUDE foi necessário usar \\.\COM20. A versão 5.10 aceitou COM20 sem problemas.
  • Estranhamente, com o AVRDUDE 5.10 o auto-reset não é acionado quando é selecionado o programador "avrisp". Selecionando o programador  "arduino" (que não existe na versão 5.4) o autoreset acontece normalmente.
  • O AVRDUDE conseguiu falar com o UNO mesmo com o auto-reset ativo. Talvez isto se deva ao fato do UNO estar concluindo o reset em um tempo menor que o Duemilanove (1 segundo contra 1,5 segundo). Considerando que o próprio site oficial do Arduino fala que o UNO não funciona com o ArduinoISP, é provavelmente uma esquisitice do meu UNO em particular.
Para fechar um vídeo da gravação do bootloader em um ATmega328 usando um Arduino UNO.


24 comentários:

wmoecke disse...

Oi Daniel,

Não sei se ficou sabendo, mas recentemente perdemos o pai da linguagem C e Unix, Dennis Richie.

O link para a notícia está aqui.

Unknown disse...

Como seria estes procedimento se fosse realizando em sistema linux? grato!

Daniel Quadros disse...

O procedimento é praticamente idêntico, já que tanto a IDE do Arduino como o Avrdude estão disponíveis para o Linux. A principal diferença é a nomenclatura das portas seriais.

Unknown disse...

E possível passa o esquema de conexão do arduino uno com o breadboard com atmega328P ??

Cada tutorial mostra de uma forma...
alguns mostram com cristal.. outros com capacitor , outros sem..

Bom eu tenho tudo em mãos:
Arduino Uno;
atmega328P
Cristal 16MHz
capacitor 22pF
capacitor 10uF
etc...

e não consigo de forma alguma, gravar o bootloader e muitos menos passar qualquer código para o novo atmega328....

Eu queria e substituir o que comprei pelo que o arduino esta usando, mais primeiro tenho que gravar esse bootloader...
estou com muitas dificuldades porém não escanço enquanto não conseguir

Se puder de alguma forma me ajudar ficarei muito grato!!!

Abração !!

Daniel Quadros disse...

Thiede,

Depois faço um post mais detalhado, mas o que eu usei é basicamente a figura que fica no final à direita na página http://arduino.cc/en/Tutorial/ArduinoISP, acrescido do capacitor de 10 uF entre o Reset e o terra do UNO. As pinagens do 168 e 328 são iguais.

Se o ATmega estiver como sai da fábrica, você precisa usar o cristal com os dois capacitores (ou um ressonador sem os capacitores).

Eventualmente (mas isto é muito improvável) pode ser que o ATmega esteja com a configuração "zoada" o que pode complicar (ou até impedir) a programação. Se possível, tente com um outro ATmega (zerado ou extraído de um outro Arduino).

Ueslei Barroso disse...

Olá, primeiramente quero te parabenizar pelo post e te fazer uma pergunta. Possuo o Arduino Mega 2560 e queria saber se é possível utilizar ele também como gravador AVR. Até mais!

Daniel Quadros disse...

Deve funcionar também com o Arduino Mega, não sei bem como fica o auto-reset nele.

Ueslei Barroso disse...

Obrigado Daniel, vou dar uma pesquisada melhor e qualquer coisa retorno com os resultados.

jose carlos barbosa disse...

Olá pessoal, tenho um arduino MEGA 1280 gravei um programa nele e ele nao permite nenhuma outra gravação. estou tentando grava-lo pelo ISP com um arduino Duemilanove. mas esta aparecendo o seguinte erro na IDE.

avrdude: Yikes! Invalid device signature. Double check connections and try again, or use -F to override this check.

alguem pode me ajuda?

Daniel Quadros disse...

Esta mensagem significa que o avrdude está esperando um microcontrolador diferente do que está conectado. Quando você usa a opção "Burn Bootloader" da IDE você deve escolher a placa que vai receber o programa (Mega 1280) e não a que está gravando (no caso o Duemilanove), será que é isto?

LEMECDS disse...

Olá Daniel,

Tenho um Uno R3 que está indicando funcionamento (led "ON" ok) e o led "L" que indica que há software no Mega328 piscando, mas ao conectar no PC não reconhece. Pesquisei na net e dizem pra fazer upload do firmware do mega16U2 (o conversor de Serial x USB). Gostaria de pedir sua ajuda. É possível programar o mega16U2 com outro Arduino?

Ficarei extremamente grato se puder me ajudar!!
Abraço.

Daniel Quadros disse...

É difícil saber se atualizar o firmware do 16U2 vai resolver o seu problema. De qualquer forma, esta atualização é feita de forma diferente, usando um modo chamado DFU. A descrição básica do processo está em http://arduino.cc/en/Hacking/DFUProgramming8U2 no Uno Rev3 é usado um 16U2 no lugar do 8U2 e o resistor de 10K já está na placa. É só conectar o Uno ao PC, ressetar o 16U2 e usar o software flip para gravar o firmware (supondo que você esteja usando Windows).

Marcos disse...

olá. muito bacana seu blog.
seguinte: acidentalmente precionei o menu (arduino ide)BURN BOOTLOADER, mas tendo conectado um gravador USBASP, o qual parou de funcionar.
eu não tinha nenhum arduino, ontem chegaram o UNO, MEGA e MINI.
Pensei em usar o uno para gravar o firmware do USBASP. Upei o Arduino_ICSP (ok). mas não soube ir a frente pois na Ide só gravam os exemplos e não firmwares externos .
Pode me ajudar ?
Sineir

Daniel Quadros disse...

Sineir, estranho ele ter parado de funcionar só com isto. De qualquer forma dá sim para gravar o firmware no USBASP, basta fazer as conexões apropriadas e colocar os parâmetros corretos no avrdude. O primeiro passo é você identificar onde os sinais de gravação estão no Arduino e no USBASP. Se o seu USBASP seguir o projeto original, basta mudar um jumper para os sinais estarem disponíveis no conector de programação. Aqui no blog tem um explicação dos parâmetros mais usados do avrdude, lembrar que o ArduinoISP corresponde a um programador avrisp com velocidade de 19200.

Oliveira, Carlos disse...

Daniel, na prática então nem preciso comprar um Gravador UsbAsp, poderia só comprar um Arduíno e gravar os microcontroladores avr da mesma forma ?

obrigado.

Daniel Quadros disse...

Carlos, depende de com que frequência você pretende gravar AVRs. Para uso esporádico o Arduino é ótimo. Se gravar for uma atividade repetitiva, um gravador dedicado e montado de forma definitiva é mais prático. Monte um USPASP ou UsbTinyIsp (usando o Arduino para colocar o firmware no microcontrolador do gravador).

Anônimo disse...

Tenho um UNO-R3, e com esse esquema eu consegui grava o Bootloader de alguns 328 que tenho por aqui. Mas não consegui fazer funcionar como um gravador AVRISP com um ATTINY25 e nem com o ATMEGA328. Não consegui com que o AVRDUDE lesse o TINNY45 conectado ao Arduino nem o MEGA328 muito menos conseguir gravar os dois. Será que esse processo só serve para gravar bootloader ?

Daniel Quadros disse...

Qual o comando que você usou e qual a mensagem que o AVRDUDE está dando? Em princípio o Arduino com o sketch ArduinoISP pode ser usado para gravar qualquer firmware nos ATmega e ATtiny, desde que você faça as ligações corretas e use os parâmetros corretos no comando.

Anônimo disse...

Ola Daniel,

Tenho o UNO e preciso gravar um .hex em um atmega3216PU, eu consigo só com o Uno gravar?
Em sendo possivel como seria a ligaçaõ, é so utilizar os pinos de gravação o gnd e o vcc?


grato

Daniel Quadros disse...

Sim, dá para gravar o ATmega32-16PU, conectando os sinais de gravação (Reset, MISO, MOSI, SCK), Gnd e Vcc e usando o avrdude.

dancopy disse...

Oi Chará!
Faltou a explicação de como gravar o código Main.c no AVR!
Abçs

Daniel Quadros disse...

dancopy,

Não sei bem que Main.c você quer usar, mas você não vai gravá-lo direto no AVR! Primeiro você precisa compila-lo, o que normalmente é feito com o avr-gcc (tem vários posts meus falando sobre isto, a partir de http://dqsoft.blogspot.com.br/2012/05/programacao-em-c-no-avr-o-avr-gcc.html). O resultado final da compilação será um arquivo hex, que você gravará no AVR usando o avrdude (alguns detalhes em http://dqsoft.blogspot.com.br/2011/07/avrdude.html).

Como é processo complicado, com linhas de comando cheia de parâmetros, o mais comum é montar um script ou um makefile para automatizar isto.

dancopy disse...

Oi xará! Me ajude, por gentileza!
Quero lhe explicar: Tenho esse código abaixo que, segundo o autor, foi projetado para 'avr-gcc' e, pelo que vejo, já está todo compilado e, o arquivo 'main.c' que me refiro está aqui, juntamente com tds os arquivos: https://github.com/WiseLord/hub08lib.
Gostaria de gravá-lo em um avr328P ou até mesmo, convertê-lo para abrir e gravar com o IDE do Arduino mas não tenho conhecimento suficiente; portanto, se vc puder me ajudar, lhe agradeço muito.

Daniel Fernandes

dancopy disse...

Oi Daniel! Quero corrigir uma coisa: Onde diz avr328P leia-se atmega328P. Obg