Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
gravacao-atmega328 [2019/01/21 13:19] amador [Gravação Direta no Arduino] |
gravacao-atmega328 [2019/01/31 14:38] (atual) amador |
||
---|---|---|---|
Linha 1: | Linha 1: | ||
- | =======Programação ATmega======= | + | =======Gravação ATmega======= |
- | Temos duas maneiras de programar um ATmega: gravar diretamente o ATmega que fica no Arduino ou usar um Arduino como ISP (In System Programming). | + | Para gravar um código no ATmega, é preciso compilar ele, gerando assim o arquivo HEX, e depois gravar o arquivo HEX gerado. Para compilação, usamos o compilador avr-gcc |
+ | [(avrgcc>> | ||
+ | title : AVR GCC | ||
+ | publisher : GCC Wiki | ||
+ | url : https://gcc.gnu.org/wiki/avr-gcc | ||
+ | )] | ||
+ | e para gravação usamos o gravador AVRDUDE | ||
+ | [(avrdude>> | ||
+ | title : AVRDUDE - AVR Downloader/UploaDEr | ||
+ | publisher : AVRDUDE | ||
+ | url : https://www.nongnu.org/avrdude/ | ||
+ | )] | ||
+ | |||
+ | |||
+ | Para fazer a gravação de um ATmega, podemos gravar diretamente o ATmega que fica no Arduino ou usar um Arduino como ISP (In System Programming). | ||
+ | |||
+ | Informações sobre a programação pode ser encontrada em [[Programação ATmega328]]. | ||
---- | ---- | ||
+ | =====Instalação do Compilador e Gravador===== | ||
+ | |||
+ | Para distribuições de Linux baseadas em Debian (como o Ubuntu), a instalação é feita através da linha de comando: | ||
+ | <code>sudo apt-get install gcc-avr gdb-avr binutils-avr avr-libc avrdude</code> | ||
+ | |||
+ | Para distribuições de Linux baseadas em Arch, a instalação é feita a partir da linha de comando: | ||
+ | <code>sudo pacman -S avr-gcc avr-gdb avr-binutils avr-libc avrdude</code> | ||
+ | |||
+ | ---- | ||
+ | =====Compilação ATmega===== | ||
+ | |||
+ | Tem o objetivo de transformar o código fonte em um arquivo HEX que será posteriormente gravado no ATmega. Tendo o arquivo fonte em C, compilamos ele usando 3 linhas de comando no formato: | ||
+ | <code> | ||
+ | avr-gcc -Os -DF_CPU=16000000 -mmcu=atmega328p -c -o codigoExemplo.o codigoExemplo.c | ||
+ | avr-gcc -mmcu=atmega328p codigoExemplo.o -o codigoExemplo | ||
+ | avr-objcopy -O ihex -R .eeprom codigoExemplo codigoExemplo.hex | ||
+ | </code> | ||
+ | |||
+ | No primeiro comando, ''-Os'' diz para o compilador otimizar o uso de espaço, ''-DF_CPU=16000000'' define a frequência de clock do microcontrolador (16 MHz no caso de um ATmega em um Arduino), ''-mmcu=atmega328p'' define o microcontrolador usado, ''-c'' diz que o compilador deve compilar e parar, ou seja, não deve conectar diferentes módulos do código depois de compilar, e ''-o codigoExemplo.o codigoExemplo.c'' define que o arquivo fonte codigoExemplo.c deve gerar o código objeto codigoExemplo.o. | ||
+ | [(optionsAvrgcc>> | ||
+ | title : A simple project - Compiling and Linking | ||
+ | publisher : AVR Libc Reference Manual | ||
+ | url : https://www.microchip.com/webdoc/AVRLibcReferenceManual/group__demo__project_1demo_project_compile.html | ||
+ | )] | ||
+ | |||
+ | No segundo comando, os códigos objeto gerados no primeiro comando são conectados e usados para gerar o arquivo binário ''codigoExemplo''. A decisão de a compilação e junção estarem separadas é indicada pois projetos mais complexos podem conter um grande número de módulos, então não será necessário compilar todos os módulos novamente antes de juntá-los em um arquivo binário. [(optionsAvrgcc)] | ||
+ | |||
+ | No terceiro comando, o arquivo binário ''codigoExemplo'' é usado para gerar o arquivo ''codigoExemplo.hex'', no formato Intel HEX, comum para gravação de microcontroladores. ''-O ihex'' define que a saída será no formato Intel HEX e ''-R .eeprom'' retira a seção de eeprom do arquivo HEX. | ||
+ | [(optionsAvrobjcopy>> | ||
+ | title : avr-objcopy Manual | ||
+ | publisher : Free Software Foundation, Inc. | ||
+ | url : http://ccrma.stanford.edu/planetccrma/man/man1/avr-objcopy.1.html | ||
+ | )] | ||
+ | |||
+ | ---- | ||
=====Gravação Direta no Arduino===== | =====Gravação Direta no Arduino===== | ||
- | Por este método, nós gravamos diretamente o ATmega presente no Arduino. | + | Por este método, nós gravamos diretamente o ATmega presente no Arduino. Para saber quais entradas e saídas do Arduino estamos usando com nosso código, usamos o mapeamento de pinos de ATmega para Arduino: |
+ | {{:mappingatmega.png|}} | ||
- | Para utilizá-lo, é preciso ter o arquivo .hex gerado pela compilação e conectar o Arduino ao computador. Então é usada a linha de comando no formato | + | Para utilizá-lo, é preciso ter o arquivo .hex gerado pela compilação e conectar o Arduino ao computador. Então é usada a linha de comando no formato: |
<code>avrdude -c arduino -p m328 -P /dev/ttyUSB0 -b 115200 -U flash:w:codigoCompilado.hex</code> | <code>avrdude -c arduino -p m328 -P /dev/ttyUSB0 -b 115200 -U flash:w:codigoCompilado.hex</code> | ||
- | Nesta linha de comando, ''-c arduino'' especifica que o arduino é o programador utilizado, ''-p m328'' especifica que o microcontrolador sendo gravado é um ATmega328, ''-P /dev/ttyUSB0'' especifica que o dispositivo está no port /dev/ttyUSB0, ''-b 115200'' determina o baudrate usado na gravação (115200 é o usado para gravação em Arduino) e ''-U flash:w:codigoCompilado.hex'' determina que a gravação ocorrerá na memória flash do microcontrolador, que será uma operação de escrita (determinada pela letra w) e que o arquivo a ser gravado é o ''códigoCompilado.hex''. | + | Nesta linha de comando, ''-c arduino'' especifica que o arduino é o programador utilizado, ''-p m328'' especifica que o microcontrolador sendo gravado é um ATmega328, ''-P /dev/ttyUSB0'' especifica que o dispositivo está no port /dev/ttyUSB0, ''-b 115200'' determina o baudrate usado na gravação (115200 é o usado para gravação em Arduino) e ''-U flash:w:codigoCompilado.hex'' determina que a gravação ocorrerá na memória flash do microcontrolador, que será uma operação de escrita (determinada pela letra w) e que o arquivo a ser gravado é o ''códigoCompilado.hex''. |
+ | [(optionsAVRDUDE>> | ||
+ | title : AVRDUDE Options Description | ||
+ | publisher : AVRDUDE | ||
+ | url : https://www.nongnu.org/avrdude/user-manual/avrdude_4.html#Option-Descriptions | ||
+ | )] | ||
+ | [(tutorialLadyada>> | ||
+ | title : AVR Tutorial | ||
+ | publisher : Ladyada.net | ||
+ | url : http://www.ladyada.net/learn/avr/avrdude.html | ||
+ | )] | ||
---- | ---- | ||
=====Arduino como ISP===== | =====Arduino como ISP===== | ||
+ | |||
+ | Por este método, nós usamos um Arduino como ISP (In System Programming) para programar um ATmega avulso. | ||
+ | Para isso, montamos o Arduino e o chip avulso da seguinte forma: | ||
+ | [(arduinoISPsite>> | ||
+ | title : Arduino as ISP and Arduino Bootloaders | ||
+ | publisher : Arduino | ||
+ | url : https://www.arduino.cc/en/Tutorial/ArduinoISP | ||
+ | )] | ||
+ | |||
+ | {{:arduinoisp.png|}} | ||
+ | |||
+ | E gravamos no Arduino o código que o faz agir como uma ISP. Esse código pode ser encontrado na própria IDE do Arduino, conforme mostra a figura: | ||
+ | [(arduinoISPsite)] | ||
+ | {{:arduinoispcodigo.png|}} | ||
+ | |||
+ | |||
+ | Então, depois de ter o arquivo .hex gerado pela compilação e conectar o Arduino ao computador, usamos a linha de comando no formato: | ||
+ | <code>avrdude -c avrisp -p m328 -P /dev/ttyUSB0 -b 19200 -U flash:w:codigoCompilado.hex</code> | ||
+ | |||
+ | Nesta linha de comando, ''-c avrisp'' especifica que o programador utilizado é uma AVRISP (dispositivo que é simulado pelo Arduino), ''-p m328'' especifica que o microcontrolador sendo gravado é um ATmega328, ''-P /dev/ttyUSB0'' especifica que o dispositivo está no port /dev/ttyUSB0, ''-b 19200'' determina o baudrate usado na gravação (19200 é o usado para gravação usando um Arduino como ISP) e ''-U flash:w:codigoCompilado.hex'' determina que a gravação ocorrerá na memória flash do microcontrolador, que será uma operação de escrita (determinada pela letra w) e que o arquivo a ser gravado é o ''códigoCompilado.hex''. | ||
+ | [(optionsAVRDUDE)] | ||
+ | [(tutorialLadyada)] | ||
+ | ---- | ||
+ | =====Makefiles===== | ||
+ | Para facilitar a compilação e gravação de ATmegas, utilizamos Makefiles. Os Makefiles para gravações simples (apenas um arquivo de código fonte) para os dois métodos de gravação apresentados estão em {{ :makefiles_atmega.zip | Makefiles ATmega}}. | ||
+ | |||
+ | Para utilizá-los, é preciso deixar o nome do arquivo escolhido apenas como ''Makefile'' e então ajustar os parâmetros NAME (nome do arquivo fonte), MICRO (qual microcontrolador é usado) e OBJ (nome do arquivo fonte mais o ''.o''). Umas vez ajeitado, pelo terminal usa-se o comando | ||
+ | <code>make</code> para compilar e o comando <code>make upload</code> para compilar e gravar. | ||
+ | |||
+ | |||
+ | =====Referências===== | ||
+ | ~~REFNOTES~~ | ||