O projeto Franzininho tem o objetivo de incentivar as pessoas nas áreas de eletrônica e programação. Através das oficinas de soldagem e programação na Arduino IDE, diversas pessoas tiveram o seu primeiro contato com essas áreas.

 

https://www.instagram.com/fabiosouza.io 

https://www.youtube.com/channel/UCPrc3wf0Rib6_BXqbTyuY2Q 

 

Sempre buscamos despertar o interesse de futuros profissionais para as áreas de sistemas embarcados. Uma das formas que consideramos importante para quem pensa em trabalhar com sistemas embarcados no futuro é aprender a programar olhando para a arquitetura do microcontrolador.

 

A placa Franzininho DIY é uma ótima ferramenta para os primeiros passos com linguagem C e aprender conceitos fundamentais para entrar com os dois pés na programação de microcontroladores.

 

Esse artigo tem o objetivo de mostrar os primeiros passos para programação de microcontroladores usando linguagem C e com abordagem mais próxima ao hardware.

 

Serão apresentados uma sequência de exemplos para programação da Franzininho DIY usando a AVR Libc.

 

 

Conhecendo o microcontrolador ATtiny85

 

O ATtiny85 é um microcontrolador de 8 bits da familia AVR da Microchip. Possui 8 KB de memória Flash, 512B de EEPROM, 512B SRAM, 6 GPIO, conversor A/D de 10 bits e opera a 20 MIPS em 20 MHz. Também possui comunicação I2C e saídas PWM. A figura 1 exibe o pinout do ATtiny85.

 

Figura 1
Figura 1 | Clique na imagem para ampliar |

 

 

Apesar de a quantidade de pinos ser bem restrita, é possível realizar diversas aplicações interessantes com ele. Na figura 2 temos o diagrama de blocos do ATtiny85.

 

Figura 2
Figura 2 | Clique na imagem para ampliar |

 

 

Com essa arquitetura simples (mas poderosa) podemos aprender diversos conceitos sobre programação de microcontroladores e fazer aplicações otimizadas para diversas áreas.

 

Pinout da placa Franzininho DIY

 

É importante que você tenha o pinout da Franzininho DIY sempre acessível para saber quais pinos e recursos irá utilizar (figura 3).

 

Figura 3
Figura 3 | Clique na imagem para ampliar |

 

 

Note que mapeamos os recursos de cada pino nesse pinout.

 

Ferramentas necessárias

 

Você não precisará de um compilador específico ou IDE para compilar os exemplos apresentados. Porém, é importante que tenha as seguintes ferramentas instaladas na sua máquina:

• GCC AVR

• avr libc

• binutils-avr

• make

 

 

Arduino IDE

 

Caso você não queira montar o seu ambiente de desenvolvimento, todos os códigos apresentados podem ser compilados diretamente na Arduino IDE com a correta configuração para a Franzininho DIY: https://franzininho.github.io/docs-franzininho-site/docs/franzininho-diy/pacote

 

 

Wokwi

 

Você também pode usar o simulador Wokwi para reproduzir os projetos apresentados nessa série. Aproveite o template de projeto: https://wokwi.com/arduino/new?template=franzininho

 

 

Hello, World! Em linguagem C com AVR LibC

 

Esse exemplo básico nos dará estrutura para todos os nossos exemplos daqui para frente. Como já mencionado, usaremos a linguagem C em conjunto com a biblioteca AVR LibC. Para esse exemplo você só precisará da placa Franzininho DIY e as ferramentas de softwares listadas anteriormente.

 

O código a seguir exibe a estrutura mínima de um programa em linguagem C para microcontroladores. Se você tem dificuldades com a linguagem C, recomendo que confira os seguintes materiais:

• Playlist Linguagem C - https://www.youtube.com/watch?v=l9ZdS8kph0A&list=PLqY1DITQ0sB_5yUBqhnm37J5PxsjrVPKT 

• Slideshare - https://www.slideshare.net/FabioSouza9/resumo-linguagem-c-para-microcontroladores-pic-usando-mikroc 

Nesse momento é importante que você se atente a estrutura do código. Vamos usar alguns registradores para acionar o LED, mas não serão o foco da explicação. Confira os comentários no código a seguir:

 

/**
 * @file main.c
 * @author Fábio Souza
 * @brief Exemplo para blink LED na placa Franzinino
 * @version 0.1
 * @date 2021-02-03
 *
 * @copyright  Franzininho
 * This example code is in the Public Domain (or CC0 licensed, at your option.)
 * Unless required by applicable law or agreed to in writing, this
 * software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 * CONDITIONS OF ANY KIND, either express or implied.
 *
 */

#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 16500000L

/**
 * @brief Função main
 *
 * @return int
 */
int main(void)
{
 
  DDRB |= (1 << PB1);  	 // Configura Pino PB1 como saída (Pino do LED)
 
  /**
   * @brief loop infinito
   *
   */
  while (1)
  {
	PORTB |= (1 << PB1);  	 // Liga LED
	_delay_ms(500); 		 // delay 500 ms

	PORTB &= ~(1 << PB1); 	 // desliga LED
	_delay_ms(500); 		 // delay 500 ms
  }                                           	 
  return (0);                      	 
}

 

