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.
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.
24 comentários:
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.
Como seria estes procedimento se fosse realizando em sistema linux? grato!
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.
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 !!
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).
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!
Deve funcionar também com o Arduino Mega, não sei bem como fica o auto-reset nele.
Obrigado Daniel, vou dar uma pesquisada melhor e qualquer coisa retorno com os resultados.
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?
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?
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.
É 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).
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
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.
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.
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).
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 ?
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.
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
Sim, dá para gravar o ATmega32-16PU, conectando os sinais de gravação (Reset, MISO, MOSI, SCK), Gnd e Vcc e usando o avrdude.
Oi Chará!
Faltou a explicação de como gravar o código Main.c no AVR!
Abçs
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.
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
Oi Daniel! Quero corrigir uma coisa: Onde diz avr328P leia-se atmega328P. Obg
Postar um comentário