Arduino – no capítulo anterior:
Na parte 1 dessa série, em memória aos velhos tempos, abri essa conversa para explorar um pouco mais a fundo os detalhes acerca do projeto de um contador hexadecimal usando o Arduino. Na parte 1 eu expliquei os modos de multiplexagem, comentei que meu exemplo iria usar a multiplexagem por display e que o display, para funcionar precisaria de 12 bits – 8 bits para os segmentos e 4 bits para ligar os 4 dígitos, conforme figura 1 abaixo.
Pílula azul ou ‘vermeia’:
Agora podemos partir para dois caminhos, pílula azul ou ‘vermeia’:
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.
- Pílula azul: A partir do circuito abaixo pode-se procurar um sketch pronto, copiar, colar, fazer uma ou outra adaptação, compilar, bater palminha e fim do artigo.
- Pílula ‘vermeia’: Já que dedicamos uma seção só para o display, vamos tirar um suquinho do lado do Arduino e continuar indo nos detalhes. Agora vou falar um pouco da compilação do código, pois dependendo da situação tudo indica que ele pode ser otimizado e muito. Mostro o diagrama em blocos da arquitetura do microprocessador Atmel ATMega328p, seus recursos e alguns links de material de treinamento. Ter acesso a esses links é necessário para o leitor progredir em seu conhecimento bem como facilitar o entendimento do código na parte 3 onde eu começo a falar do algoritmo do contador que vou utilizar o mapa de Karnaugh, as interrupções e os blocos de temporizadores.
Arduino e seu núcleo
Observe a figura 2 que é o diagrama do Arduino Uno usado na figura 1. Dá para localizar o conector ‘IOL’ que tem os pinos de ‘0’ a ‘7’ e o conector ‘IOH’ que tem os pinos de ‘8’ a ’13’, que são referenciados na programação para Arduino com comandos como: “pinMode(numeroPino,OUTPUT)” por exemplo.
Conforme já visto na figura 1, os pinos ‘0’ a ’13’ do display estão ligados nos conectores ‘IOL’ e ‘IOH’.
Agora pega um multímetro, o esquemático e confira onde vai parar cada um dos pinos ‘0’ a ’13’ que estão ligados nos conectores ‘IOL’ e ‘IOH’.
O leitor chegará à conclusão que os pinos de ‘0’ a ’13’ são ligados diretamente aos pinos do microcontrolador Atmel ATMega328p, conforme descrito no esquemático (alguns detalhes omitidos para simplificar o texto).
Defendendo o princípio KISS
Agora vem a pergunta que poucos fizeram:
Se os pinos do Arduíno ‘0’ a ’13’ estão ligados diretamente nos pinos do chip ATMega328p da Atmel, não seria possível programar a placa Arduino direto com as ferramentas oficiais oferecidas pela Microchip, sem usar o framework da Arduino?
Eu te respondo: Sim, é possível e isso traz uma série de vantagens inclusive de otimização de código, desde que o programador saiba o que está fazendo.
Para ilustrar apenas uma das vantagens de se usar a plataforma Atmel, seguem duas instruções que fazem a mesma coisa. Ambas colocam o pino 2 da placa Arduino no modo de saída.
No trecho de código abaixo seguem dois comandos que compilam em C. O primeiro comando é usando a plataforma Arduino e o segundo comando é usando a plataforma Atmel.
//Código no Arduino em C.
pinMode(2,OUTPUT);
//Código no Atmel, também em C.
DDRD = 0x04;
Conforme figura 3 abaixo, após compilar, ao inspecionar o código de máquina gerado, dá para notar que o comando ‘pinMode’ da plataforma Arduino usa mais de 40 instruções (no meu compilador) enquanto que o comando ‘DDRD’ usa apenas 2 instruções de código de máquina, ou seja, tudo indica que o comando ‘DDRD’ é no mínimo 20 vezes mais rápido que o comando ‘pinMode’.
Mas antes de sair condenando a plataforma Arduino, tem que ver que só olhei um comando, nas configurações de meu equipamento e eu estou apenas levantando a bola sobre o assunto e minha observação pode não ser válida para outros casos. Portanto opiniões fundamentadas são bem vindas.
Tem que testar programas mais complexos e outras situações, o que daria um TCC da hora. Inclusive caso alguém se habilite a fazer um TCC sobre o assunto, eu publico o resultado do estudo em meu site, com muito gosto desde que a nota seja maior que 8,5.
Já pensou, um aluninho mostrando indícios, ou não, que talvez a plataforma Arduino deva adotar a filosofia do princípio KISS, (mantenha isso simples, senhor)? Corajoso, né?
Recursos ocultos – Alguém comentou alguma vez sobre os recursos do microprocessador Atmel?
Cara, olha a figura 4. Ela é o diagrama em blocos do microprocessador Atmel, que é o coração do Arduino. São vários recursos que são pouco comentados na plataforma Arduino.
Há uma programação e configuração específica para cada um desses bloquinhos aí. São temporizadores/contadores de 6, 8 e 16 bits; duas interfaces seriais; duas interfaces dois fios; 2 interfaces SPI; portas de IO; gerenciamento de memória, energia, falta de energia, de clock, debug on chip, lock bits, programação paralela (que nem programar eprom) e suporte a interrupções fora que devo ter esquecido alguma outra coisa. Trata-se de uma máquina potente comparado ao seu tamanho, com recursos pouco divulgados no meu entender, que merecem ser trabalhados. Vai que você consegue substituir um Raspberry por um Arduino no teu projeto? Ganha em competitividade!
Como eu aprendo sobre esses recursos?
Para aprender a programar cada um desses bloquinhos existem os recursos do fabricante e deixo alguns links abaixo para adiantar seu lado no auto estudo.
Página do fabricante com material de suporte a desenvolvedores
Manual do microprocessador ATMega328p
IDE do Atmel Studio
Depurador de código on chip da Atmel
Portal de suporte da Microchip
Ah, não esqueça de ver as interrupções e estudar os fuse bits.
Conforme dito, nessa etapa falamos sobre a compatibilidade do Arduino com as ferramentas de desenvolvimento da Atmel, sobre a questão da otimização do código bem como dos recursos do microprocessador Atmel AtMega328p. Na parte 3 partiremos para o algoritmo do contador que fará uso dos recursos do microcontrolador e será compilado no Atmel Studio 7. Até a próxima publicação!
By Renato de Pierri
15/maio/2019