Buscar

TEMA 2 - Compiladores e Simuladores

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 67 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 67 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 67 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

DESCRIÇÃO
As ferramentas para programar, desenvolver e simular soluções em sistemas embarcados
baseados em microcontroladores.
PROPÓSITO
Explorar os recursos das ferramentas para desenvolvimento e simulação do software
embarcado em microcontroladores é essencial para alcançar um bom desempenho do sistema
projetado. A utilização destas ferramentas traz uma experiência com recursos profissionais
para a formação do projetista em sistemas embarcados baseados em microcontroladores.
OBJETIVOS
MÓDULO 1
Reconhecer a importância da linguagem C na programação de sistemas embarcados
MÓDULO 2
Reconhecer as ferramentas de desenvolvimento de software para sistemas embarcados
MÓDULO 3
Aplicar as principais funções do módulo simulador da plataforma Arduino e circuitos eletrônicos
da ferramenta Tinkercad
MÓDULO 4
Identificar as características da ferramenta de simulação PICSimLab para microcontroladores
PIC
INTRODUÇÃO
Nas duas últimas décadas, o mundo da computação mudou de máquinas grandes e estáticas
para dispositivos pequenos, móveis e embarcados. Os métodos, técnicas e ferramentas para
desenvolver sistemas de software que foram aplicados com sucesso no primeiro cenário não
são tão facilmente aplicáveis no segundo. Os softwares executados nesses dispositivos
embarcados devem exibir propriedades que nem sempre são exigidas dos sistemas mais
tradicionais, como determinismo, resposta em tempo real e com alta confiabilidade.
Uma das diferenças no desenvolvimento de software para sistemas embarcados é o
conhecimento adicional que o profissional tem que adquirir com relação à elétrica e à
eletrônica, bem como as interfaces físicas de eletrônica digital e analógica com o computador.
Dessa forma, o desenvolvimento de software embarcado parece ter suas próprias regras. Em
última análise, poder-se-ia assumir que a especificação do hardware subjacente constitui uma
interface de programação, exatamente como a interface de programação de aplicativo de um
sistema operacional.
Infelizmente, apesar do fato de não haver diferenças conceituais no processo de
desenvolvimento, devido às armadilhas e peculiaridades do acesso direto ao hardware, os
desenvolvedores de software embarcado enfrentam desafios bem diferentes daqueles que
trabalham em camadas de nível mais alto de programação.
Neste tema, discutiremos sobre os compiladores para uso em sistemas embarcados baseados
em microcontroladores. Verificaremos também as ferramentas de simulação que facilitam o
aprendizado e o desenvolvimento de sistemas embarcados.
MÓDULO 1
 Reconhecer a importância da linguagem C na programação de sistemas embarcados
DA LINGUAGEM DE MONTAGEM À
LINGUAGEM C EM SISTEMAS
EMBARCADOS
O impacto do software na funcionalidade do sistema embarcado, bem como no potencial de
inovação e diferenciação de novos produtos, tem crescido rapidamente, acarretando o
aumento na complexidade do software, exigências de ciclos de inovação mais curtos e uma
demanda cada vez maior por requisitos extrafuncionais, como segurança e confiabilidade do
software, por exemplo.
O desenvolvimento de software, nos primórdios dos projetos de sistemas embarcados, era
reduzido a uma tarefa trabalhosa, necessária para implementar funcionalidades, como
algoritmos de monitoração e controle. Eram quase exclusivamente programados em linguagem
de montagem (assembly), amplamente reconhecida como uma linguagem de programação
bastante difícil. Com a crescente complexidade e demanda de qualidade pelo software
embarcado foi necessária a busca por novas formas de desenvolvimento, que conduziram na
busca por linguagens de programação mais amigáveis do que assembly.
PROGRAMAÇÃO DE SISTEMAS
EMBARCADOS
Os sistemas embarcados consistem em hardware e software. Alguns definem um sistema
embarcado simplesmente como um sistema computacional cuja função final não é ser
um computador. Dessa forma, os sistemas de câmeras digitais, eletrodomésticos e televisões
são sistemas embarcados, pois contêm sistemas computacionais, mas não se destinam a ser
computadores.
Por outro lado, o notebook não é um sistema embarcado porque contém um sistema
computacional que se destina a ser um computador. Podemos dizer, então, que um sistema
embarcado consiste em uma combinação de componentes de hardware e software para
formar um sistema computacional que executará uma ou poucas funções específicas, ao
contrário dos computadores que são projetados para uso geral.
Existe algo em comum em todos os sistemas embarcados, seja o seu processamento central
formado por um microcontrolador, microprocessador, CPLD (dispositivo lógico programável
complexo) ou FPGA (array de portas programáveis em campo): eles são programáveis, ou
seja, podemos escrever um programa para definir como o dispositivo realmente funciona.
Este software ou programa embarcado, também conhecido como firmware, permite que o
hardware monitore eventos externos (entradas) e controle dispositivos externos (saídas) de
acordo com o especificado. O programa para um sistema embarcado pode ter que manipular
diretamente a arquitetura interna do hardware, como temporizadores, interface de comunicação
serial, tratamento de interrupção e portas de entrada e saída, dentre outras.
No processo de fazer um sistema embarcado melhor, a programação do sistema desempenha
um papel vital e, portanto, a seleção da linguagem de programação é muito importante.
Existem muitas linguagens que são usadas atualmente para sistemas embarcados, como a
linguagem de montagem, C, C++, JAVA, Visual Basic, JAVA Script e até mesmo versões de
Python, como a MicroPython. No entanto, a linguagem C predomina, pois, ainda é, depois do
assembly, a que melhor atende aos fatores mais relevantes na seleção de uma linguagem de
programação para sistemas embarcados, tais como:
TAMANHO DE ARQUIVO COMPILADO
A memória que o programa ocupa é muito importante, pois processadores embutidos como
microcontroladores têm uma quantidade limitada de memória. O código compilado em C
ocupa, em média, um espaço em memória menor do que outras linguagens de alto nível.
DESEMPENHO
Os programas devem ser executados o mais rápido possível. O hardware não deve ficar lento
devido a um software lento. O código C é compilado em um executável binário bruto que pode
ser carregado diretamente na memória e executado. C fornece instruções de máquina
otimizadas para a entrada fornecida, o que também aumenta o desempenho do sistema
embarcado. A maioria das linguagens de alto nível depende de bibliotecas, portanto, elas
requerem mais memória, o que é um grande desafio em sistemas embarcados. Por exemplo,
em Java, precisamos de JVM (Java Virtual Machine) além dos arquivos jar (executável), o que
adiciona sobrecarga em termos de desempenho e consumo de memória.
PORTABILIDADE
O código desenvolvido em C é mais portátil e o usuário pode compilá-lo em outras plataformas
com o mínimo de modificações. O código C é eficiente, fácil de entender, manter e depurar. O
mesmo programa pode ser compilado para diferentes microcontroladores, algo que a
linguagem de montagem não permite.
MANIPULAÇÃO DE BITS
C é uma linguagem mais flexível e estruturada que fornece manipulação de dados bit a bit,
usando os operadores especiais, podendo alterar os bits de registradores, o que é útil quando
se trata de sistemas embarcados.
 COMENTÁRIO
