Sopa de pedra
e configurando o AVRDUDE no Atmel Studio:
Tópicos:
1- Introdução,
2- Para saber mais,
3- Sopa de pedra,
4- AVRDUDE no Atmel Studio
5- Finalizando
Se você curtir esse artigo, não esqueça de dar uns cliques nos anúncios para ver o que os anunciantes tem para te oferecer. Vou ficar muito contente.
1- Introdução:
Este artigo irá abordar aspectos finais da importação do projeto Arduino para o Atmel Studio, como utilizar a solução importada para desenvolver um novo código, usando no caso o modelo ‘Blink’ como template para desenvolver o projeto ‘Controle_LCD’. Será apresentado como renomear um projeto e como configurar o AVRDUDE para fazer o upload no Arduino do código compilado no Atmel Studio.
Quem está acompanhando a série ‘Arduino no Atmel Studio 7’ viu na parte 1 e na parte 2 como se faz para importar um projeto Arduino no Atmel Studio tendo por base o projeto ‘Blink’ do Arduino.
Também entrou em contato com o conceito de ‘Solução’ cuja proposta do Atmel Studio transforma um projeto Arduino em um conjunto de projetos composto pelo ‘ArduinoCore’ e o ‘Projeto do usuário’, projetos que são interligados pelas diretivas de compilação descritas no documento ‘Toolchain’ de cada projeto.
Junto com tudo isso também aprendeu a importar bibliotecas externas como a ‘LiquidCrystal’ e a configurar apropriadamente na ‘Toolchain’ evitando o erro de configuração ‘<nome da biblioteca>: No such file or directory’.
Caro Leitor, como de praxe e antes de nos aprofundarmos: Sua presença em meu site causa-me elevada estima e júbilo. Sinta-se à vontade para comentar e inclusive propor melhorias em meu texto. Boa leitura!
2- Para saber mais:
3- Sopa de pedra:
Uma vez compilado o código do artigo anterior, transcrito abaixo, é lógico que ele não serve para nada além de piscar o led da placa.
Note que a única alteração realizada foi o instanciamento do objeto ‘lcd’ a partir da classe LiquidCrystal na linha 11, que não serve para nada além de provar que a ‘Toolchain’ dos projetos ‘ArduinoCore’ e ‘Blink’ foram configuradas corretamente, resolvendo o erro compilação.
#include <Arduino.h> #include <LiquidCrystal.h> /* O diagrama esquemático para esse programa está disponível no link: "https://nets-nuts.com.br/eletronica/ligando-o-lcd-no-arduino-4bits/" Escolher o diagrama esquemático '8 bits Read Write' */ LiquidCrystal lcd(10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9); void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); // Começo do pisca pisca delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); // Fim do pisca pisca }
Considerando que o esquemático na figura 1 acima é compatível com o instanciamento do objeto lcd, bem que é possível adicionar o código que falta, inicializar e comandar o display. Abaixo segue uma possível solução, que mantém o led da placa piscando:
/* O diagrama esquemático para esse programa está disponível no link: "https://nets-nuts.com.br/eletronica/ligando-o-lcd-no-arduino-4bits/" Escolher o diagrama esquemático '8 bits Read Write' */ #include <Arduino.h> #include <LiquidCrystal.h> LiquidCrystal lcd(10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9); void setup() { // Inicializando o display lcd.begin(20, 4); lcd.clear(); lcd.setCursor(8, 0); lcd.print("NETS"); lcd.setCursor(9, 1); lcd.print("&&"); lcd.setCursor(8,2); lcd.print("NUTS"); lcd.setCursor(6,3); lcd.print("LCD 20x4"); delay(5000); //Fim da inicializacao do display // Inicialização do LED_BUILTIN como saída. pinMode(LED_BUILTIN, OUTPUT); } void loop() { // Pisca pisca digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); // Fim do pisca pisca //Controlando o display int posicao_final; //Deslocando para a esquerda for (int posicao = 0; posicao < 6; posicao++) { lcd.scrollDisplayLeft(); delay(300); } //Deslocando para direita for (int posicao = 0; posicao < 12; posicao++) { lcd.scrollDisplayRight(); delay(300); posicao_final = posicao; } //Voltando para o centro for (int posicao = posicao_final; posicao > 5; posicao--) { lcd.scrollDisplayLeft(); delay(300); } //Fim do controle do display }
O código acima até consegue controlar o display e pisca o led da placa também.
Como essas piscadelas da placa são esquisitas e não influenciam o funcionamento do display LCD, conforme código abaixo e para finalizar a sopa de pedra, remove-se a parte do pisca-pisca.
Figura 3 ao lado apresenta como renomear o nome do projeto de ‘Blink’ para ‘Controle_LCD’, no ‘Solution Explorer’.
Basta clicar sobre o nome do projeto ‘Blink'(1) com o botão direito do mouse, vai abrir o menu de contexto, no qual deve-se selecionar a opção ‘Rename’ e em seguida é possível mudar o nome do projeto.
Nesse caso o nome do projeto foi alterado de ‘Blink’ para ‘Controle_LCD’, conforme figura 3 ao lado.
#include <Arduino.h> #include <LiquidCrystal.h> //O diagrama esquemático para esse programa está disponível no link: //https://nets-nuts.com.br/pt/eletronica/ligando-o-lcd-no-arduino-4bits/ //Escolher o diagrama esquemático '8 bits Read Write' //Sopa de pedra sem a pedra. //Remoção do código para piscar o led da placa LiquidCrystal lcd(10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9); void setup() { //Começo da inicialização do display //Define o número de colunas e linhas do LCD lcd.begin(20, 4); //Limpa a tela lcd.clear(); //Posiciona o cursor na coluna 8, linha 0 lcd.setCursor(8, 0); //Envia o texto entre aspas para o LCD lcd.print("NETS"); //Posiciona o cursor na coluna 9, linha 1 lcd.setCursor(9, 1); //Envia o texto entre aspas para o LCD lcd.print("&&"); //Posiciona o cursor na coluna 8, linha 2 lcd.setCursor(8,2); //Envia o texto entre aspas para o LCD lcd.print("NUTS"); //Posiciona o cursor na coluna 5, linha 3 lcd.setCursor(6,3); //Envia o texto entre aspas para o LCD lcd.print("LCD 20x4"); delay(5000); //Fim da inicializacao do display } // A função loop roda o código para sempre. void loop() { //Começo do controle do display //armazena a posição do cursor int posicao_final; //Deslocando para a esquerda for (int posicao = 0; posicao < 6; posicao++) { lcd.scrollDisplayLeft(); delay(300); } //Deslocando para direita for (int posicao = 0; posicao < 12; posicao++) { lcd.scrollDisplayRight(); delay(300); //Guardando a posição do cursor posicao_final = posicao; } //Voltando para o centro for (int posicao = posicao_final; posicao > 5; posicao--) { lcd.scrollDisplayLeft(); delay(300); } //Fim do controle do display }
Concluída a sopa de pedra, essa série cobriu desde a abertura de um projeto Arduino, sua importação e configuração para funcionar no Atmel Studio bem como o uso dessa solução para servir de base para o desenvolvimento de uma aplicação distinta, para controlar um display LCD nesse caso.
4- AVRDUDE no Atmel Studio:
Compilado o código é necessário fazer o upload do mesmo para a placa Arduino. O upload de código binário em projetos Arduino fica a cargo da aplicação AVRDUDE. Esse tópico aborda como configurar e usar o AVRDUDE para funcionar na plataforma Atmel Studio.
A configuração do AVRDUDE é realizada em duas partes.
Primeiro, a partir de um projeto funcionando na plataforma Arduino é recuperada a linha de comando para upload de código.
Em segundo lugar configura-se o Atmel Studio para acionar o AVRDUDE empregando a mesma linha de comando utilizada para se fazer uploads de código em projetos Arduino.
Tudo o que precisa é um projeto Arduino com código compilado e que funcione com o AVRDUDE e a instalação do Atmel Studio.
4.1- Preparando a linha de comando do AVRDUDE:
4.1.1- Abrir a plataforma Arduino com um sketch compilado e funcionando.
4.1.2- Conforme indicado na figura 4 abaixo, configurar as seguintes opções nas preferências da plataforma Arduino: Clicar em ‘File'(1) -> Preferences(2) -> Marcar as opções para mostrar mensagens estendidas de compilação e de upload(3) -> Clicar em Ok(4).
4.1.3- Feita a configuração acima, fazer o upload do projeto para o Arduino.
4.1.4- Na janela de log, localize a linha do acionamento do AVRDUDE, conforme indicado na figura 5 abaixo:
4.1.5- Essa linha de comando é construida de acordo com a configuração de sua máquina e certamente é diferente do exemplo abaixo, mas sua estrutura é a mesma. Use o exemplo a seguir como modelo.
4.1.6- Copie e cole essa linha de comando de sua máquina, indicada na figura 5, em um bloco de notas que preste, de preferência o notepad++ ou outro de sua preferência. O comando ficará parecido com o comando abaixo:
C:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/bin/avrdude -CC:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:C:\Users\RENAT~1.DES\AppData\Loca\Temp\arduino_build_72236/LCD20X4_8bits_read_write.ino.hex:i
4.1.7- A linha de comando precisa ser dividida em duas partes: A parte da chamada do executável e a parte da chamada dos parâmetros do AVRDUDE.
Parte do executável (comando formatado):
C:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/bin/avrdude.exe (não esquecer de acrescentar .exe)
Parte dos parâmetros:
-CC:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:C:\Users\RENAT~1.DES\AppData\Loca\Temp\arduino_build_72236/LCD20X4_8bits_read_write.ino.hex:i
4.1.8- Na parte dos parâmetros e conforme indicado abaixo, substitua tudo o que está entre ‘:w:’ e ‘:i’ por “$(ProjectDir)Debug\$(TargetName).hex”, com as aspas.
Antes de substituir:
-CC:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:C:\Users\RENAT~1.DES\AppData\Loca\Temp\arduino_build_72236/LCD20X4_8bits_read_write.ino.hex:i
Após substituir (parâmetro formatado – preste atenção nas aspas!!!):
-C"C:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf" -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:"$(ProjectDir)Debug\$(TargetName).hex":i
*Lembre-se: A linha de comando depende da versão do seu AVRDUDE.
4.2- Configurando o AVRDUDE no Atmel Studio:
No Atmel Studio, clicar em ‘Tools'(1) -> ‘External Tools'(2) -> Escolher um título significativonem ‘Title'(3) -> Inserir o comando conforme formatado no item 4.1.7. Inserir o argumento(5) conforme formatado no tópico 4.1.8 -> Selecionar o checkbox para utilizar a janela ‘Output'(6) e clicar em ‘Ok'(7).
Pronto, só isso.
A opção ‘AVRDUDE’ será adicionada no menu ‘Tools’ antes da opção ‘External Tools’.
Agora, para rodar o AVRDUDE basta clicar em ‘Tools’ -> ‘AVRDUDE’. O programa será iniciado conforme configurado e carregará no Arduino o código binário previamente compilado.
4.3- Dicas e Mensagem de erro:
O AVRDUDE deve funcionar. A parte crítica nesse procedimento é o tópico 4.1.8. Uma aspas fora do lugar e nada irá funcionar. Não há quebra de linhas. A linha de comando e a linha de argumentos não tem quebras de linhas, elas são contínuas.
Quando carregando o código binário para o Arduino, o AVRDUDE sempre irá abrir e irá tentar carregar o código para o Arduino, mesmo que ele não exista. Se o código binário não existir, o AVRDUDE irá retornar uma mensagem dizendo que o arquivo não foi encontrado, conforme exemplo abaixo na linha 49:
avrdude.exe: Version 6.3, compiled on Dec 16 2016 at 13:33:19 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2014 Joerg Wunsch System wide configuration file is "C:\Users\renat.DESKTOP-7SIJLUM\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino8/etc/avrdude.conf" Using Port : COM3 Using Programmer : arduino Overriding Baud Rate : 115200 AVR Part : ATmega328P Chip Erase delay : 9000 us PAGEL : PD7 BS2 : PC2 RESET disposition : dedicated RETRY pulse : SCK serial program mode : yes parallel program mode : yes Timeout : 200 StabDelay : 100 CmdexeDelay : 25 SyncLoops : 32 ByteDelay : 0 PollIndex : 3 PollValue : 0x53 Memory Detail : Block Poll Page Polled Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- --------- eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00 signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00 Programmer Type : Arduino Description : Arduino Hardware Version: 3 Firmware Version: 4.4 Vtarget : 0.3 V Varef : 0.3 V Oscillator : 28.800 kHz SCK period : 3.3 us avrdude.exe: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude.exe: Device signature = 0x1e950f (probably m328p) avrdude.exe: safemode: hfuse reads as 0 avrdude.exe: safemode: efuse reads as 0 avrdude.exe: reading input file "C:\Users\renat.DESKTOP-7SIJLUM\Documents\Atmel Studio\7.0\Arduino_No_AtmelStudio\Arduino_No_AtmelStudio\Blink\Debug\Controle_LCD.hex" avrdude.exe: can't open input file C:\Users\renat.DESKTOP-7SIJLUM\Documents\Atmel Studio\7.0\Arduino_No_AtmelStudio\Arduino_No_AtmelStudio\Blink\Debug\Controle_LCD.hex: No such file or directory avrdude.exe: read from file 'C:\Users\renat.DESKTOP-7SIJLUM\Documents\Atmel Studio\7.0\Arduino_No_AtmelStudio\Arduino_No_AtmelStudio\Blink\Debug\Controle_LCD.hex' failed avrdude.exe: safemode: hfuse reads as 0 avrdude.exe: safemode: efuse reads as 0 avrdude.exe: safemode: Fuses OK (E:00, H:00, L:00) avrdude.exe done. Thank you.
Muito importante: não utilize o Microchip Studio junto com a plataforma do Arduino 2.X (por enquanto não são compatíveis).
É para utilizar o Microchip Studio apenas com a plataforma do Arduino 1.8.9 ou anterior.
Abaixo temos a configuração da Toolchain e do AVRDUDE.
Configuração do AVRDUDE no Microchip Studio com Arduino 1.8.19 "FUNCIONOU" Toolchain ArduinoCore - ALL CONFIGURATIONS $(PackRepoDir)\atmel\ATmega_DFP\1.7.374\include\ ..\include\build\arduino.avr.uno ..\include\core ..\include\variants\standard Assembler: $(PackRepoDir)\atmel\ATmega_DFP\1.7.374\include\ Toolchain Blink - ALL CONFIGURATIONS $(PackRepoDir)\atmel\ATmega_DFP\1.7.374\include\ $(ProjectDir)\..\ArduinoCore\include\core $(ProjectDir)\..\ArduinoCore\include\variants\standard Assembler: $(PackRepoDir)\atmel\ATmega_DFP\1.7.374\include\ AVRDUDE C:\Users\antenor\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/bin/avrdude.exe -C"C:\Users\antenor\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf" -v -patmega328p -carduino -PCOM5 -b115200 -D -Uflash:w:"$(ProjectDir)Debug\$(TargetName).hex":i
Finalizando:
Com esse artigo fecha-se o ciclo. Um programa foi aberto no Arduino, importado para o AtmelStudio, compilado e carregado no Arduino utilizando o AVRDUDE.
Tendo fôlego, no próximo artigo irei abordar em linhas gerais como debugar um código no AtmelStudio utilizando o simulador. Me aguardem.
Um grande abraço e nos vemos na próxima.
By Renato de Pierri
22 de Janeiro de 2017, atualizado em 24 de Junho de 2024.