Baixe o app para aproveitar ainda mais
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);
Compartilhar