Existem outras linguagens de programação de alto nível que oferecem os fatores mencionados
acima, mas nenhuma se aproxima da linguagem de programação C.
A relevância do hardware faz com que os programadores vejam C como uma variação de um
montador. E essa relevância computacional também faz do C o veículo de linguagem de alto
nível ideal para lidar com microcontroladores.
Com a linguagem C temos todas as vantagens de uma linguagem facilmente compreensível e
produtiva, amplamente padronizada, programadores prontamente disponíveis, em que
qualquer programador treinado pode entender o trabalho de outro.
O acesso a detalhes docomputador, mapas de memória, bits de registradores e assim por
diante, geralmente não estão disponíveis em linguagens de alto nível. Esses recursos são
ocultados deliberadamente pelo programador para tornar as linguagens universais e portáteis
entre as máquinas. O criador da linguagem C, no entanto, decidiu que é desejável ter acesso
ao coração da máquina, porque se destinava a usar C para escrever sistemas operacionais,
que deve dominar todos os aspectos da máquina que está controlando. Portanto, nenhum
aspecto da máquina pode ser escondido do programador. Recursos como manipulação de bit,
manipulação de campo de bits, endereçamento direto de memória e a capacidade de
manipular funções como ponteiros foram incluídos na linguagem C e que são usados na
programação de microcontroladores.
A linguagem C é, provavelmente, a única linguagem popular de alto nível que pode ser
convenientemente usada para um microcontrolador.
BÁSICO DA LINGUAGEM C PARA
MICROCONTROLADORES
A linguagem de programação C embarcada usa a mesma sintaxe e semântica da linguagem de
programação C:
função main
declaração de tipos de dados
definição de variáveis
loops
funções
instruções
A extensão embarcada para a linguagem C inclui endereçamento de hardware de entrada e
saída, operações aritméticas de ponto fixo e acesso a registradores especiais. Na verdade, não
há muita diferença entre C padrão e C para sistemas embarcados, além de algumas extensões
e do ambiente operacional. Ambos são padrões ISO que têm quase a mesma sintaxe, tipos de
dados, funções etc. Vamos examinar o básico da linguagem C para emprego com
microcontroladores.
COMENTÁRIOS
São textos legíveis para nos ajudar a entender o código, semelhante ao empregado no C
padrão, utilizando duas maneiras para escrever: uma são os comentários de uma linha (//) e a
outra são os comentários de várias linhas ( /*….*/).
PALAVRAS-CHAVE
São palavras predefinidas com um significado específico para o compilador, que fazem parte
da sintaxe e não podem ser usadas como identificadores.
Em geral, cada compilador C para sistemas embarcados pode ter o seu conjunto de palavras-
chave específicas.
A linguagem C para software embarcado pode incorporar palavras-chave especiais, como as
que definem tipos de dados particulares. Alguns exemplos:
bit 
int1 (para dados de um bit) 
int8 (tipo inteiro de 8 bits)
Esses tipos de dados não regulares da linguagem ajudam a economizar memória.
STATEMENTS (INSTRUÇÕES)
Um programa C embarcado começará com pelo menos uma instrução #include que são
usadas para introduzir o conteúdo de um arquivo separado do seu arquivo de origem. É uma
maneira prática de manter o código organizado, além de permitir usar funcionalidades das
bibliotecas, rotinas de configuração de hardware e registrar definições fornecidas pelo
fabricante.
 EXEMPLO
A instrução que inclui no processo de compilação as definições do chip, como do
microcontrolador PIC18F4550.
#include <18F4550.H>
A terminação .H indica um Header File da linguagem C, ou seja, um cabeçalho.
DEFINIÇÕES DE PRÉ-PROCESSADOR
Pode-se usar uma instrução #define para criar uma string que será substituída por um número.
As definições de pré-processador não são necessárias, mas em algumas situações são
extremamente úteis porque permitem modificar facilmente um valor que aparece em diferentes
partes do programa.
 EXEMPLO
Digamos que estejamos usando o ADC do microcontrolador e que seu código use a taxa de
amostragem do ADC em vários cálculos separados. Uma definição de pré-processador permite
usar uma string intuitiva (como SAMPLE_RATE) em vez do próprio número no código de
cálculo. Se você estiver experimentando taxas de amostragem diferentes, só precisará alterar o
valor numérico na definição do pré-processador.
#define SAMPLE_RATE 100000
Neste caso, pode-se alterar 100000 para qualquer outro número e esse novo número será
usado para substituir todas as instâncias da string SAMPLE_RATE. As definições de pré-
processador também são uma ótima maneira de tornar o código mais legível.
FUNÇÃO PRINCIPAL (MAIN)
Todo programa C ou C embarcado tem uma função principal denominada main(). Ela tem um
tipo de retorno e, em alguns casos, aceita entradas por meio de parâmetros. A função principal
é sempre o primeiro código a ser executado.
VARIÁVEIS E TIPOS DE DADOS
Os processadores armazenam dados em registradores e locais de memória. Realmente não
existe uma variável no que diz respeito ao hardware. Para o programador, porém, escrever
código é muito mais fácil quando podemos usar variáveis nomeadas intuitivamente em vez de
endereços de memória ou números de registro, como fazemos em linguagem de montagem.
Os compiladores podem gerenciar os detalhes de baixo nível associados a variáveis sem muita
entrada do programador, mas se você quiser otimizar o uso de variáveis, precisará saber algo
sobre a configuração de memória do dispositivo e a maneira como ele lida com dados de
diferentes larguras de bits. Alguns tipos básicos de dados que o C suporta são char, int, float,
double. Modificadores podem ser acrescentados às variáveis, como long, short, signed e
unsigned. O formato geral para declarar uma variável é:
tipo nome_variavel;
Um exemplo de declarar uma variável seria:
char ch.
O compilador interpretaria como a variável ch declarada como um char (inteiro sem sinal de 8
bits).
As variáveis podem ser:
GLOBAIS
São globais para o programa, ou seja, podem ser acessadas em qualquer lugar no programa.
São declaradas antes da função main().

LOCAIS
As variáveis locais, em contraste com as variáveis globais, estão confinadas às suas
respectivas funções.
OPERADORES E DECLARAÇÕES
CONDICIONAIS
O núcleo da funcionalidade computacional consiste em mover dados, executar cálculos
matemáticos e operações lógicas com dados e tomar decisões programáticas com base no
valor de dados armazenados ou gerados.
Operações matemáticas e manipulação de bits são realizadas por meio de operadores. C tem
alguns operadores:
igual (=)
adição (+)
subtração (-)
multiplicação (*)
divisão (/)
bit a bit AND (&)
bit a bit OR (|)
As entradas para uma declaração de operador são variáveis ou constantes, e o resultado é
armazenado em uma variável.
As declarações condicionais permitem que você execute ou não uma ação com base no fato
de uma determinada condição ser verdadeira ou falsa. Essas declarações usam as palavras “if”
e “else”, por exemplo:
if (count <0) 
 count =0; 
else 
 count ++;
As comparações dos operadores são as mesmas utilizadas no C padrão.
SWITCH-CASE
O switch-case é um comando com possibilidades mais simplificadas que o if-else.
 ATENÇÃO
O switch-case apenas permite realizar a comparação de igualdade com variáveis do tipo int,
char e long.
O switch-case é vantajoso quando é necessário fazer muitas comparações, pois irá oferecer
maior agilidade na implementação.
switch (expressao) { 
 case constante1: 
 instrucoes1; 
 break; 
 case constante2: 
 instrucoes2; 
 break; 
 ... 
 default: 
 instrucoes; 
}
Para utilizar o switch-case, basta substituir a palavra expressao pelo nome da variável que
será avaliada. Substituir a palavra constante1 pela constante a ser comparada com o
conteúdo da variável em expressao. Este bloco estrutural deve ser utilizado para as demais
instruções subsequentes em que se pretende executar, caso a comparação seja verdadeira. A
cláusula default, opcional, funciona como o último else em um conjunto de instruções if, ou
seja, se nenhuma condição anterior é verdadeira, então as instruções em default serão
executadas.
 ATENÇÃO
A cláusula break é responsável pela parada na execução das instruções, pois caso não seja
colocada, as instruções dos cases subsequentes serão executadas.
ESTRUTURAS DE REPETIÇÃO (LOOPS)
Fornecem um meio conveniente de executar repetidamente um bloco de código e surgem com
muita frequência em aplicações embarcadas.
FOR
Estes são mais indicados para situações emque um bloco de código deve ser executado um
número específico de vezes.
for (n = 0; n < 16; n++) 
{ 
 Acumulador_1 += medida_sensor1; 
 Delay(50); 
 Acumulador_2 += medida_sensor2; 
 Delay(50); 
}
WHILE
Estes são úteis quando o processador deve continuar repetindo o mesmo bloco de código até
que uma condição mude de verdadeiro (true) para falso (false).
while(CONVERSAO_COMPLETA == FALSE); 
{ 
 LED_ESTADO = !LED_ESTADO;
 Delay(100); 
}
FUNÇÕES
Um bom código em C é muito superior ao código em assembly em termos de organização e
legibilidade, e isso se deve em grande parte ao uso de funções, que são blocos de código que
podem ser facilmente incorporados em outras partes do código.
Uma função pode aceitar uma ou várias entradas e pode fornecer uma saída, chamada de
valor de retorno.
 ATENÇÃO
O uso de funções envolve alguma sobrecarga, portanto, temos que ter cuidado para não
sobrecarregar o processador com um número excessivo de chamadas de função, mas, em
geral, os benefícios das funções superam os custos.
Abaixo está um exemplo de uma função que possui três entradas numéricas e usa essas
entradas para gerar um valor de retorno tipo booleano, verdadeiro ou falso.
bool Em_Range(int ent, int NivelBaixo, int NivelAlto) 
{ 
 if(ent >= NivelBaixo && ent <= NivelAlto) 
 return TRUE; 
 else 
 return FALSE; 
}
SUPER LOOP OU LOOP INFINITO
Super loop pode ser considerada uma arquitetura de software, das mais simples, para sistemas
embarcados.
Essa abordagem é usada porque, ao programar sistemas embarcados, é muito importante
cumprir os prazos do sistema e concluir todas as tarefas principais do sistema em um tempo
razoável e na ordem certa.
Esta arquitetura de programa é muito útil para atender a esses requisitos e é composta por um
loop infinito, com todas as tarefas do sistema contidas nessa estrutura de loop.
As rotinas de inicialização são concluídas antes de entrar no super loop porque o sistema só
precisa ser inicializado uma vez. Depois que o loop infinito começa, as configurações não são
reiniciadas devido à necessidade de manter um estado persistente no sistema embarcado.
Em geral, você pode estabelecer um super loop com as instruções:
while(1)
while(TRUE)
for(;;)
ESTRUTURAS DE DADOS
Programas manipulam dados e, por isso, é conveniente que esses dados sejam armazenados
de forma que sua utilização se torne mais fácil e eficiente. É daí que surge o estudo das
Estruturas de Dados. O segredo de muitos programas rápidos está na maneira como seus
dados são organizados durante o processamento, ou seja, na estrutura de dados empregada
pelo programa.
Algumas estruturas de dados são:
VETORES OU ARRAYS
Um vetor é usado para armazenar uma coleção de dados, mas geralmente é mais útil pensar
em um vetor como uma coleção de variáveis do mesmo tipo, por exemplo:
int numero[100];
Um elemento específico em um vetor é acessado por um índice. Todos os vetores consistem
em locais de memória contíguos e o endereço mais baixo corresponde ao primeiro elemento e
o endereço mais alto ao último elemento.
MATRIZES
Matriz ou vetor bidimensional é, em essência, uma lista de vetores unidimensionais. Para
declarar uma matriz de tamanho x linhas e y colunas pode-se escrever algo da seguinte
maneira.
tipo matrizNome [x][y];
PONTEIROS
Os ponteiros são recursos poderosos de programação C e (C ++) que o diferencia de outras
linguagens de programação populares, como Java e Python e são usados para acessar a
memória e manipular endereços. Uma variável ponteiro armazena o endereço, em vez do valor.
Para declarar um ponteiro:
TipodeDado *nome_variavel_ponteiro; 
int *p;
A declaração acima define p como variável ponteiro do tipo int.
OPERADOR (&) E OPERADOR (*)
O operador & é chamado de operador de referência e fornece o endereço de uma variável. Da
mesma forma, existe outro operador que obtém o valor do endereço, ele é chamado de
operador de remoção de referência *.
O sinal * ao declarar um ponteiro não é um operador de referência. É apenas uma notação
semelhante que cria um ponteiro.
 EXEMPLO
int *pc, c;
Aqui, um ponteiro pc e uma variável c, ambos do tipo int, são criados, não são inicializados,
portanto, o ponteiro pc aponta para nenhum endereço ou um endereço aleatório e a variável c
contém um valor aleatório de lixo.
 
Imagem: Marcos Santana Farias
c = 22; 
Isso atribui 22 à variável c, isto é, 22 é armazenado na localização de memória da variável c.
 
Imagem: Marcos Santana Farias
pc = &c; 
Isso atribui o endereço da variável c ao ponteiro pc. O valor de pc é o mesmo que o endereço
de c, e o conteúdo do pc é 22 também.
 
Imagem: Marcos Santana Farias
*pc = 2; 
Isso altera o valor na localização da memória apontada pelo ponteiro pc para 2. Como o
endereço do ponteiro pc é o mesmo que o endereço de c, o valor de c também é alterado para
2.
 
Imagem: Marcos Santana Farias
A LINGUAGEM C E OS
MICROCONTROLADORES
No vídeo a seguir, serão apresentados os recursos da linguagem C que podem ser
empregados na programação dos microcontroladores.
VERIFICANDO O APRENDIZADO
1. QUAIS FATORES ABAIXO APROXIMAM A LINGUAGEM C DA
LINGUAGEM DE MONTAGEM NA IMPLEMENTAÇÃO DE SISTEMAS
EMBARCADOS? 
 
I – TAMANHO DE ARQUIVO COMPILADO 
II – DESEMPENHO 
III – PORTABILIDADE DE CÓDIGO 
IV – MANIPULAÇÃO DE BITS 
A) I e II estão corretas.
B) I, II e IV estão corretas.
C) I e III estão corretas.
D) II, III e IV estão corretas.
E) Todas estão corretas.
2. UM SOFTWARE EMBARCADO PRECISA CALCULAR O FATORIAL DE
UM NÚMERO N. O FATORIAL É REPRESENTADO POR N! E É IGUAL A 1 X
2 X 3 X .... X (N-1) X N. POR EXEMPLO: 
 
