Eu tenho usado a placa Arduino Uno por bastante tempo, incluindo como exemplos para muitos dos meus artigos. Sempre me perguntei o que seria necessário para fazer o ATmega328P (o chip original usado nas placas Uno mais antigas) funcionar completamente por conta própria. Com o Arduino tornando isso tão acessível através de seu bootloader, software GUI agradável e abstração em C++, você poderia se perguntar por que diabos eu gostaria de tentar isso. Às vezes, para apreciar o que os outros fizeram, é importante tentar fazer você mesmo. Este projeto realmente demonstrou quanto trabalho as pessoas do Arduino colocaram nisso e mudaram o mundo com aquele pequeno produto amigável.
Neste artigo, vamos passar pelo processo de inicialização do chip completamente por conta própria usando apenas uma fonte de alimentação externa e um programador Atmel-ICE. Demonstraremos como se comunicar com o chip através da interface serial onboard e também piscar um LED ou dois.
Existem algumas maneiras de configurar um ATmega328P. Uma dessas maneiras, intencionalmente não coberta como você pode dizer pelo título, é inserindo seu chip ATmega328P em um Arduino Uno, programando-o e, em seguida, movendo-o para uma protoboard. Baseado no feedback de fóruns, algumas pessoas querem pular o processo do Arduino e usar uma abordagem mais tradicional com programadores como o Atmel-ICE da Microchip. A maneira mais direta de começar com um microprocessador da Microchip (anteriormente Atmel) é instalar o Microchip Studio. No momento da escrita deste artigo, o pacote completo do Microchip Studio é suportado apenas em Windows. Como gosto de ter todos os meus ambientes de build rodando em CI (Integração Contínua), optei por uma abordagem alternativa.
A GNU Compiler Collection (GCC) é um dos compiladores mais populares por aí para a linguagem C. Ele compila certas plataformas e arquiteturas, mas não para a família de chips AVR (ATmega). No entanto, existe um conjunto de compiladores para o AVR e outras famílias da Microchip hospedados em seu site. Felizmente, algumas pessoas gentis até empacotaram esses compiladores em pacotes Debian agradáveis que podem ser facilmente instalados em Debian ou Ubuntu assim:
$ apt-get install gcc-avr binutils-avr avr-libc avrdude
Com essas ferramentas instaladas, agora somos capazes de compilar e programar o ATmega328P apenas com um programador Atmel-ICE e uma fonte de alimentação externa (ajustada em 5V). Usaremos a versão AVR do GCC para compilar o código e o AVRDUDE para gravar o chip ATmega328P.
Para este projeto, meu objetivo era demonstrar algumas capacidades básicas, mas funcionais, do ATmega328P. Um simples LED externo piscante e alguns comandos seriais de ida e volta foram tudo o que eu precisava para provar que este chip poderia se sustentar por conta própria. No repositório do projeto eu criei algumas pastas além do código-fonte (nomeado “src”) que auxiliam no desenvolvimento deste projeto.
Um componente importante para o desenvolvimento de software (mesmo software que é executado em hardware) é o teste de unidade. O teste de unidade valida se as funções ou partes do sistema maior estão funcionando conforme esperado. Se alguém modificar uma parte dessa funcionalidade, o teste de unidade evitará regressões (ou seja, você quebrou algo involuntariamente ao introduzir um novo recurso). Neste exemplo, escrevi um teste de unidade básico que simula o hardware e executa o esquema de inicialização da biblioteca de comunicação serial (USART).
Além do teste de unidade (localizado na pasta “tests”), há também uma pasta chamada “hil”, que significa Hardware in the Loop. Esta pasta contém os scripts necessários para executar testes com hardware real no loop (como discutido em muitos dos meus artigos anteriores). Isso garante que meu código seja funcional não apenas no mundo virtual (usando simulações) mas também no mundo real, executando testes em hardware real.
Consultar o README.md fornecerá um diagrama de pinagem para conectar o programador Atmel-ICE ao chip ATmega328P:
Figura 1: Pinagem do Atmel ICE
Adicionando alguns LEDs, conectando a porta de comunicação serial a um Raspberry Pi e utilizando a linha de +5V do Raspberry Pi, você agora tem uma montagem completa pronta para uso:
Figura 2: ATmega328P usando uma placa de expansão com o Raspberry Pi e o programador Atmel-ICE
Ao desenvolver novos recursos, use o Makefile para executar testes de unidade e compilar o código. Após validar que o código desejado faz o que se pretende fazer (via validação de teste de unidade), construa o binário, grave-o no dispositivo (também via Makefile) e execute testes Hardware in the Loop (HIL) usando a porta de comunicação serial do Raspberry Pi.
Uma das partes mais importantes é gravar corretamente os bits de fusível para habilitar o relógio interno de 8 MHz. Isso está documentado no README, mas também adicionado ao comando de gravação no Makefile:
avrdude -c atmelice_isp -p m328p -B 32 -U lfuse:w:0xe2:m
Depois disso, você deverá ser capaz de usar a interface serial do chip com a suposição de que o relógio a bordo funciona a 8 MHz (como definido no topo do main.c). A partir daqui, você deverá ser capaz de adicionar mais funcionalidades, como suporte para comandos seriais adicionais, interfaces para componentes externos e sensores, e qualquer coisa que você possa imaginar com este divertido microcontrolador.
Neste artigo, você aprendeu como iniciar com o chip ATmega328P sem qualquer circuito externo, como comumente visto com os originais Arduino Unos e placas de avaliação da Microchip. Agora você conhece o conceito de teste de unidade, compilações binárias, programação do chip e execução de testes de hardware em loop. Além disso, foi abordado um detalhe importante, muitas vezes negligenciado, sobre a programação dos bits de fusível para configurar o relógio interno para 8 MHz. Neste ponto, você deve ser capaz de adicionar mais funcionalidades com testes de unidade e HIL adicionais e executar tudo apenas com um programador Atmel-ICE e uma fonte externa de 5V. Para simplificar, utilizar um Raspberry Pi por sua fonte de alimentação e capacidades de comunicação serial seria a maneira mais fácil de controlar o processo de ponta a ponta.
O código-fonte do projeto pode ser encontrado aqui:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.