No próximo exemplo vamos detalhar sobre os registradores de IO. Nesse momento, além da estrutura inicial é importante que você entenda como usar a função _delay_ms().

Essa função espera o tempo passado em milissegundos.

Altere o código para que o LED fique 100 ms (on) e 1000 ms (off), veja o efeito.

Simule esse exemplo em: https://wokwi.com/arduino/projects/302846728334213645?view=diagram 

 

 

Trabalhando com Saídas Digitais

 

O ATtiny85 possui 8 pinos, sendo que 6 deles podemos usar como I/O (entradas ou saídas) digitais. Os pinos de I/O são nomeados conforme a porta que eles pertencem. Na figura 1 vimos que os pinos do ATtiny85 são nomeados de PBx, onde x é o número correspondente ao pino no registrador (não se preocupe, veremos mais detalhes a seguir).

Cada pino de I/O pode ser usado como entrada ou saída e também como outras funções, nesse momento só vamos trabalhar com os pinos funcionando como GPIO (General Porpouse Input/Output).

Conforme exibido na imagem acima, temos os seguintes pinos disponíveis no ATtiny85:

PB0, PB1, PB2, PB3, PB4, PB5.

 

 

Registradores responsáveis pelos pinos de I/O

 

Para trabalhar com os pinos de I/O no ATtiny85 temos 3 registradores:

• PORTB: Registrador de dados. Responsável pela escrita nos pinos;

• DDRB: Registrador de direção do pino. Responsável pela configuração dos pinos para definir se será entrada ou saída;

• PINB: Registrador de entrada da porta. Responsável pela leitura do estado do pino.

Note que todos os registradores terminam com B no final. Isso significa que estamos trabalhando com o PORTB. Caso fosse um microcontrolador com maior quantidade de pinos teríamos os finais A, B, C, etc. Cada porta só possui no máximo 8 pinos.

Na seção 10 do datasheet do ATtiny85 temos todos os detalhes para se trabalhar com os I/O. A tabela a seguir, retirada do datasheet, exibe as configurações possíveis para os pinos:

A figura abaixo exibe os registradores responsáveis pelos pinos de I/O do PORTB:

Note que cada bit dos registradores é responsável por pino sendo indexado pelo número correspondente ao bit. Dessa forma, se quisermos usar o pino PB1 para acionar o LED, devemos configurar o registrador DDRB da seguinte forma:

 


 

 

E para acionar ligar/deligar o LED devemos colocar 1 ou no bit correspondente no PORTB.

Vamos a um exemplo para ficar mais claro.

 

/**
 *
 * @file main.c
 * @author Fábio Souza
 * @brief Exemplo para acionamento do LED na pino PB1
 * @version 0.1
 * @date 2021-02-03
 *
 * @copyright Franzininho
 * This example code is in the Public Domain (or CC0 licensed, at your option.)
 * Unless required by applicable law or agreed to in writing, this
 * software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 * CONDITIONS OF ANY KIND, either express or implied.
 *
 */
#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 16500000L //frequência do oscilador. usado para a função de delay

	/**
 * @brief Função main
 *
 * @return int
 */
int main(void)
{

  DDRB = 0b00000010;  // Configura Pino PB1 como saída (Pino do LED)

  /**
   * @brief loop infinito
   *
   */
  while (1)
  {
	PORTB = 0b00000010;	//liga LED
	_delay_ms(250);     	// delay 250 ms
	PORTB = 0b00000000;	//desliga LED
	_delay_ms(250);     	// delay 250 ms
  }                                           	 
  return (0);                      	 
}

 

O exemplo acima pisca o LED em intervalos de 250 ms. A configuração do pino PB1 como saída foi feito colocando o bit1 de DDRB em 1. Já para ligar e desligar o LED foi manipulado o bit 1 de PORTB, hora em 1 hora em 0.

Projeto disponível em: https://github.com/Franzininho/exemplos-avr-libc 

Confira a simulação em: https://wokwi.com/arduino/projects/302847336216789517?view=diagram 

 

 

 

Conclusão

 

Os exemplos apresentados apresentam os primeiros passos para programar a Franzininho DIY em linguagem C. Você pode se aprofundar no estudo e aplicações em linguagem C com o microcontrolador ATtiny85 da Franzininho DIY. Como você pode observar o código compilado é bem pequeno, porém é necessário ter um conhecimento maior sobre os registradores e a configurações corretas dos mesmos. Fica como incentivo que você continue a explorar os demais exemplos da documentação do projeto Franzininho e crie aplicações com essa abordagem de programação.

 

Confira mais exemplos em linguagem C:

https://franzininho.github.io/docs-franzininho-site/docs/franzininho-diy/exemplos-avr-libc/primeiros-passos