4! = 1 X 2 X 3 X 4 = 24
3! = 3 * 2 * 1 = 6 
2! = 2 * 1 = 2 
 
QUAL O LOOP FOR ABAIXO CALCULA CORRETAMENTE O FATORIAL DE
Y, CONSIDERANDO QUE Y É MAIOR OU IGUAL A 2 (Y ≥ 2) E QUE A
VARIÁVEL FATORIAL TEM O VALOR INICIAL NO PROGRAMA IGUAL A 1?
A)
for(i = y; i>=1 ; i--){ 
 fatorial = fatorial*i; 
 }
A)
B)
for(i = y; i>0 ; i++){ 
 fatorial = fatorial*i; 
 }
B)
C)
for(i = y; i>=0 ; i--){ 
 fatorial = fatorial*i; 
 }
C)
D)
for(i = y; i>=1 ; i++){ 
 fatorial = fatorial*i; 
 }
D)
E)
for(i = y; i>2 ; i--){ 
 fatorial = fatorial*i; 
 }
E)
GABARITO
1. Quais fatores abaixo aproximam a linguagem C da linguagem de montagem na
implementação de sistemas embarcados? 
 
I – Tamanho de arquivo compilado 
II – Desempenho 
III – Portabilidade de código 
IV – Manipulação de bits 
A alternativa "B " está correta.
 
A portabilidade é uma característica da linguagem C que permite, principalmente em sistemas
embarcados, o uso do código com poucas modificações para uso em outra arquitetura de
microcontrolador. Essa característica não está presente na linguagem de montagem, que é
única para cada arquitetura de microcontrolador.
2. Um software embarcado precisa calcular o fatorial de um número n. O fatorial é
representado por n! e é igual a 1 x 2 x 3 x .... x (n-1) x n. Por exemplo: 
 
4! = 1 x 2 x 3 x 4 = 24 
3! = 3 * 2 * 1 = 6 
2! = 2 * 1 = 2 
 
Qual o loop for abaixo calcula corretamente o fatorial de y, considerando que y é maior
ou igual a 2 (y ≥ 2) e que a variável fatorial tem o valor inicial no programa igual a 1?
A alternativa "A " está correta.
 
A estrutura de repetição for realiza iterações com base nos valores fornecidos. No caso do
cálculo do fatorial, como o valor y é o número fornecido, é preciso que ele seja decrementado
em uma unidade até alcançar 1 ou 2. A opção A é a única que realiza essa iteração de forma
correta.
MÓDULO 2
 Reconhecer as ferramentas de desenvolvimento de software para sistemas
embarcados
CONCEITO DE COMPILAÇÃO
C é uma linguagem de alto nível, considerada também de nível intermediário por alguns, que
precisa de um compilador para criar um código executável e para que o programa possa
funcionar em uma máquina. Mas, o que é a compilação?
A compilação é o processo de tradução do código-fonte escrito para um código de máquina,
um arquivo executável com códigobinário (.hex), no caso dos microcontroladores, e é
realizado pelo compilador.
Não existem muitas diferenças entre o processo de compilação em programas que rodam em
sistemas operacionais ou em um sistema embarcado. Porém, quando as ferramentas de
compilação são executadas no mesmo sistema que o programa que produzem, caso do
Windows ou Linux, elas podem fazer muitas suposições sobre o sistema. Normalmente, esse
não é o caso no desenvolvimento de software embarcado, em que as ferramentas de
compilação são executadas em um computador diferente da plataforma de destino.
Existem muitos passos que as ferramentas de desenvolvimento de software podem fazer
automaticamente quando a plataforma de destino está bem definida. Essa automação é
possível porque as ferramentas podem explorar recursos do hardware e do sistema
operacional no qual o programa será executado.
 EXEMPLO
Se todos os programas forem executados em computadores compatíveis com processadores
x86 que executam o Windows, seu compilador pode automatizar e, portanto, ocultar da sua
visão certos aspectos do processo de construção do software.
As ferramentas de desenvolvimento de software embarcado, por outro lado, raramente podem
fazer suposições sobre a plataforma de destino. Em vez disso, o usuário deve fornecer às
ferramentas parte de seu conhecimento do hardware, dando-lhes instruções mais explícitas.
Veja que estamos falando de compilação para programas que são executados diretamente no
hardware, sem ter nenhuma abstração subjacente, como sistemas operacionais. Isto é
chamado de programação bare metal. Geralmente, os programas bare metal terão um
carregamento (bootloader) mínimo para iniciar o processador, relógio e memória, antes de
saltar para o programa principal.
O processo de compilação, a conversão da representação do código-fonte do seu software
embarcado em uma imagem binária executável, pode ser sintetizado em três etapas distintas:
Cada um dos arquivos de origem é compilado ou montado em um arquivo-objeto.

Todos os arquivos-objeto que resultam da primeira etapa devem ser vinculados para produzir
um único arquivo-objeto, denominado programa relocável.

Os endereços de memória física devem ser atribuídos aos deslocamentos relativos dentro do
programa relocável em um processo denominado relocação.
O resultado é um arquivo contendo uma imagem binária executável que está pronta para ser
executada no sistema embarcado.
O processo de desenvolvimento de software embarcado é ilustrado na Figura 1. Cada uma
dessas ferramentas de desenvolvimento pega um ou mais arquivos como entrada e produz um
único arquivo de saída.
 
Imagem: Marcos Santana Farias.
 Figura 1 – Processo de compilação para software embarcado.
Cada uma das etapas do processo de construção de software embarcado é uma
transformação realizada por um software executado em um computador de uso geral. Para
distinguir o computador de desenvolvimento do sistema embarcado de destino, referimos o
primeiro como o computador host.
O compilador, montador, vinculador e localizador da Figura 1 são executados em um
computador host, e não no próprio sistema embarcado.
Ainda assim, essas ferramentas combinam seus esforços para produzir uma imagem binária
executável que será executada corretamente apenas no sistema embarcado de destino.
COMPILADOR E MONTADOR
Normalmente, chamamos de compilador a ferramenta que executa os passos mostrados na
Figura 1. Porém, mais precisamente, o compilador tem a função de traduzir programas escritos
em alguma linguagem de programação em um conjunto equivalente de códigos de operação
(opcodes) para um processador específico e são guardados em um arquivo-objeto. Nesse
sentido, um montador (assembler) também pode ser considerado como um tipo de compilador.
Mas, um compilador de linguagem de montagem realiza uma tradução um-para-um mais
simples, de uma linha de mnemônicos legíveis para o opcode equivalente. Juntas, essas duas
ferramentas constituem a primeira etapa do processo de construção do software embarcado.
MNEMÔNICOS
Os mnemônicos são símbolos que substituem os valores brutos dos opcodes. Por
exemplo, o mnemônico MOV R1 R2 representa um opcode que irá mover o conteúdo de
um registrador para outro.
Cada processador possui sua própria linguagem de máquina exclusiva, portanto, você precisa
escolher um compilador que produza programas para o processador específico.
No caso de sistemas embarcados, em que o compilador é executado no computador host
produzindo código para outra arquitetura de hardware, ele é chamado de cross-
compiler (Compilador cruzado) . O uso de um compilador cruzado é um dos recursos
definidores do desenvolvimento de software embarcado.
Os compiladores cruzados podem trabalhar com várias combinações de host-destino, rodando
em sistemas operacionais diversos e gerando código executável para várias famílias de
microcontroladores. Essas possíveis combinações variam bastante para cada modelo de
compilador. Mas, algo importante para o projetista é o fato de um modelo de compilador
permitir que ele gere código para famílias tão diferentes, como um 8051 de 8 bits, um MSP430
de 16 bits, ou um ARM de 32 bits, com poucas modificações de código. A não ser, é claro, as
modificações necessárias para acessar os periféricos específicos de cada família.
javascript:void(0)
 ATENÇÃO
Independentemente da linguagem de entrada (C, assembly ou qualquer outra), a saída do
compilador cruzado será um arquivo-objeto. Este é um arquivo binário especialmente
formatado, que contém o conjunto de instruções e dados resultantes do processo de tradução
da linguagem. Embora partes deste arquivo contenham código executável, o arquivo objeto
não pode ser executado diretamente.
O conteúdo de um arquivo-objeto pode ser considerado uma estrutura de dados muito grande
e flexível. A estrutura do arquivo é geralmente definida por um formato padrão, como o
Common Object File Format (COFF) ou o Executable and Linkable Format (ELF).
Se você for usar mais de um compilador, ou seja, se você vai escrever partes do seu programa
em diferentes linguagens de origem, você precisa se certificar de que cada compilador é capaz
de produzir arquivos-objeto no mesmo formato.
Alguns compiladores produzem arquivos-objeto apenas em formatos proprietários. Se você
estiver usando um dos compiladores do último grupo, poderá descobrir que precisa obter todas
as outras ferramentas de desenvolvimento do mesmo fornecedor.
VINCULADOR
Todos os arquivos-objeto resultantes da compilação na primeira etapa devem ser
combinados. Os próprios arquivos-objeto estão individualmente incompletos, principalmente
porque algumas das variáveis internas e referências de função ainda não foram resolvidas. O
trabalho do vinculador é combinar esses arquivos-objeto e, no processo, resolver todos os
símbolos não resolvidos.
A saída do vinculador é um novo arquivo-objeto que contém todo o código e dados dos
arquivos-objeto de entrada e está no mesmo formato.
Ele faz isso mesclando as seções de texto e de dados dos arquivos de entrada. Quando a
execução do vinculador for concluída, todo o código de linguagem de máquina de todos os
arquivos-objeto de entrada estará na seção de texto do novo arquivo e todas as variáveis
inicializadas e não inicializadas residirão nas novas seções de dados.
Enquanto o vinculador está no processo de mesclar o conteúdo da seção, ele também está
procurando por símbolos não resolvidos.
 EXEMPLO
Se um arquivo-objeto contém uma referência não resolvida a uma variável, e uma variável com
o mesmo nome é declarada em um dos outros arquivos-objeto, o vinculador irá combiná-las. A
referência não resolvida será substituída por uma referência à variável real.
Se o mesmo símbolo for declarado em mais de um arquivo de objeto, o vinculador não poderá
prosseguir. Provavelmente, exibirá uma mensagem de erro e sairá. Por outro lado, se uma
referência de símbolo permanecer não resolvida depois que todosos arquivos-objeto foram
mesclados, o vinculador tentará resolver a referência por conta própria.
A referência pode ser para uma função, como strlen, que faz parte da biblioteca C padrão.
Então, o vinculador irá abrir cada uma das bibliotecas descritas para ele na linha de comando,
na ordem fornecida, e examinar suas tabelas de símbolos. Se o vinculador descobrir uma
função ou variável com esse nome, a referência será resolvida, incluindo o código associado e
as seções de dados dentro do arquivo-objeto de saída.
As rotinas de biblioteca padrão do C, geralmente, requerem algumas alterações antes de
serem usadas em um programa embarcado. Um problema é que as bibliotecas padrão
fornecidas com a maioria dos conjuntos de ferramentas de desenvolvimento de software
chegam apenas na forma de objeto.
Depois de mesclar todas as seções de código e dados e resolver todas as referências de
símbolo, o vinculador produz um arquivo-objeto que é uma cópia especial “relocável” do
programa. Em outras palavras, o programa está completo, exceto por uma coisa: nenhum
endereço de memória foi ainda atribuído ao código e às seções de dados dentro dele. Se você
não estivesse trabalhando em um sistema embarcado, você teria terminado de construir
seu software agora.
Mas, os programadores de sistemas embarcados nem sempre terminam com o processo de
construção neste ponto. Os endereços dos símbolos no processo de vinculação são relativos.
Mesmo que seu sistema embarcado inclua um sistema operacional, você provavelmente ainda
precisará de uma imagem binária absolutamente localizada. Na verdade, se houver um sistema
operacional, o código e os dados em que ele consiste provavelmente também estarão no
programa realocável. Todo o aplicativo embarcado, incluindo o sistema operacional, é
frequentemente vinculado estaticamente e executado como uma única imagem binária.
LOCALIZADOR
É a ferramenta que realiza a conversão de programa relocável em imagem binária executável.
Ele assume a responsabilidade pela etapa mais fácil do processo de construção.
Na verdade, você mesmo deve fazer a maior parte do trabalho nesta etapa, fornecendo
informações sobre a memória na placa de destino como entrada para o localizador. O
localizador usa essas informações para atribuir endereços de memória física a cada uma das
seções de código e dados dentro do programa relocável. Em seguida, ele produz um arquivo
de saída que contém uma imagem de memória binária que pode ser carregada no destino.
Esta é uma etapa transparente em muitos processos de compilação de software embarcado.
AMBIENTES DE DESENVOLVIMENTO
No desenvolvimento moderno de software, os programadores possuem mais recursos do que
vimos no processo de compilação. Trabalhamos em um Integrated Development
Environment (Ambiente de Desenvolvimento Integrado) (IDE) que é um software que fornece
facilidades para o desenvolvimento, como editor de código-fonte, ferramentas de automação e
depurador.
A maioria dos IDEs para microcontroladores pode incorporar mais de um compilador e
montador, que deve ser escolhido pelo programador quando monta o projeto. Além disso, a
maioria dos IDEs possui recurso de autocompletar o código.
No geral, um IDE fornece todas as ferramentas necessárias em um único ambiente para tornar
o processo de desenvolvimento mais fácil.
Um IDE moderno também pode incluir ferramentas de:
depuração
cobertura de código
gerenciamento de versão
ferramentas automatizadas de ajuda e documentação
editores de recursos gráficos e outras.
Um bom exemplo é o IDE para microcontroladores PIC da Microchip, o MPLAB.
A versão mais recente, MPLAB X IDE possui um conjunto de ferramentas integradas para
todos os mais de 800 microcontroladores de 8, 16 e 32 bits, controladores de sinal digital
(dsPIC) e dispositivos de memória da Microchip. Inclui um editor, gerenciador de projeto,
simulador de software, além de suportar ferramentas de hardware populares da Microchip,
como depuradores em circuito e programadores de chip. Baseado na plataforma NetBeans de
código aberto, MPLAB X pode ser executado em:
Windows
MAC
Linux
O MPLAB inclui um montador para PIC, onde a linguagem de montagem pode ser usada para
programar o microcontrolador. Mas, para melhor rendimento e mais rapidez na conclusão de
projetos, pode-se integrar compiladores C que estão disponíveis como MikroC, MPLAB XC8,
C-Tech C, além do compilador CCS C.
CCS é uma empresa de soluções para microcontroladores PIC. O CCS (Custom Computer
Services) C foi um dos primeiros e é um dos melhores compiladores para iniciantes, pois inclui
bibliotecas integradas que permitem programar um microcontrolador PIC sem profundo
conhecimento de sua arquitetura.
TESTES COM DEPURADORES
 
Imagem: Shutterstock.com
Normalmente, um programa complexo não funciona exatamente da maneira como foi
imaginado, e os “bugs” precisam ser removidos para obter resultados adequados. O depurador
permite que se veja os “zeros e uns” executados, relacionados ao código-fonte escrito, com os
símbolos e nomes das funções do seu programa. A depuração permite que se experimente o
código para ver o valor das variáveis em vários pontos do programa e para fazer verificações,
alterando os valores das variáveis e percorrendo as rotinas. Mas nem sempre se possui uma
ferramenta de depuração integrada, o que conduz a soluções alternativas para testar o código.
Para desenvolver e depurar aplicativos embutidos sem uma ferramenta especial, é preciso uma
maneira de baixar o programa para o microcontrolador, método utilizado nos primórdios da
programação de microcontroladores. Ferramentas de depuração eram raras e, para novas
arquiteturas, muitas vezes inexistentes. Em consequência, o programa era frequentemente
desenvolvido, gravado em uma EPROM e testado no hardware de destino.
Atualmente, com a existência de kits de desenvolvimento de baixo custo e microcontroladores
com memória de programa flash, podendo ser regravada milhares de vezes, a depuração
diretamente na placa continua sendo muito usada.
A depuração, inevitável em aplicações complexas, pode ser feita com equipamentos de
medição externos, como analisadores lógicos, ou realizada através do uso mais ou menos
criativo dos elementos de saída no microcontrolador. Por exemplo, ligados às portas podem
existir alguns LEDs para a saída de estados, que podem ser usados para a saída de
depuração durante a fase de testes. Através deles o desenvolvedor visualiza o fluxo do
programa, indicando se o programa atingiu, e em que ordem atingiu, determinadas funções ou
endereços de memória.
Soluções de depuração de código usando simuladores também se popularizaram nos últimos
anos. Estas ferramentas têm se tornado bem fiéis ao modelo físico das placas e permitem
testes do código antes da aquisição, diminuindo o tempo de desenvolvimento e os custos.
AMBIENTES DE DESENVOLVIMENTO PARA
MICROCONTROLADORES
No vídeo a seguir, serão apresentados o processo de compilação para microcontroladores,
comparando-o com o processo utilizado para programas gerais, e também, os ambientes de
desenvolvimento (IDEs) para microcontroladores.
VERIFICANDO O APRENDIZADO
1. QUAL O MÍNIMO DE RECURSOS PARA UM SOFTWARE SER
CONSIDERADO UM IDE (AMBIENTE DE DESENVOLVIMENTO
INTEGRADO) PARA DESENVOLVIMENTO DE APLICAÇÕES
EMBARCADAS EM UM MICROCONTROLADOR?
A) Pelo menos um editor de texto, gerenciamento de projeto e ferramenta de compilação.
B) Pelo menos um compilador.
C) Pelo menos um editor de texto e gerenciamento de projeto.
D) Pelo menos um gerenciamento de projeto.
E) Pelo menos um editor de texto e compilador.
2. QUAL É A SEQUÊNCIA DO PROCESSO DE COMPILAÇÃO DE
SOFTWARE EMBARCADO?
A) Compilação – Vinculação – Localização
B) Compilação – Montagem – Localização
C) Montagem – Localização – Vinculação
D) Vinculação – Compilação – Localização
E) Montagem – Compilação – Localização
GABARITO
1. Qual o mínimo de recursos para um software ser considerado um IDE (Ambiente de
DesenvolvimentoIntegrado) para desenvolvimento de aplicações embarcadas em um
microcontrolador?
A alternativa "A " está correta.
 
IDEs devem, minimamente, reunir os arquivos fontes em um gerenciador de projeto, permitir a
edição dos mesmos e realizar a compilação de todos os arquivos fontes para gerar um
executável para o microcontrolador.
2. Qual é a sequência do processo de compilação de software embarcado?
A alternativa "A " está correta.
 
A compilação e/ou a montagem é o primeiro passo para a criação do código executável por um
microcontrolador. A vinculação, em seguida, permite a ligação dos diversos códigos-fonte e
bibliotecas em um arquivo-objeto, que ao final ainda deve ter atribuído pelo localizador os
endereços de memória física a cada uma das seções de código e dados.
MÓDULO 3
 Aplicar as principais funções do módulo simulador da plataforma Arduino e circuitos
eletrônicos da ferramenta Tinkercad
Existem vários métodos eficazes para uma melhor aprendizagem em programação. O
verdadeiro desafio é saber combinar esses métodos para a aprendizagem ser mais eficaz com
um caminho mais rápido para a aquisição do conhecimento. No caso da programação de
sistemas embarcados, o processo de aprendizagem mais desejável é aquele em constante
otimização, mantendo uma boa proporção entre o tempo gasto e o conhecimento adquirido.
Uma ferramenta que está se tornando uma parte substancial nos ambientes de
desenvolvimento para trabalho com microcontroladores são os simuladores. Estas ferramentas
permitem simular um determinado cenário de projeto, a fim de praticar diferentes ações e
respostas que são necessárias em uma situação semelhante em um projeto real.
 COMENTÁRIO
Transformando a teoria em projeto real, você pode aplicar o conhecimento que possui sobre a
situação e transformá-lo em ações em tempo real. Portanto, esse processo é altamente eficaz
para a retenção do conhecimento. As simulações são uma ferramenta comprovada para
melhorar a aprendizagem e também criar um ambiente positivo que incentive a experimentação
e aceite erros, algo muito importante no contexto da aprendizagem.
SIMULADOR DE CIRCUITOS TINKERCAD
No mundo da modelagem 3D, o Tinkercad se estabeleceu como uma introdução valiosa ao
projeto auxiliado por computador (CAD). É um programa gratuito e intuitivo, baseado na web,
que qualquer pessoa pode usar. O módulo de simulação de circuitos eletrônicos surpreendeu
pelas possibilidades que trouxe de testar sensores e atuadores. Esse módulo trouxe um lado
totalmente novo para o Tinkercad, girando em torno da simulação de circuitos eletrônicos com
a placa Arduino Uno.
O processo usado no Tinkercad pode ser referido como prototipagem rápida. A prototipagem é
um processo em que podemos desenvolver componentes de uma maneira flexível, que podem
ser rapidamente atualizados e modificados para testar uma variedade de opções ao
desenvolver um projeto ou produto.
COMO ACESSAR O TINKERCAD
1
Acesse o site e crie uma conta gratuita.
Após fazer login, acesse o lado esquerdo da página e clique na opção de menu de circuitos.
2
3
Clique em criar para construir um novo circuito. Um projeto de circuito inclui uma variedade de
componentes eletrônicos, como LEDs, botões, resistores, sensores diversos, motores e fonte
de alimentação, além da placa Arduino Uno. Os componentes disponíveis estão no painel à
direita da página.
A área aberta no centro é a área de construção do circuito, onde você projeta sua criação.
4
5
A barra de ferramentas superior, começando à esquerda, fornece as operações gerais para
girar, excluir e até mesmo fazer anotações sobre os diferentes componentes. Uma
característica interessante é que, além de exportar e compartilhar seu trabalho, você pode
baixar a lista de componentes. Isso torna mais fácil trazer suas criações para o mundo real.
PLATAFORMA ARDUINO
 VOCÊ SABIA
Criada em 2005 por um grupo de pesquisadores italianos, a plataforma tinha o objetivo de
disponibilizar um dispositivo barato e fácil de programar, sendo, dessa forma, acessível a
estudantes e projetistas amadores. Com o conceito de hardware livre, a ideia é de que
qualquer um pode montar, modificar e personalizar as placas Arduino a partir do hardware
básico. A plataforma se popularizou e ganhou seguidores e desenvolvedores que
disponibilizam inúmeros recursos de hardware e bibliotecas para a programação.
O modelo mais popular, Arduino Uno R3, é uma placa baseada no microcontrolador
ATmega328 da Atmel. Possui 14 pinos de entrada/saída digital, 6 entradas analógicas (usadas
para medir tensão, de sensores, por exemplo), um cristal oscilador de 16MHz, uma conexão
USB, uma entrada de alimentação e um botão de reset.
A ideia de disponibilizar placas de baixo custo para popularizar o uso de seus
microcontroladores foi seguida por outros fabricantes, como Texas Instruments (LaunchPads
MSP430), Microchip (família PIC) e outros.
A programação facilitada na plataforma Arduino é um dos motivos para a grande adoção. O
motivo da programação facilitada não é pela linguagem de programação C, que é a mesma
usada por outras plataformas, mas pela grande quantidade de código disponível para várias
funcionalidades. A IDE do Arduino é repleta de bibliotecas com funções para programar as
placas Arduino e facilitar a integração de periféricos (shields) que são acoplados à placa, como
mostrado na Figura 2.
 
Imagem: Arduino-uno-perspective / JotaCartas / CC BY 2.0... Adaptada por Marcos Santana
Farias
 Figura 2 – Placa com microcontrolador e dispositivos que podem ser acoplados.
Vejamos uma descrição das partes que compõem uma placa Arduino Uno, mostrado na Figura
3.
 
Imagem: Marcos Santana Farias.
 Figura 3 – Placa Arduino Uno.
CONEXÃO USB
É usada para alimentação elétrica e para carregar o código na placa Arduino. A IDE do
Arduino, quando reconhece uma placa acoplada ao computador, permite fazer o
descarregamento do código compilado na mesma.
PINOS (5V, 3.3V, GND, ANALÓGICO, DIGITAL, PWM,
AREF)
Os pinos Arduino Uno são os lugares onde você conecta os fios para construir um circuito.
Geralmente, possuem receptáculos de plástico preto que permitem que conecte um fio direto
na placa. O modelo Uno tem vários tipos de pinos, cada um rotulado na placa e usado para
diferentes funções.
GND
Abreviação de Ground. Existem vários pinos GND no Arduino Uno, que podem ser usados para
aterrar o circuito.
5V e 3.3V
Fica claro que o pino de 5V fornece 5 volts de energia, e o pino de 3,3V fornece 3,3 volts de
energia, que são a voltagem da maioria dos componentes simples usados com o Arduino Uno.
Analógico
A área dos pinos sob a etiqueta "Analog In" (A0 até A5 na UNO) são pinos de entrada
analógica. Esses pinos podem ler o sinal de um sensor analógico (como um sensor de
temperatura) e convertê-lo em um valor digital que podemos ler e usar no programa.
Digital
Em frente aos pinos analógicos estão os pinos digitais (0 a 13 na UNO). Esses pinos podem
ser usados tanto para entrada digital (como dizer se um botão é pressionado) quanto para
saída digital (como alimentar um LED).
PWM
Você deve ter notado o til (~) ao lado de alguns dos pinos digitais (3, 5, 6, 9, 10 e 11 no UNO).
Esses pinos funcionam como pinos digitais normais, mas também podem ser usados para algo
chamado PWM (Pulse Width Modulation), modulação por largura de pulso.
AREF
Representa a referência analógica. Na maioria das vezes, você pode deixar este pino
desligado. Às vezes, é usado para definir uma tensão de referência externa (entre 0 e 5 volts)
como o limite superior para os pinos de entrada analógica.
BOTÃO VERMELHO DE RESET
Apertar esse botão irá conectar temporariamente o pino de reset ao terra e reiniciar qualquer
código que esteja carregado no Arduino.
LED INDICADOR DE ENERGIA
Há um LED ao lado da palavra "ON" (11) que deve acender quando você conectar o Arduino
Uno a uma fonte de energia.
LEDS TX, RX E L
TX é a abreviação de transmitir e RX de receber, que são pinos responsáveispela
comunicação serial. No nosso caso, existem dois lugares no Arduino UNO, onde TX e RX
aparecem ‒ uma vez pelos pinos digitais 0 e 1, e uma segunda vez ao lado dos LEDs
indicadores TX e RX (12), que darão indicações visuais sempre que o Arduino estiver
recebendo ou transmitindo dados. O led L, logo acima destes, está ligado ao pino 13 e é usado
para programas de teste iniciais.
CIRCUITO INTEGRADO PRINCIPAL
O Circuito Integrado é o microcontrolador ATmega328, microcontrolador do Arduino Uno.
REGULADOR DE TENSÃO
Não é algo que se possa interagir no Arduino, mas é potencialmente útil saber que está lá e
para o que serve. O regulador de tensão faz exatamente o que diz – controla a quantidade de
tensão que é colocada na placa do Arduino. Ele irá afastar uma tensão extra que pode
prejudicar o circuito. Claro, ele tem seus limites, por isso não conecte o Arduino a algo maior
que 20 volts.
PROGRAMANDO O ARDUINO
No ambiente de programação para Arduino, um programa, chamado de sketch, apresenta duas
funções básicas:
Função setup()
É chamada função setup() quando um programa começa a executar. É usada para inicializar
as variáveis, os tipos dos pinos, declarar o uso de bibliotecas, entre outros. Esta função será
executada apenas uma vez após a placa Arduino ser ligada ou reiniciada.

Função loop()
Após a função setup(), a função loop() executa sempre o mesmo bloco de código,
continuamente em um loop infinito, permitindo ao programa fazer mudanças e responder às
interações com o exterior da placa.
No Arduino Uno os 14 pinos digitais podem ser utilizados como uma entrada ou uma saída,
utilizando-se as funções pinMode(), digitalWrite(), e digitalRead(). Eles operam a 5V e há um
LED integrado ao pino digital 13. Quando este pino está no valor HIGH este LED está aceso,
quando o pino está em LOW, está apagado. O programa abaixo estabelece o piscar deste LED
a cada segundo.
void setup() 
{ 
 pinMode(13, OUTPUT); // Configura o pino 13 como saída 
} 
void loop() 
{ 
 digitalWrite(13, HIGH); // Configura o pino 13 como HIGH 
 delay(1000); // Espera 1000ms (1 segundo) 
 digitalWrite(13, LOW); // Configura o pino 13 como LOW 
 delay(1000); // Espera 1000ms (1 segundo) 
}
MONTAGEM DE CIRCUITOS NO
TINKERCAD
Os componentes são normalmente montados usando uma placa de ensaio ou protoboard, que
é um pedaço de plástico que tem vários orifícios, utilizados para conter diferentes
componentes.
 
Imagem: Shutterstock.com
Ao acessar a ferramenta Tinkercad, encontre o componente da placa de ensaio e clique nele
uma vez. A protoboard será selecionada e temporariamente anexada ao ponteiro do mouse.

Mova o ponteiro do mouse na área de trabalho e clique com o botão do mouse para colocar a
protoboard na área de trabalho. O protoboard pode parecer muito pequeno ou muito grande na
área de trabalho.

Clique no zoom para ajustar o botão para que a placa de ensaio fique centralizada e ampliada.
O protoboard tem uma grade de trinta por dez orifícios na área principal. As linhas são
numeradas de 1 a 30 e as colunas são rotuladas com as letras de A a J. As colunas A a E são
separadas das colunas F através de J por um pedaço de plástico, como mostrado na Figura 4.
 
Imagem: Marcos Santana Farias.
 Figura 4 – Protoboard na plataforma Tinkercad.
As bordas da protoboard contêm duas colunas com o mesmo número de linhas. Essas colunas
possuem símbolos negativos e positivos, como mostrado na Figura 5. Essas colunas e orifícios
são usados para a fonte de energia. Os componentes no centro do protoboard podem se ligar
nessas colunas para receber alimentação de energia.
 
Imagem: Marcos Santana Farias.
 Figura 5 – Linhas de alimentação no protoboard na plataforma Tinkercad.
Mova o ponteiro do mouse sobre um dos orifícios na parte central da placa. O orifício abaixo
será identificado com um quadrado vermelho e uma borda preta, como visto na Figura 5. Os
outros orifícios serão identificados com círculos verdes, que indicam que cada orifício na linha
está conectado a cada um dos outros orifícios na linha. Há uma ligação entre qualquer conexão
dentro da mesma linha.
Os testes mais simples com circuitos no Tinkercad podem utilizar LEDs, botões de pressão
(pushbutton) e potenciômetros. O LED é um diodo emissor de luz (Light Emitting Diode) que
possui conexões que o tornam diferente de uma lâmpada normal. Um LED tem uma conexão
chamada catodo e outra chamado de anodo. O anodo é maior do que o catodo, como
mostrado na Figura 6. Esta distinção é importante porque o anodo deve ser conectado à
extremidade positiva de um circuito elétrico. A corrente flui em apenas uma direção através de
um LED. O LED, como os demais dispositivos no Tinkercad, pode ser inserido nos orifícios do
protoboard ou de terminais da placa Arduino.
 
Imagem: Marcos Santana Farias.
 Figura 6 – LED na plataforma Tinkercad.
O pushbutton é um botão de pressão para conexão temporária. Clicar com o botão do mouse
em seu computador sobre o pushbutton, no círculo central, irá simular o apertar do botão de
pressão e o fechamento do circuito (Figura 7). Existem quatro conectores no botão de pressão
e um conector em cada canto do botão. Olhando dentro do botão logo abaixo da tampa, temos
que os conectores esquerdo e direito são na verdade dois fios ligados, um fio de cada lado do
botão. Portanto, pode-se fazer a ligação para a conexão temporária usando os lados direito e
esquerdo.
 
Imagem: Marcos Santana Farias.
 Figura 7 – Pushbutton na plataforma Tinkercad.
O potenciômetro é um dispositivo com três conectores com um botão que gira (Figura 8), que é
usado para variar a quantidade de tensão elétrica que flui através do potenciômetro e enviada
para um circuito. Os potenciômetros são usados como controles de volume em equipamentos
de áudio e geralmente não lidam com muita tensão. Dentro do potenciômetro está um material
resistivo onde uma extremidade do circuito é conectada. A quantidade de resistência aplicada à
corrente muda quando o botão é girado.
 
Imagem: Marcos Santana Farias.
 Figura 8 – Potenciômetro na plataforma Tinkercad.
MONTAGEM COM ARDUINO NO TINKERCAD
Para realizar uma montagem com Arduino no Tinkercad, encontre a placa Arduino Uno e
coloque na área central da página. Os orifícios ao longo de ambos os lados da placa são
chamados os pinos de Entrada/Saída. Cada um é um conector que pode ser conectado a uma
protoboard ou diretamente a algum componente com um fio e a maioria deles está marcada
com um número que são usados para identificar os pinos no código que escrevemos. Para
controlar um LED no pino 13, por exemplo, podemos ligar este a placa conforme a Figura 9.
 
Imagem: Marcos Santana Farias.
 Figura 9 – Ligação de LED na plataforma Tinkercad.
No painel de componentes dos circuitos do Tinkercad, arraste um resistor e um LED para o
plano de trabalho. As pernas do LED são conectadas a dois pinos no Arduino: terra e pino 13.
O componente entre o LED e o pino 13 é um resistor, que ajuda a limitar a corrente para evitar
que o LED se queime. Sem ele, você receberá um aviso de que o LED pode queimar em
breve. Não importa se o resistor vem antes ou depois do LED no circuito, ou para que lado ele
vai. As listras coloridas identificam o valor do resistor e, para este circuito, qualquer valor de
100 ohms a 1000 ohms funcionará muito bem.
O LED, como vimos, é polarizado, o que significa que só funciona quando as pernas estão
conectadas de determinada maneira.
PERNA POSITIVA
Também é chamada de anodo, geralmente tem uma perna mais longa e é ligada à energia,
neste caso vindo do pino de saída do Arduino.

PERNA NEGATIVA
Também é chamada catodo, com sua perna mais curta, se conecta ao GND. GND é o conector
de aterramento ou o terminal negativo em nosso circuito.
Uma placa Arduino física está conectada a uma fonte de alimentação de cinco volts de uma
porta USB de computador ou de uma bateria. O próprio Arduino pode forneceros mesmos 5
volts aos nossos componentes.
Tendo uma placa programável no plano de trabalho do Tinkercad, habilita-se a opção CÓDIGO
(CODE) no menu superior direito. Clicando neste botão, você pode editar o código em modo de
blocos ou texto. Escolhendo texto, você verá o código para piscar o LED no pino 13, como
reproduzido abaixo:
void setup ( ) 
{ 
pinMode(13, OUTPUT) ; 
} 
 
void loop( ) 
{ 
digitalWrite(13, HIGH) ; 
delay(1000); // Wait for 1000 millisecond(s) 
digitalWrite(13, LOW) ; 
delay (1000); // Wait for 1000 millisecond(s) 
} 
Clicando em Iniciar Simulação, será possível observar os dois LEDs, o da placa e o ligado
externamente, piscando em intervalo de um segundo.
SIMULADORES E EMULADORES
Um emulador é uma peça de hardware que se comporta idealmente exatamente como o chip
microcontrolador real, com todas as suas funcionalidades integradas. É considerada a
ferramenta de depuração mais poderosa de todas. As funções de um microcontrolador são
emuladas em tempo real e não intrusivamente. Mas, pelo custo envolvido, muitos
desenvolvedores estão substituindo os emuladores por simuladores.
Podemos concordar que você provavelmente pode criar, testar e depurar seus aplicativos
embarcados sem um simulador ou emulador. No entanto, há vários motivos pelos quais um
simulador pode tornar suas tarefas de projeto mais fáceis e economizar muito tempo de
desenvolvimento.
Com o simulador, gasta-se menos tempo depurando erros simples do programa e permite que
aprendamos coisas como periféricos no chip e modos de endereçamento sem projetar
hardware real.
A experiência mostra que os projetistas que possuem um simulador precisam de menos
suporte técnico e podem se familiarizar com as ferramentas mais rapidamente, além de tornar
mais fácil escrever e testar códigos e aprender como programar seu microcontrolador.
É mais fácil descobrir se um problema está no hardware ou software quando você usa um
simulador.
O simulador não requer tempo de configuração.
O simulador não substitui um emulador.
O simulador é totalmente diferente de um emulador:
Emulador
Permite depurar software em execução em seu hardware de destino.

Simulador
Permite depurar seu software, bem como sua compreensão do microcontrolador e da
linguagem de programação. Não há efeitos de depuração em tempo real em um simulador.
Ao final, o desenvolvimento de software para os microcontroladores incorporados de hoje pode
ser uma tarefa assustadora sem ferramentas de desenvolvimento adequadas. As ferramentas
de baixo custo para depuração, como os simuladores, mesmo que ainda em pequeno número,
podem vir a contribuir muito para facilitar esses testes de desenvolvimento.
SIMULADOR TINKERCAD
No vídeo a seguir, será apresentado o Simulador Tinkercad, mostrando todas as etapas
necessárias para se criar um projeto neste simulador.
VERIFICANDO O APRENDIZADO
1. SE VOCÊ TEM UM LED LIGADO AO PINO 3 DE UMA PLACA ARDUINO
UNO, QUAIS COMANDOS SÃO NECESSÁRIOS NO PROGRAMA PARA
ACENDER ESTE LED?
A) pinMode(3, OUTPUT) e digitalWrite(3, HIGH)
B) pinMode(3, HiGH) somente
C) AnalogWrite(3, HIGH) somente
D) pinMode(3, OUTPUT) e analogWrite(3, HIGH)
E) pinMode(3, INPUT) e digitalWrite(3, HIGH)
2. O MÓDULO DA FERRAMENTA TINKERCAD PARA SIMULADOR DE
CIRCUITOS COM ARDUINO PERMITE: 
 
I – SIMULAR O CONSUMO DO ARDUINO. 
II – SIMULAR O PROGRAMA EMBARCADO NO ARDUINO. 
III – SIMULAR O RECEBIMENTO DE DADOS PELO ARDUINO. 
IV – SIMULAR A ATUAÇÃO DO ARDUINO EM DISPOSITIVOS EXTERNOS. 
 
QUAIS AS OPÇÕES ESTÃO CORRETAS?
A) I, II e IV
B) I, III e IV
C) II e IV
D) II, III e IV
E) Somente a II
GABARITO
1. Se você tem um LED ligado ao pino 3 de uma placa Arduino UNO, quais comandos
são necessários no programa para acender este LED?
A alternativa "A " está correta.
 
A função pinMode() possui como parâmetros o pino em que deve atuar e a configuração deste
pino. O parâmetro OUTPUT põe o pino 3 no modo de saída de sinal digital. A função para
acender o LED deve ser a que escreve o valor digital lógico alto neste pino. No caso, a função
digitalWrite(3, HIGH), que indica a escrita no pino 3 de um valor lógico alto com o parâmetro
HIGH.
2. O módulo da ferramenta Tinkercad para simulador de circuitos com Arduino permite: 
 
I – Simular o consumo do Arduino. 
II – Simular o programa embarcado no Arduino. 
III – Simular o recebimento de dados pelo Arduino. 
IV – Simular a atuação do Arduino em dispositivos externos. 
 
Quais as opções estão corretas?
A alternativa "D " está correta.
 
O módulo simulador de Arduino do Tinkercad permite simular o programa embarcado e as
interações de entrada e saída da placa Arduino Uno. O consumo da placa não faz parte das
opções de simulação.
MÓDULO 4
 Identificar as características da ferramenta de simulação PICSimLab para
microcontroladores PIC
Quando trabalhamos com simuladores que rodam online em uma página web, como o
Tinkercad, temos uma grande facilidade em realizar testes com nossos códigos, atuando
também com dispositivos externos, como sensores, mostradores e atuadores. Sabemos que
pegando o código criado no simulador e trazendo para a IDE do Arduino, estamos muito
próximos de implementar nosso projeto. Porém, de fato não estamos, durante a utilização do
simulador, utilizando a IDE que realmente desenvolve o produto final. Mesmo que esse passo
seja trivial, um passo a mais no aprendizado terá que ser dado.
O simulador que veremos tem a vantagem de exigir o uso das mesmas ferramentas
profissionais que seriam usadas no desenvolvimento de um projeto com microcontroladores
PIC.
O PICSimLab necessita ser carregado com o mesmo arquivo executável (.hex) que você usaria
para carregar em uma placa real com microcontrolador PIC. Dessa forma, antes de usar o
simulador, você precisa aprender a programar em uma IDE profissional, usando um compilador
profissional, como fará quando for desenvolver projetos para o mercado.
PICSIMLAB
A simulação tem grande importância no campo da aplicação de sistemas microcontrolados,
onde profissionais e estudantes podem verificar seus modelos, códigos e testar provas de
conceito antes de aplicar para o desenvolvimento em uma placa eletrônica.
O PICSimLab (PIC Simulator Laboratory) permite realizar esses testes com um
microcontrolador muito difundido em projetos de sistemas embarcados profissionais, com
grande exigência em confiabilidade, os microcontroladores da família PIC da Microchip.
 VOCÊ SABIA
O PICSimLab foi desenvolvido pelo professor Luis Claudio Gambôa Lopes do CEFET/MG.
Inicialmente suportando apenas uma placa de desenvolvimento com o PIC16F628A, a versão
atual pode simular 5 placas com vários periféricos e vários microcontroladores PIC, como o
PIC18F4550. Esta versão integra também uma placa Arduino Uno.
Como mencionado, antes de simular o seu código em uma das placas disponíveis no
PICSimLab, é necessário gerar o arquivo executável em uma IDE para PIC, como a MPLAB X
IDE, do mesmo fabricante dos microcontroladores PIC (Microchip), utilizando um compilador
integrado, que para PIC pode ser CCS C.
A escolha do compilador irá definir as bibliotecas de funções e diretivas para configurar o
microcontrolador PIC.
Mesmo usando a mesma linguagem C, diferentes compiladores usarão a sua própria biblioteca
de funções e diretivas, o que irá modificar uma chamada de função para escrever em um
mostrador LCD, por exemplo. Portanto, é importante entender os passos para gerar um arquivo
executável para PIC com essas ferramentas.
GERANDO CÓDIGO EXECUTÁVEL NO
MPLAB X IDE
Com os programas MPLAB X IDE e CCS C instalados, os passos para geração de um
executável para PIC são:
1
Criar um projeto no MPLAB. Nas janelas que se abrem para a seleção das configurações do
projeto, escolher um nome e o microcontrolador PIC16F628A. Deixar os demais valores com o
padrão, com exceção da janela onde se solicita a escolha do compilador a ser usado, onde
deve-se escolher o CCS C.
Com o projeto criado, abre-se um conjuntode pastas na lateral esquerda do ambiente MPLAB.
Na pasta Source Files podemos criar arquivos-fonte para o nosso projeto. Clicando com o
botão direito nesta pasta, deve-se escolher C Source File. Será solicitado um nome para este
arquivo, que será o arquivo-fonte do projeto.
2
3
Na área central do ambiente MPLAB abre-se o arquivo-fonte que foi criado. Neste, pode-se
digitar o programa em linguagem C que irá ser executado no PICSimLab. Um programa
simples pode ser usado como teste, por exemplo:
#include <16F628A.h> 
#fuses XT 
#use delay( clock=4MHz ) 
 
void main () { 
 while (1) { 
 output_high(PIN_B0); 
 delay_ms(1000); 
 output_low(PIN_B0); 
 delay_ms(1000); 
 } 
}
Este programa executa a tarefa clássica na iniciação de estudos com microcontroladores, o
piscar um LED ligado a um pino, como fizemos no Arduino com o simulador Tinkercad. O
esquema dado na Figura 10 exemplifica as ligações esperadas por este programa. Neste
esquema, além do LED ligado ao pino 6, temos o cristal oscilador (XT) que será usado para
sincronizar a execução do programa. Vamos examinar as instruções deste programa.
 
Imagem: Web Designer
 Figura 10 – Esquema de ligação do circuito.
1
#INCLUDE < 16F628A.H >
Definições do microcontrolador modelo PIC16F628A. Incluindo este arquivo, é possível usar as
diretivas e funções que são descritas abaixo, como #fuses, output_high e PIN_B0, escrevendo
com essas nos registradores corretos do microcontrolador.
#FUSES XT
Os fuses são bits de configuração. No projeto de software embutido existem algumas
configurações para cada microcontrolador usado no projeto, como o tipo de oscilador
interno/externo, se será usado um cronômetro de monitoramento ou não (watchdog), se haverá
um pino de reinicialização ou não, e assim por diante. Essas configurações são controladas por
meio de registradores específicos. Neste exemplo, o parâmetro XT determina que será usado
um cristal externo para se determinar o clock do programa, o valor do oscilador para o
sincronismo do programa. O valor deste deve ser determinado pela diretiva #use delay.
2
4
#USE DELAY( CLOCK=4MHZ)
Onde se instrui o compilador a usar uma função delay (atraso) com clock de 4MHz.
VOID MAIN ()
Função principal.
5
6
WHILE (1)
Como já vimos, esta estrutura é essencial para programas embarcados em microcontroladores,
que é empregada para garantir que o programa será executado de forma repetida, em loop
infinito. Também poderia ser usado o parâmetro TRUE, pois no arquivo de definições
16F628A.h o valor 1 é atribuído a constante TRUE.
OUTPUT_HIGH (PIN_B0) E OUTPUT_LOW (PIN_B0)
Respectivamente, atribui um valor lógico alto e baixo no pino de nome RB0 (pino 6 da Figura
11). No arquivo de definições 16F628A.h o valor PIN_BO é atribuído ao registrador que guarda
o valor no pino de nome RB0 do PIC.
7
8
DELAY_MS(1000)
Estabelece um atraso na execução da próxima instrução, no caso no valor de 1000ms (1
segundo). Isto irá permitir o efeito de apagar e acender o LED ligado ao pino RB0 com este
intervalo.
Clicando no botão para compilar no MPLAB, um arquivo com extensão .hex será gerado caso o
compilador CCS C não detecte erros ou inconsistências no programa. Este arquivo pode ser
usado para programar uma placa no simulador PICSimLab. Pode-se, então, abrir o simulador e
no menu Board escolher McLab1, uma placa que trabalha com o microcontrolador
PIC16F628A. Com a placa selecionada, conforme a Figura 11, deve-se carregar o arquivo .hex
gerado no menu File -> Load HEX. Você verá o LED correspondente piscando e poderá alterar
o código no MPLAB, diminuindo o valor para a função delay_ms(), por exemplo, recompilando
o programa e recarregando o arquivo .hex no PICSimLab.
 
Imagem: Captura de tela do PICSimLab.
 Figura 11 – Placa McLab1 do simulador PICSimLab.
MICROCONTROLADORES PIC E PLACAS
DO PICSIMLAB
Para utilizar a placa McLab1 e outras placas do simulador PICSimLab, é essencial que
conheçamos as características destas placas e dos microcontroladores PIC usados nestas
placas. Os microcontroladores PIC (Peripheral Interface Controller) são muito populares e um
dos mais selecionados por projetistas. A família PIC pode se dividir em tipos de 8 bits, 16 bits e
32 bits, conforme ilustrado na Figura 12.
 
Fonte: Marcos Santana Farias.
 Figura 12 – Família básica de microcontroladores PIC.
MICROCONTROLADOR PIC16F628A
Este é o microcontrolador presente na placa McLab1 do PICSimLab, que faz parte de uma
subfamília, que inclui também os modelos PIC16F627A e PIC16F648A. Os microcontroladores
PIC seguem as características da arquitetura RISC (Reduced Instruction Set Computer) com
instruções reduzidas (35 instruções em assembly). Utiliza a arquitetura Harvard, na qual o
programa e os dados são acessados em memórias separadas, utilizando barramentos
separados, melhorando a largura da banda, comparado à arquitetura von Neumann, na qual o
programa e os dados são acessados em uma mesma memória. Apesar de ser de 8 bits, as
instruções possuem largura de 14 bits, que podem ser buscadas em um ciclo único, com o uso
de um barramento de 14 bits para acesso à memória.
O PIC16F628A contém uma Unidade Lógica Aritmética (ALU) e um registrador de trabalho de 8
bits. A ALU é uma unidade aritmética de propósito genérico e tem capacidade de executar
operações de adição, deslocamento e subtração, bem como operações lógicas. Possui
memória de dados não volátil EEPROM de 128 x 8, além da RAM de 224 x 8. A memória de
programa é do tipo flash de 2048 x 14. Possui duas portas, chamadas PORTA e PORTB.
Essas portas podem ser configuradas com diferentes funções com base nos bits de
configuração atribuídos no programa pela diretiva fuses.
O termo porta se refere a um grupo de pinos de um microcontrolador que podem ser
acessados ou escritos em conjunto.
Em grande parte dos microcontroladores, uma porta indica 8 pinos. Fisicamente, a porta é um
registrador dentro do microcontrolador que é conectado por fios aos pinos correspondentes. A
Tabela 1 apresenta as diferentes funções que as portas podem assumir no PIC16F628A.
Tabela 1 - Funções das portas do microcontrolador PIC16F628A
Nome Função Descrição
RA0/AN0
RA0 Porta de entrada/saída bidirecional
AN0 Entrada do comparador analógico
RA1/AN1
RA1 Porta de entrada/saída bidirecional
AN1 Entrada do comparador analógico
RA2/AN2/VREF
RA2 Porta de entrada/saída bidirecional
AN2 Entrada do comparador analógico
VREF Saída da VREF
RA3/AN3/CMP1 RA3 Porta de entrada/saída bidirecional
AN3 Entrada do comparador analógico
CMP1 Saída do comparador 1
RA4/T0CKI/CMP2
RA4 Porta de entrada/saída bidirecional
T0CKI Entrada de clock do Timer0
CMP2 Saída do comparador 2
RA5/MCLR/VPP
RA5 Porta de entrada
MCLR Reset principal
VPP Entrada de tensão de programação
RA6/OSC2/CLKOUT
RA6 Porta de entrada/saída bidirecional
OSC2 Saída do oscilador de cristal
CLKOUT
Saída CLKOUT, com 1/4 da frequência do
OSC1
RA7/OSC1/CLKIN RA7 Porta de entrada/saída bidirecional
OSC1 Entrada do oscilador de cristal
CLKIN Entrada da fonte de clock externa
RB0/INT
RB0 Porta de entrada/saída bidirecional
INT Interrupção externa
RB1/RX/DT
RB1 Porta de entrada/saída bidirecional
RX Pino de recepção USART
DT Entrada/saída de dados sincronizada
RB2/TX/CK
RB2 Porta de entrada/saída bidirecional
TX Pino de transmissão USART
CK Entrada/saída de clock sincronizada
RB3/CCP1
RB3 Porta de entrada/saída bidirecional
CCP1
Entrada e Saída do tipo
Captura/Comparação/PWM
RB4/PGM RB4 Porta de entrada/saída bidirecional
PGM
Pino de entrada de programação em baixa
tensão
RB5 RB5 Porta de entrada/saída bidirecional
RB6/T1OSO/T1CKI/PGC
RB6 Porta de entrada/saída bidirecional
T1OSO Saída do oscilador do Timer1
T1CKI Entrada de clock do Timer1
PCG Clock de programação ICSPTM
RB7/T1OSI/PGD
RB7 Porta de entrada/saída bidirecional
T1OSI Entrada do oscilador do Timer1
PGD Entrada e saída de dados ICSP
VSS VSS
Referência para os pinos de lógicae de
entrada/saída
VDD VDD Pino de alimentação positiva para os pinos
de lógica e entrada/saída
 Atenção! Para visualização completa da tabela utilize a rolagem horizontal
A Figura 13 mostra a pinagem do microcontrolador PIC16F628A com as diferentes funções que
pode assumir.
 
Imagem: Web Designer.
 Figura 13 – Pinagem do microcontrolador PIC16F628A.
A placa McLab1 é bem simples, possuindo dois displays de 7 segmentos, 8 leds, uma lâmpada
ligada à saída PWM e 4 pushbuttons, sem mostrador LCD. O microcontrolador PIC16F628A,
além de possuir somente duas portas, não possui conversor analógico-digital (ADC). Para
testar programas com estes periféricos deve ser utilizada a placa PICGenios, placa 4 do
simulador (Figura 14).
 
Imagem: Captura de tela do PICSimLab.
 Figura 14 – Placa PICGenios do simulador PICSimLab.
Com esta placa, vários testes podem ser realizados, utilizando sensores de temperatura,
ventoinha, buzzer, potenciômetros, além do mostrador LCD, mostrador de 7 segmentos, 16
LEDS e 19 pushbuttons. A placa trabalha com alguns modelos de microcontroladores PIC,
dentre eles o PIC18F4550.
A família PIC18 foi projetada para fornecer facilidade de uso, alto desempenho e integração
sem esforço com as famílias anteriores de 8 bits. Além dos módulos padrão encontrados no
PIC16 e nas famílias anteriores, o PIC18 inclui vários periféricos avançados, como CAN, USB,
Ethernet. Embora a série PIC16 tenha tido muito sucesso no mercado de microcontroladores,
ela também sofre de limitações e restrições, como pilha pequena e um único vetor de
interrupção. Conforme a complexidade, o tamanho da memória e o número de módulos
periféricos aumentam, as limitações da série PIC16 se tornam mais evidentes.
 VOCÊ SABIA
Na série PIC18, a Microchip reconsiderou suas regras de projeto PIC16 e produziu um
microcontrolador de estilo completamente novo, com um núcleo muito mais complexo,
enquanto limitava as alterações aos módulos periféricos. O PIC18F4550 possui até 13 canais
de ADC com 10 bits, 4 canais de PWM (modulação por largura de pulso), 4 temporizadores
(um de 8 bits e 3 de 16 bits), 32 kBytes de memória de programa, 35 pinos de entrada e saída
programáveis, além de 48 Mhz de oscilador externo.
O simulador PICSimLab está em frequente atualização, com novas placas experimentais sendo
adicionadas. Como possui código aberto, um grupo de contribuidores pode acrescentar novas
características e novas placas para facilitar o desenvolvimento com microcontroladores,
inclusive placas que não utilizam os microcontroladores PIC. Mesmo assim, ele não possui as
facilidades de integrar dispositivos externos às placas, como ocorre no simulador do Tinkercad.
De forma geral, os simuladores para microcontroladores têm evoluído e se tornado uma
alternativa muito boa para realizar testes com circuitos. O aparecimento de ferramentas
gratuitas com boa qualidade, como a Tinkercad e a PICSimLab aqui apresentadas, tende a
incentivar que os próprios fabricantes e equipes de consórcios de fabricantes empreendam
esforços para a implementação de novas ferramentas gratuitas de simulação. Mas, no
momento, a maioria dos simuladores para microcontroladores são versões pagas, que
dependem de licença, o que restringe seu uso ao ambiente profissional.
SIMULADOR PICSIMLAB
No vídeo a seguir, será apresentado o Simulador PICSimLab, mostrando todas as etapas
necessárias para se criar um projeto neste simulador.
VERIFICANDO O APRENDIZADO
1. QUANTOS PINOS EXISTEM EM CADA UMA DAS PORTAS DO
MICROCONTROLADOR PIC16F628A (PORTA E PORTB)?
A) 2 pinos
B) 6 pinos
C) 4 pinos
D) 8 pinos
E) 16 pinos
2. QUAL A EXTENSÃO DE ARQUIVO QUE O SIMULADOR PICSIMLAB
UTILIZA PARA PROGRAMAR AS SUAS PLACAS?
A) .exe
B) .bin
C) .bit
D) .hex
E) .txt
GABARITO
1. Quantos pinos existem em cada uma das portas do microcontrolador PIC16F628A
(PORTA e PORTB)?
A alternativa "D " está correta.
 
As portas são representadas por registradores dentro do microcontrolador e permitem que o
programa (firmware) controle o estado dos pinos ou, inversamente, leia o estado dos pinos se
eles estiverem configurados como entradas. Em microcontroladores de 8 bits, como o
PIC16F628A, as portas representam um conjunto bits, o que equivale a 8 pinos.
2. Qual a extensão de arquivo que o simulador PICSimLab utiliza para programar as suas
placas?
A alternativa "D " está correta.
 
A programação das placas no PICSimLab se utiliza de arquivos executáveis para
microcontroladores, que são criados pelo compilador com o código de máquina na extensão
.hex.
CONCLUSÃO
CONSIDERAÇÕES FINAIS
Discutimos as ferramentas para a programação de microcontroladores PIC e da plataforma
Arduino, que incluem a linguagem de programação C, o compilador e o ambiente de
programação. Definimos o uso de ferramentas de simulação para microcontroladores da família
PIC e da plataforma Arduino, demonstrando a importância destas em provas de conceito e
testes de dispositivos aplicáveis ao desenvolvimento de sistemas embarcados.
AVALIAÇÃO DO TEMA:
REFERÊNCIAS
OLIVEIRA, A. S. de.; ANDRADE, F. S. de. Sistemas Embarcados - hardware e firmware na
prática. 1. ed. São Paulo: Érica, 2010.
Monk, S. Programação com Arduino: começando com sketches. 1. ed. Porto Alegre:
Bookman, 2017.
Peckol, J. K. Embedded Systems: a contemporary design tool. 1. ed. New Jersey, USA:
Wiley, 2019.
ZANCO, W. da S. Microcontroladores PIC18 com Linguagem C - uma abordagem prática e
objetiva. São Paulo: Érica, 2010.
EXPLORE+
Para saber mais sobre os assuntos tratados neste tema, leia:
O artigo Ensino multidisciplinar de controle automático e microprocessadores, através de um
simulador de microcontrolador para o matlab.
O artigo Desenvolvimento de laboratório remoto utilizando módulo didático para ensino de
microcontroladores.
CONTEUDISTA
Marcos Santana Farias
 CURRÍCULO LATTES
javascript:void(0);

Outros materiais